Hallo zusammen und Frohe Weihnachten erstmal. Das folgende Programm soll mit Taster1 die LED1 ansteuern, mit Taster2 die LED2 und mit Taster3 LED1 und LED2. Was ich gerne miteinbauen würde, aber nicht wirklich drauf komme ist, das wenn mehr als ein Taster gedrückt wird, also Taster1 und 2 oder Taster 1 und 3 oder Taster 2 und 3 oder alle drei taster zusammen, keine LED gehen soll. Das PRogramm sieht wie folgt aus: #include <avr/io.h> int main(void){ DDRD=0b11110000; while(1){ if(PIND&(1<<PIND2)) PORTD|=(1<<PD5); else PORTD&=~(1<<PD5); if(PIND&(1<<PIND3)) PORTD|=(1<<PD6); else PORTD&=~(1<<PD6); if(PIND&(1<<PIND4)) PORTD|=(1<<PD5)|(1<<PD6); else PORTD&=~(1<<PD5)|(1<<PD6); if(PIND&(1<<PIND2)&&(1<<PIND3) || (1<<PIND2)&&(1<<PIND4) || (1<<PIND3)&&(1<<PIND4)) PORTD&=~(1<<PD5)|(1<<PD6); } return0; } Der reine Teil wos ums anschalten geht Funktioniert bei mir. Einen fehler den ich gerade gefunden habe ist, das ich die Pins 0bis3 als eingang und die Pins 4 bis 7 als Ausgänge definiert habe, funktionieren tut das aber trozdem mit dem taster an PD4. Wieso? Also mir geht es um die letzte if bedingung. Ich kann mir denken, dass man das noch viel Professioneller schreiben kann, aber ich steh noch am Anfang, deshalb wäre ich um eine Professionelle schreibweise dankbar, aber nicht böse wenns auch nur einfach simpel gehen würde. Mfg und nen guten rutsch schonmal im Vorraus JEns
Für den Zweck eignet sich besser ein switch + case Konstrukt. switch(PIND){ //PD0 case 0x01: PORTD |= 0x01; break; //PD1 case 0x02: PORTD |= 0x02; break; //PD2 case 0x04: PORTD |= 0x04; break; .... default: PORTD = 0x00; } Allerdings baust du damit eine Priorität ein. Der erste Fall der zutrifft wird ausgeführt.
1 | #include <avr/io.h> |
2 | |
3 | #define KEY0 (1<<PD2)
|
4 | #define KEY1 (1<<PD3)
|
5 | #define KEY2 (1<<PD4)
|
6 | |
7 | #define LED0 (1<<PD5)
|
8 | #define LED1 (1<<PD6)
|
9 | |
10 | |
11 | int main() |
12 | {
|
13 | DDRD = LED0 | LED1; |
14 | for(;;){ |
15 | switch( PIND & (KEY0 | KEY1 | KEY2 )){ |
16 | case KEY0: PORTD |= LED0; |
17 | break; |
18 | |
19 | case KEY2: PORTD |= LED0; |
20 | |
21 | case KEY1: PORTD |= LED1; |
22 | break; |
23 | |
24 | default: PORTD &= ~(LED0 | LED1); |
25 | }
|
26 | }
|
27 | }
|
Peter
Michael schrieb: > Allerdings baust du damit eine Priorität ein. Der erste Fall der > zutrifft wird ausgeführt. Nö. Bei einem Switch müssen sich alle Case gegenseitig ausschließen, sonst kriegst Du vom Compiler was auf den Deckel. Peter P.S.: Ist es wirklich so schwer die Postingregeln (Formatierung) zu lesen?
Mach dir eine Wahrheitstabelle mit allen Eingaben und Ausgaben PIND4 PIND3 PIND2 Taster1 Taster2 Taster3 LED1 LED2 ====================================== 1 0 0 1 0 1 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 Dann quetschst du das ein ein großes Switch und fasst die identischen Fälle zusammen
1 | #include <avr/io.h> |
2 | |
3 | int main(void) |
4 | {
|
5 | DDRD = 0b11110000; |
6 | while (1) |
7 | {
|
8 | switch( (PINC & ((1<<PIND4)|(1<<PIND3)|(1<<PIND2))) ) |
9 | {
|
10 | case (1<<PIND4)|(0<<PIND3)|(0<<PIND2): |
11 | PORTD |= (1<<PD5); |
12 | PORTD &= ~(1<<PD6); |
13 | break; |
14 | case (0<<PIND4)|(1<<PIND3)|(0<<PIND2): |
15 | PORTD &= ~(1<<PD5); |
16 | PORTD |= (1<<PD6); |
17 | break; |
18 | case (0<<PIND4)|(0<<PIND3)|(1<<PIND2): |
19 | PORTD |= (1<<PD5); |
20 | PORTD |= (1<<PD6); |
21 | break; |
22 | // case (1<<PIND4)|(1<<PIND3)|(0<<PIND2):
|
23 | // case (1<<PIND4)|(1<<PIND3)|(1<<PIND2):
|
24 | // case (1<<PIND4)|(0<<PIND3)|(1<<PIND2):
|
25 | // case (0<<PIND4)|(1<<PIND3)|(1<<PIND2):
|
26 | // case (0<<PIND4)|(0<<PIND3)|(0<<PIND2):
|
27 | default:
|
28 | PORTD &= ~(1<<PD5); |
29 | PORTD &= ~(1<<PD6); |
30 | break; |
31 | }
|
32 | }
|
33 | }
|
Ich würde das dann eher über einen Tabellenzugriff lösen.
1.(einfach) den Port in eine Variable einlesen 2. und die definierten zustände abfragen, 3. else alles aus 4. dann neu einlesen (loop)
Hallo, vielen dank für die Informativen Antworten. Ich werde mir die alle gleich zu herzen nehmen und hintergründe dazu lernen. Und das mit den Formatierungsregeln tut mir leid. Habs gelesen und werde es beim nächsten mal zugunsten eurer Nerven beherzigen. Möchte ja einen angenehmen Kontakt mit euch Pflegen. Grüße und Danke Jens
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.