Tastenabfrage funktioniert nicht

OP #2217931
Lesenswert?

Hi!

Bin nach wie vor Anfänger und hab eine kurze Frage:

Ich hab vor, die Blinker von meinem Motorrad mit Tastern ein- und 
auszuschalten (mit ATTiny 2313). Das Blinken hab ich noch nicht drin.

Einschalten der Blinker über die jeweiligen Richtungstasten (hier 
Eingang PB0 und PB1).
Ausschalten über einen Tastendruck einer beliebigen Taste (von den 2).
Ich hab 4 Zustände abgefragt (Blinker ein: Taste drücken, Taste 
loslassen, Blinker aus: Wieder Taste drücken, Taste loslassen)

Problem:

Einschalten geht mit beiden Tastern wie erwartet, aber ausschalten kann 
ich nur über den Eingang PB0.

Warum?

Danke!!



#include <avr/io.h>
volatile int i=0;
int main (void){
  DDRB=0x00;
  PORTB=0xfc;
  DDRD=0xff;
  PORTD=0x00;
while(1){

if (i==0){ //BLINKER EIN
  if (PINB & (1<<PB0)){
    PORTD |= (1<<DDD0);
    i=1;
    }
  if (PINB & (1<<PB1)){
    PORTD |= (1<<DDD1);
    i=1;
    }
}

if ((i==1)&(!(PINB&0x03))){//Taster los1
  i=2;
  }

if ((i==2)&(PINB&0x03)){//BLINKER AUS
  PORTD &= ~((1<<PD0)|(1<<PD1));
  i=3;
  }

if ((i==3)&(!(PINB&0x03))){//Taster los2
  i=0;
  }

}
}
Gast #2217939
Lesenswert?

Mach es doch mal hübsch, und ein paar Kommentare dazu. So z.B.:
1
#include <avr/io.h>
2

3
volatile int i=0;
4

5
int main (void)
6
{
7
  DDRB=0x00;
8
  PORTB=0xfc; // Keine Pullups an den beiden Eingängen
9
  DDRD=0xff;
10
  PORTD=0x00; // Blinker anfangs aus
11
  while(1)
12
  {
13
    if (i==0) // Blinker ist aus
14
    { // Prüfe auf BLINKER EIN
15
      if (PINB & (1<<PB0)) // Taste links gedrückt
16
      {
17
        PORTD |= (1<<DDD0); // Linken Blinker an
18
        i=1;        // An-Flag setzen
19
      }
20

21
      if (PINB & (1<<PB1)) // Taste rechts gedrückt
22
      {
23
        PORTD |= (1<<DDD1); // Rechten blinker (auch!) an
24
        i=1;
25
      }
26
    }
27

28
    // Wenn Ein Blinker an ist, und keine Blinker-Taste gedrückt ist, 
29
    // setze i = 2
30
    // if ((i==1) & (!(PINB&0x03))) // Resultat abhängig von Compiler 
31
    //  (TRUE immer gleicher Zahlenwert?)
32
    // Besser:
33
    if ((i==1) && (!(PINB&0x03)))
34
    { //Taster los1
35
      i=2;
36
    }
37

38
    // Wenn i == 2 ist (Blinker ist an, und alle Tasten wurden schon
39
    // wieder losgelassen) und wenn keine Taste mehr gedrückt ist, 
40
    // dann Schalte Blinker wieder aus und setze i = 3.
41
    // if ((i==2) & (PINB&0x03)) // Siehe oben
42
    if ((i==2) && (PINB&0x03))
43
    {//BLINKER AUS
44
      PORTD &= ~((1<<PD0)|(1<<PD1));
45
      i=3;
46
    }
47

48
    // Wenn i == 3 ist, und keine Taste gedrückt ist, 
49
    // wurde der Blinker ausgeschaltet, und es geht wieder von vorne los
50
    // if ((i==3) & (!(PINB&0x03))) // Siehe oben
51
    if ((i==3) && (!(PINB&0x03)))
52
    {//Taster los2
53
      i=0;
54
    }
55
  }
56
}

Was passiert, wenn Du die Änderungen bezüglich & und && übernimmst?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren