Forum: Mikrocontroller und Digitale Elektronik Tastenabfrage funktioniert nicht


von Andreas S. (xevious)


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;
  }

}
}

von bitte löschen (Gast)


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?

von Andreas S. (xevious)


Lesenswert?

DANKE DANKE, jetzt gehts. Das && wars wirklich!

Ich hab mich nach der AVR-GCC Anleitung gehalten, aber da hab ich über 
&& nichts gelesen (ansonsten toll verständlich).

von bitte löschen (Gast)


Lesenswert?

Gerne. :-)

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.