Ich will ja nicht jammer, aber der Interrupt will einfach nicht funktionieren. Hier mal mal Sourceode zum gucken: #define CPU_CLOCK 8000000 // Frequenz in Hertz, ggf ändern #define UART_BAUD_RATE 9600 // Wir versuchen mal mit 9600 Baud #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include "lcd.c" #define RPM_PORT PORTA #define RPM_PIN 7 #define RPM_PINS PINA int main(void) { lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_puts("Starte \n200sx Timer..."); DDR(RPM_PORT) |= _BV(RPM_PIN); // RPM_PIN als Eingang schalten //enable_external_int ((1<<INT0)); //sei (); // Interrupts aktivieren DDRA |=0; GIMSK = 1<<INT1; // Interrupt von INT0 enablen MCUCR = 1<<ISC10 | 1<<ISC11; // Interrupt on rising edge for (;;) { if( RPM_PINS & (1<<RPM_PIN) ) { lcd_puts("Taste"); } } } SIGNAL (SIG_INTERRUPT0) { lcd_puts("TasteX"); outp (0xFF, DDRB); outp (0xCF, PINB); } Ich wäre um hilfe sehr dankbar
Das hab ich aber auch schon gemacht, ist halt noch ein teil drin ein teil auskommentiert. War nur mal so eine Version.
Sollte es nicht GIMSK = 1<<INT1 heissen? MCUCSR sollte auch gesetzt werden.
Bin mir jetzt nicht ganz sicher, aber ich denke, das hier sollte geklammert werden: >GIMSK = 1<<INT1; // Interrupt von INT0 enablen >MCUCR = 1<<ISC10 | 1<<ISC11; // Interrupt on rising edge So: GIMSK = (1 << INT1); // Interrupt von INT0 enablen MCUCR = (1 << ISC10) | (1 << ISC11); // Interrupt on rising edge Und natürlich sei(); nicht vergessen...
GIMSK = 1<<INT1; // Interrupt von INT0 enablen SIGNAL (SIG_INTERRUPT0) was denn jetzt eigentlich INT0 oder INT1 oder beides oder wie?? entscheide dich am besten mal für eine variante ;)
Hatte das gleiche Problem, wichtig sind die Rücksprungadressen für den Interrupt am Anfang des Programms wie schon beschrieben. ldi R17, 0b11000000 ; out GIMSK, R17 ;Externer Interrupt0 und 1 ldi R17, 0b00010000 ;Bit1 out MCUCR, R17 ;Externer Interrupt bei fallender Flanke sei ;Interrupts generell aktivieren Hier ist INT0 und INT1 aktiviert. 0b10000000 für INT und 0b01000000 für INT0. Beim setzen des MCUCR habe ich auch Probleme, die Daten stimmen nicht mit denen des Datenblattes überein. aber es läuft so für beide Interrupts. Es wäre interessant wenn mir jemand sagen könnte warum. Für INT0 lt. Datenblatt sollte es 0b00000010 sein, ist aber 0b00000100. Warum, darüber rätsel ich auch noch. Der Code wie oben läuft auf jeden Fall für INT0 und INT1, der Int wird eingeleitet mit der Fallenden Flanke. Viel Spaß beim ausprobieren
Mal etwas Allgemeines: Wenn man ASM programmiert muss man aufpassen, dass man die Interrupt-Sprungtabelle richtig anlegt. Hatte mal statt jmp-Befehlen rjmp benutzt, was nicht funktionierte. Das Problem lag daran, dass der Opcode von rjmp nut 16 Bit breit war, während jmp ganze 32Bit breit ist. Somit ist mein JMP für den Interrupt "nach oben gerutscht" und es wurde irgendwo in meine main-routine eingesprungen.
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.