Hallo, kann mir bitte bitte jemand helfen bei diesem Code den Fehler zu finden. Ich will einfach nur mit einem Taster an PB3 (ext. Pullupwiderstand) eine LED an PB3 einschalten über einen Interrupt. (Atmega32). Taster und LED funktionieren einwandfrei aber sobald ich mit Interrupts hantieren möchte läuft Garnichts mehr. (INT2). #define LED 3 #define Taster 2 #include <avr/interrupt.h> void init_int2(void) { MCUCSR |= (1<<ISC2); GICR |= (1 << INT2); //INT2 enable } int main(void) { DDRB = 0b00001000; sei(); Init_Timer(); //InitDisplay(); while(1) { PORTB &=~ (1<<LED); } } ISR (INT2_vect) { while (1) { PORTB |= (1<<LED); } }
Dann gilt noch, Taster und INTx passen i.A. nicht zusammen ! Verwende eine Tastenentprellung per Timerpoll alle z.B. 10ms. So etwas ist nicht wartbar und bringt Fehler mit sich.
1 | DDRB = 0b00001000; |
Generell müssen digitale Eingang auch als solche in einen Programm sichtbar sein und man muss auf korrekte Pegel low/ high achten. Standard Taster schalten nur zwei Pins, d.h. an einem Eingang wird dieser mit Masse verbunden. Sonst ist der digitale Wert des Eingangs unbestimmt.
HansDampf schrieb: > #define LED 3 > #define Taster 2 > #include <avr/interrupt.h> und bitte noch
1 | #include <avr/io.h> |
Timo N. schrieb: > Endlosschleife (while(1)) in ISR-Routine = böse Ja ich weiß, ist ja nur zum testen ob der Interrupt überhaupt auslöst. #include <avr/io.h> ist vorhanden. Habs beim rüberkopieren nur vergessen. "Wo ist die init_timer?" --> in einer extra c-Datei. Das mit dem entprellen werd ich gleich mal versuchen.
Karl M. schrieb: > Generell müssen digitale Eingang auch als solche in einen Programm > sichtbar sein und man muss auf korrekte Pegel low/ high achten. > > Standard Taster schalten nur zwei Pins, d.h. an einem Eingang wird > dieser mit Masse verbunden. > Sonst ist der digitale Wert des Eingangs unbestimmt. Durch den Pullupwiderstand hab ich doch definierte Pegel. Taster offen --> 5V, Taster gedrückt --> 0V. Das müsste passen. Aber wird einfach kein Interrupt ausgelöst.
HansDampf schrieb: > PORTB |= (1<<LED); Damit änderst du den Zustand der LED höchstens einmal. Wenn du toggeln möchstest: PORTB ^= (1<<LED); Vermutlich wird deine ISR aufgerufen, aber du bekommst es nie mit ;)
NurEinGast schrieb: > Kann es sein, dass init_int2 nicht augerufen wird. Ja irgendwie kommt es mir auch so vor. Beim Simulator springt er auch direkt in die while-schleife. Aber woran liegt das??
> Aber woran liegt das??
Na ja - daran, dass Du sie nicht aufrufst.
HansDampf schrieb: > NurEinGast schrieb: >> Kann es sein, dass init_int2 nicht augerufen wird. > > Ja irgendwie kommt es mir auch so vor. Beim Simulator springt er auch > direkt in die while-schleife. Aber woran liegt das?? Du musst init_int2 in main() schon selber aufrufen. Von alleine denkt sich der Compiler das nicht dazu. Das ist nicht Arduino ;-( Edit: jetzt bin ich der Dritte, aber sicher ist sicher ;-)
:
Bearbeitet durch User
Leute ihr seit der hammer. Vielen Dank. init_int2();--> genau das wars. Musste nur noch einen kleinen delay einbauen damit der Taster nicht schon beim "hochfahren" abgefragt wird und schon läuft es. Deswegen auch Eigenbau-Platine und kein Arduino denn nur so lernt mans halt. Jetzt kann ich endlich weiter basteln da ich weiß dass mein int2 funktioniert. Danke noch mal an alle.
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.