Hallo Ich habe ein Stk500-Board und möchte gerne eine Programm schreiben welches beim betätigen des Schalter 0 die LED 0 leuchten lässt und bei Schalter 1 halt die LED 1 usw. Eine einfache Lösung habe ich schon durch rumspielen gefunden PORTD=PINB aber ich möchte es trotzdem zur Übung mit der switch-Anweisung machen kann mal einer drüberschauen? (Meine LEDS sind LOW Aktiv!) Es funktioniert nur der case 0xFC nicht #include <avr/io.h> int main(void) { DDRD= 0xFF; PORTD= 0xFF; PORTB =0xFF; while(1){ switch(PINB){ case 0xFE: PORTD&= ~((1<<PD0)); break; case 0xFD: PORTD&= ~((1<<PD1)); break; case 0xFC: PORTD&= ~((1<<PD2)); break; default: PORTD = 0xFF; break; } } }
Azubi schrieb: > Es funktioniert nur der case 0xFC nicht kann ja auch nicht gehen. Switch ist hier die falsche weg. Warum nicht IF verwenden? if (Taster1) { LED1 = 1; } else { LED1 = 0; }
Azubi schrieb: > Es funktioniert nur der case 0xFC nicht Gewöhn dir das gleich wieder ab. Man fragt nie den kompletten Port ab, sondern holt sich das eine Bit raus, an dem der Taster hängt. Alles andere ist Murks. if( ! ( PINB & ( 1<<PB0) ) ) // Taster an PB0 if( ! ( PINB & ( 1<<PB1) ) ) // Taster an PB1 Bitmanipulation
@Karl Heinz Buchegger Darf ich fragen wieso mal nie den ganzen Port abfragen sollte? (nicht böse gemeint sondern aus interess)
Grundsätzlich geht auch switch Nur ist der Wert für den 3ten Eingang falsch Schreibs mal binär, dann wirds klar: 11111110 0xFE 11111101 0xFD 11111011 0xFB Und damit bist du auch schon beim nächsten Problem: Was passiert wenn mehr als 1 Taste gedückt wird? Nichts! Dazu mußt du die Eingänge maskieren. Dazu ist IF() dann natürlich besser geeignet
Azubi schrieb: > @Karl Heinz Buchegger > > Darf ich fragen wieso mal nie den ganzen Port abfragen sollte? Weil du dann immer ALLE Möglichkeiten berücksichtigen müsstest. Egal was sonst noch so an diesem Port hängt. Dich interessiert aber nur der eine Taster. Also fragst du auch nur den ab. Die restlichen Portpins können machen was sie wollen, 0 oder 1 sein soviel sie wollen - du willst an dieser Stelle im Programm nur wissen, ob dieser EINE Pin 0 oder 1 ist - weil da der Taster drann hängt. Und nur dieser EINE Pin regelt, was die LED tun soll. Und für die nächste Kombination LED-Taster ist es dann eben ein anders Bit vom Port. Aber auch wieder nur EINES - alle anderen sind bei dieser konkreten Fragestellung nach dieser EINEN Led uninteressant. Um die willst du dich gar nicht kümmern müssen.
Azubi schrieb: > Darf ich fragen wieso mal nie den ganzen Port abfragen sollte? Weil Dich in diesem Fall nur das eine Bit interessiert. Das enthält die Information, ob der Schalter gedrückt ist oder nicht. Über die anderen Bits darfst Du keine Annahmen machen. Solange Du das Programm auf dem STK500 laufen lässt und an dem Port nur die Schalter hast von denen nur einer gleichzeitig gedrückt wird, funktioniert das Programm, weil die anderen Bits "zufällig" immer auf 1 stehen, so wie Du es erwartest. Vielleicht schließt Du aber später noch etwas anderes an den Port an und erweiterst das Programm. Dann ist eines der anderen Bits plötzlich nicht mehr ständig 1 sondern auch mal 0. Und dann geht die Abfrage des Schalters schief, obwohl das andere Bit überhaupt nichts mit dem Schalter zu tun hat.
Azubi schrieb: > Darf ich fragen wieso mal nie den ganzen Port abfragen sollte? Wenn Dich ein Pin von einem Byte interessiert, hast Du 128 Case mit Pin = 0 und 128 Case mit Pin = 1. Ich würde daher sagen, ein If/else ist einfacher zu schreiben, als 256 Case. Gehen tut prinzipiell aber beides. Peter
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.