Anfängerproblem: Buttonabfrage funktioniert nicht

Gast #3007086
Lesenswert?

HI Leute,
ich habe eine Anfängerfrage und ich glaube, da hakt es bei mir irgendwo 
im Grundlagenverständnis. Ich weiß aber nicht wo.

Ich arbeite mit einem atmega8 und habe daran eine LED und zwei Buttons 
angeschlossen.
Die LED soll nun einfach zur Übung leuchten, wenn eine der beiden 
Buttons gedrückt wird.

Wenn ich diesen Code nutze, klappt auch alles:
1
int
2
main (void)
3
{
4
   // Set Input (Button 1 und 2)
5
   PORTC = (1 << PC0) | (1 << PC1);  
6
   
7
   // Set output (LED)
8
   DDRB = (1 << DDB1);   
9
  
10
   while (1)
11
   { 
12
      if (PINC & (1 << PC0) )
13
      {
14
            PORTB |=  (1<<PB1);
15
      }      
16
      else
17
      {      
18
            PORTB &= ~(1 << PB1);       
19
      }     
20
   }
21
}

Füge ich allerdings die Abfrage für den zweiten Button ein, dann klappt 
gar nichts mehr:
1
while (1)
2
   { 
3
      if (PINC & (1 << PC0) )
4
      {
5
            PORTB |=  (1<<PB1);
6
      } 
7
      else if (PINC & (1 << PC1) )
8
      {
9
            PORTB |=  (1<<PB1);
10
      }
11
      else
12
      {      
13
            PORTB &= ~(1 << PB1);       
14
      }     
15
   }

Kann mir jemand verraten was ich falsch mache / falsch verstanden habe?
Beste Grüße
#3007108
Lesenswert?

Ich schätze mal, dass die logischen Zustände der Pins genau andersrum 
sind, als Du es erwartest. Die LED leuchtet, wenn der Pin auf 0 ist und 
ist aus, wenn er auf 1 ist. Der offene Button ergibt logisch 1 und der 
geschlossene eine logische 0.

In Deinem ersten Programm merkst Du das nicht, weil sich die zwei Fehler 
aufheben. Du bist nur immer genau im anderen Fall, als Du glaubst. In 
Deinem zweiten Programm dürfte die LED leuchten, wenn Du beide Buttons 
gleichzeitig drückst.

Das kannst Du ganz leicht überprüfen, indem Du im Programm mal nur die 
LED einschaltest, unabhängig von den Buttons.
Gast #3007135
Lesenswert?

Ok, stimmt, wenn ich die beiden Buttons drücke, dann klappts.
Dann stehe ich nun aber vollständig auf dem Schlauch.

Ich dachte, das hier setzt den Pin auf High und somit leuchtet meine 
LED.
1
PORTB |=  (1<<PB1);

Anstelle dessen schaltet es die LED aber aus.

Auf jeden Fall schonmal danke, und sorry, dass ich nach so langweiligen 
Sachen frage...
#3007162
Lesenswert?

Na, das liegt an der Verschaltung der Led. Sie ist wohl gegen VCC 
geschaltet und leuchtet somit nur wenn du deinen MC-Pin auf GND legst. 
Wenn du ihn auf VCC legst
mit "PORTB |=  (1<<PB1);" gibt es keinen Potentialunterschied 
(Spannung), wo keine Spannung da auch kein Strom, den die LED doch so 
gerne zum Leuchten nutzt.
P.S. unbedingt AVR Tutorials\Artikel hier durchlesen.
Gruß Jonas

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