Forum: Mikrocontroller und Digitale Elektronik AtTiny25 Status zurücksetzetn


von Jonas W. (mf-fahrer)


Angehängte Dateien:

Lesenswert?

Nabend,
Ich möchte enen Taster auswerten und damit Relais schalten.
Jetzt blicke ich nicht dadurch, wo ich "oldstate" zurücksetzten muss. 
Könnt ihr mir helfen?


MfG
Jonas

von Peter II (Gast)


Lesenswert?

kannst du nicht einfach den Quelltext posten, dann könnte man ihn 
editieren.

von Jonas W. (mf-fahrer)


Lesenswert?

[c]bit oldstate;                   // Merker

void main()
{

     DDB0_bit = 0;              // Setze Eingang
     DDB1_bit = 1;              // Setzte Ausgang
     DDB2_bit = 1;              // SEtze Ausgang

     oldstate = 0;


do {
    if (Button(&PINB, 0, 1, 0)) {              // Taster abfagen
    oldstate = 1;
    }

    if (oldstate && Button(&PINB, 0, 1, 1)) {

    PORTB = PORTB | (1 << DDB1);               // Relais 1 ein
    Delay_ms(2000);
    PORTB = PORTB | (1 << DDB2);               // Relais 2 ein
    Delay_ms(2000);
    DDB2_bit = 0x00;                           // Relais 1 aus
    Delay_ms(2000);
    DDB1_bit = 0x00;                           // Relais 2 aus
    }

    } while(1);

} [c]

von Peter II (Gast)


Lesenswert?

ich würde sagen so:
1
bit oldstate;                   // Merker
2
3
void main()
4
{
5
6
     DDB0_bit = 0;              // Setze Eingang
7
     DDB1_bit = 1;              // Setzte Ausgang
8
     DDB2_bit = 1;              // SEtze Ausgang
9
10
     oldstate = 0;
11
12
13
do {
14
    if (Button(&PINB, 0, 1, 0)) {              // Taster abfagen
15
    oldstate = 1;
16
    }
17
18
    if (oldstate && Button(&PINB, 0, 1, 1)) {
19
20
       PORTB = PORTB | (1 << DDB1);               // Relais 1 ein
21
       Delay_ms(2000);
22
       PORTB = PORTB | (1 << DDB2);               // Relais 2 ein
23
       Delay_ms(2000);
24
       DDB2_bit = 0x00;                           // Relais 1 aus
25
       Delay_ms(2000);
26
       DDB1_bit = 0x00;                           // Relais 2 aus
27
       oldstate  = 0;
28
       }
29
30
    } while(1);
31
32
}

von Jonas W. (mf-fahrer)


Lesenswert?

Das klappt nicht. Das programm läuft dann einmal durch und dann ist 
Ende. Es sollaber öfter klappen.

von Peter II (Gast)


Lesenswert?

Jonas W. schrieb:
> Das klappt nicht. Das programm läuft dann einmal durch und dann ist
> Ende. Es sollaber öfter klappen.

keine Ahnung was du Funktion
1
Button(&PINB, 0, 1, 1)

macht, gibt es dafür eine Doku?

Vermutlich brauchst du nicht mal deinen Merker.

von Jonas W. (mf-fahrer)


Lesenswert?

Der Button an Port B0 hat Standartmäßig ein 1 Signal und bekommt ein 0 
Signal.

von Peter II (Gast)


Lesenswert?

Jonas W. schrieb:
> Der Button an Port B0 hat Standartmäßig ein 1 Signal und bekommt ein 0
> Signal.

irgendwie ist der code merkwürdig.
1
PORTB = PORTB | (1 << DDB1);

wenn du es damit einschaltet, warum wird es dann komplett anders 
ausgeschalter?
1
DDB2_bit = 0x00;

du schaltet damit den Port auf Eingang und nicht den Ausgang aus!!

von Jonas W. (mf-fahrer)


Lesenswert?

[c]
bit oldstate;                   // Merker

void main()
{

     DDB0_bit = 0;              // Setze Eingang
     DDB1_bit = 1;              // Setzte Ausgang
     DDB2_bit = 1;              // SEtze Ausgang

     oldstate = 0;


do {
    if (Button(&PINB, 0, 0, 1)) {              // Taster abfagen
    oldstate = 1;
    }

    if (oldstate && Button(&PINB, 0, 0, 0)) {

       PORTB = PORTB | (1 << DDB1);               // Relais 1 ein
       Delay_ms(2000);
       PORTB = PORTB | (1 << DDB2);               // Relais 2 ein
       Delay_ms(2000);
       PORTB = PORTB | (0 << DDB2);               // Relais 1 aus
       Delay_ms(2000);
       PORTB = PORTB | (0 << DDB1);               // Relais 2 aus
       oldstate  = 0;
       }

    } while(1);

}
[c]



So schaltet er garkeine Relais mehr aus. Nurnoch ein.

von Peter II (Gast)


Lesenswert?

Jonas W. schrieb:
> So schaltet er garkeine Relais mehr aus. Nurnoch ein.

ja weil man so auch kein bit löschen kann!

1
void main()
2
{
3
4
     DDB0_bit = 0;              // Setze Eingang
5
     DDB1_bit = 1;              // Setzte Ausgang
6
     DDB2_bit = 1;              // SEtze Ausgang
7
8
     do {
9
          if ( Button(&PINB, 0, 0, 0)) {
10
             PORTB |= (1 << DDB1);               // Relais 1 ein
11
             Delay_ms(2000);
12
             PORTB |= (1 << DDB2);               // Relais 2 ein
13
             Delay_ms(2000);
14
             PORTB &= ~(1 << DDB2);               // Relais 1 aus
15
             Delay_ms(2000);
16
             PORTB &= ~(1 << DDB1);               // Relais 2 aus
17
          }
18
    } while(1);
19
}

von Jonas W. (mf-fahrer)


Lesenswert?

Ahhhhhh, jetzt klappt es. War falsch geschrieben.
Danke :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.