Forum: Compiler & IDEs Taster Abfrage - Anfängerproblem


von Dirk K. (Firma: ELK GmbH) (kiggster)


Lesenswert?

Hallo Leute,

ich hab vor kurzem die Ausbildungstelle gewechselt und beschäftige mich 
nun mit den AVR Controllern.

Habe hier ein Pollin EvoBoard bekommen mit dem ich erstmal etwas 
rumspielen kann.

Ich habe 2 Taster und 2 LED. Was ich eigentlich nur möchte ist: Wenn der 
Taster1 gedrückt ist soll die LED1 angehen und wenn er nochmal gedrückt 
wird soll er ausgehen. Das gleiche mit Taster2 und LED2. Die LED 
anzukriegen oder sie auch so lange anzukriegen wie einer der Taster 
gedrückt ist, ist kein Problem. Hier mein Code:
1
#include <avr/io.h>
2
3
4
int main()
5
{
6
/*Richtungsregister 01100000 nur die LED Ausgang(high) der Rest Eingang(low) -- DDRD = 0x60; */
7
8
  DDRD = _BV(PD6) | _BV(PD5);
9
    
10
11
  while(1)
12
  {
13
    
14
    if( bit_is_set(PIND, PIND2))
15
    {  
16
      
17
      //Wenn Taster1 gedrückt, LED1 an
18
      while(bit_is_set(PIND, PIND2))
19
      {
20
        PORTD |= (1<<PD5);
21
      }
22
      //LED1 wieder auschalten
23
      PORTD &= ~(1<<PD5);
24
    }
25
    else if(bit_is_set(PIND, PIND3))
26
    {  //Wenn Taster 2 gedrückt, LED2 an 
27
      while(bit_is_set(PIND, PIND3))
28
      {
29
        PORTD |= (1<<PD6);
30
      }
31
      //LED2 wieder ausschalten
32
      PORTD &= ~(1<<PD6);  
33
    }
34
35
    
36
    
37
38
39
  }
40
  return 0;
41
}


Wie zu sehen ist liegen die LED an PD5 und PD6 und die Schalter an PD2 
und PD3.

Nun will ich das ganze so umschreiben das LED1 an ist wenn man Taster1 
drückt und wieder ausgeht wenn man ihn erneut drückt.
Dazu werde ich mir irgendwie merken müssen ob der Schalter gedrückt 
wurde, nur leider hab ich momentan keine Ahnung wie man das macht.

Hat evtl einer von Euch einen Tipp dazu?

Hoffe das ist das richtige Forum dafür.

Danke und Gruß

kiggster

von Hubert.G (Gast)


Lesenswert?

PORTD ^= (1<<PD6); Exclusiv-Oder nennt man das.

Hubert

von Karl H. (kbuchegg)


Lesenswert?

Dirk Küppers wrote:

> Dazu werde ich mir irgendwie merken müssen ob der Schalter gedrückt
> wurde, nur leider hab ich momentan keine Ahnung wie man das macht.

Um sich Dinge zu merken, werden Variablen benutzt.

Nur: In diesem Fall bringt dir das nicht viel, weil es da
noch einen überlagerten Effekt gibt: Dein Taster werden prellen.
Und um das Prellen los zu werden, ist schon etwas (nicht viel)
Aufwand notwendig.

Guck mal hier:
http://www.mikrocontroller.net/articles/Entprellung

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.