hallo zusammen, ich habe diese programm geschrieben mit Interrupt, um ein LED ein/aus zuschalten. d.h wenn ich den taster drücke soll eingeschaltet wird und wenn ich den Taster nocheinmal drücke soll die LED ausgeschlatet wird. ich kann es nur einschalten aber auschalten gehts nicht. kann jemand mir schreiben was mir fehlt. vielen Danke #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> ISR(INT0_vect) { PORTA|=(1<<PA0); } int main(void) { // Schalte alle Pins von PortA als Ausgänge DDRA = (1<<PA0); DDRB &=~(1<<PB2); GIMSK = (1<<INT0); MCUCR = (1 << ISC01)|(1<<ISC00); sei(); while(1) { } if (bit_is_clear(PINB,2)) { PORTA &=~(1<<PA0); } return 0; }
Paulo_rock schrieb: > kann jemand mir schreiben was mir fehlt. und du kommst nie aus deiner while-Schleife
Justus Skorps schrieb: Danke für die Antwort > Paulo_rock schrieb: >> kann jemand mir schreiben was mir fehlt. > > ein richtiges Konzept... > > und du kommst nie aus deiner while-Schleife ich habe in while schleife if ( PINB & (1<<PINB2) ) { PORTA |= (1<<PA0); } if ( PINB & (1<<PINB2) ) / LED2 aus. { PORTA &= ~(1<<PA0); } aber hat nischts gebracht ich muss irgen wie zum main(9 zurück aber ich weisse es nicht wie.
Paulo_rock schrieb: > aber hat nischts gebracht natürlich nicht... schau dir doch mal deinen Code an und versuch zu erklären, was die Befehle machen, und nicht, was du dir beim schreiben gedacht hast...dann sollte dir auffallen, was nicht stimmt...
hi, du musst nich nach main zurück. Das mit der while(1) hat so seine richtigkeit. Aber muss der Rücksetzbefehl für dein Bit nicht so aussehen (bit_is_clear (PINB, PINB2)) { tu was }
Vor allen Dingen muss die Erkentnis her, dass der µC viel schneller arbeitet, als der Benutzer drücken kann. das hier
1 | while( 1 ) |
2 | {
|
3 | if ( PINB & (1<<PINB2) ) |
4 | {
|
5 | PORTA |= (1<<PA0); |
6 | }
|
7 | |
8 | if ( PINB & (1<<PINB2) ) / LED2 aus. |
9 | {
|
10 | PORTA &= ~(1<<PA0); |
11 | }
|
12 | }
|
wird bei gedrückter Taste viele tausend male abgearbeitet. Und da beide if-Bedingungen gleich sind, wird bei jeder Abfrage jeweils der Teil im if ausgeführt und der µC schaltet die LED ständig ein/aus, solange die Taste gedrückt ist. Einen Tastendruck nur einmal auszuwerten ist gar nicht so einfach wie man auf den ersten Blick glauben könnte. Vor allem auch deshalb, weil noch das Entprell-Problem dazu kommt. Daher: Rat an den TO Benutze 2 Tasten. Mit der einen schaltest du die LED ein, mit der anderen schaltest du sie wieder aus. Das vereinfacht die Programmierung zunächst enorm, auch wenn du das Thema Tastenauswertung und Entprellung nicht ewig vor dir herschieben kannst. Aber fürs erste geht es auch so.
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.