Forum: Mikrocontroller und Digitale Elektronik Anfängerproblem: Buttonabfrage funktioniert nicht


von Durokh (Gast)


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

von Fabian O. (xfr)


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.

von Durokh (Gast)


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...

von Jonas B. (jibi)


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

von Durokh (Gast)


Lesenswert?

Hm, das ist die Konsequenz, wenn man das Board von jemand anderen 
übernimmt, um damit mal zu üben. Du hast recht. Daran ist es 
gescheitert. Vielen Dank!

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.