Hallo!
möchte gerne einen Interrupt auslösen und die ISR starten wenn ich einen
Taster an PINC1 (PCINT9-Eingang) drücke. Soweit so gut, nur folgender
Code funktioniert nicht (Es läuft nur die Hauptschleife immer durch,
beim Tasterdruck passiert nichts) :
Der Interrupt, den du brauchst, heißt PCINT1, nicht INT1.
Und EICRA hat damit nichts zu tun.
Ist dir der Unterschied zwischen INTx und PCINTx, x=0,1,2 bekannt?
Guck mal ins Manual falls nicht.
Und du solltest auf keinen Fall Endlos-Schleifen in Interrupt-Routinen
legen,
sondern diese so kurz wie möglich halten. D.h. in der ISR nur ein Flag
setzen und dieses dann in einer Endlosschleife in main() auswerten.
So wie oben wird das nicht funktionieren.
Werner H schrieb:> Habe ich evtl noch ein paar Register nicht oder falsch konfiguriert?
EIMCR Flankenwahl gilt nur für die beiden INT0 und INT1 externen
Interrupts, der Pinchange Interrupt wird, wie der Name sagt, bei jedem
Polaritätswechsel ausgelöst -
Werner H schrieb:> ISR(INT1_vect)> {> while(1)> {> DDRD=0xFF;> _delay_ms(50);> DDRD=0x00;> _delay_ms(50);> }> }
Du schreibst eine ISR für INT1, möchtest aber PCINT1, das musst du
ändern. Ausserdem wird diese ISR nie wieder verlassen, und das möchtest
du auch nicht. Also:
Rainer B. schrieb:> Ist dir der Unterschied zwischen INTx und PCINTx, x=0,1,2 bekannt?> Guck mal ins Manual falls nicht.
Ja, ich kann mich aber irren: INTx ist der Vektor der auf ein bestimmte
Adresse zeigt und PCINTx ist der Eingangspin des uCs, mit dem ich
wahlweise einen INT0 oder INT1 auslöse. Kann mich aber irren, mein
Englisch ist eher mäßig...
Die while(1)-Schleife ist nur zum testen drin ob die ISR überhaupt
aufgerufen wird. Das ist aber nicht der Fall.
Ich meinte natürlich nicht EIMCR, sondern auch EICRA.
Werner H schrieb:> Ja, ich kann mich aber irren: INTx ist der Vektor der auf ein bestimmte> Adresse zeigt und PCINTx ist der Eingangspin des uCs, mit dem ich> wahlweise einen INT0 oder INT1 auslöse. Kann mich aber irren, mein> Englisch ist eher mäßig...
Du irrst dich. Der Mega168 stellt für jede 'Bank' von PC Interrupts
einen Vektor zur Verfügung, plus die beiden für INT0 und INT1:
Kapitel 12.2:
Table 12-1. Reset and interrupt vectors in ATmega48.
Vector no. Program address Source Interrupt definition
1 0x000 RESET
External pin, power-on reset, brown-out reset and watchdog system reset
2 0x001 INT0 External interrupt request 0
3 0x002 INT1 External interrupt request 1
4 0x003 PCINT0 Pin change interrupt request 0
5 0x004 PCINT1 Pin change interrupt request 1
6 0x005 PCINT2 Pin change interrupt request 2
7 0x006 WDT Watchdog time-out interrupt
8 0x007 TIMER2 COMPA Timer/Counter2 compare match A
9 0x008 TIMER2 COMPB Timer/Counter2 compare match B
10 0x009 TIMER2 OVF Timer/Counter2 overflow
11 0x00A TIMER1 CAPT Timer/Counter1 capture event
12 0x00B TIMER1 COMPA Timer/Counter1 compare match A
13 0x00C TIMER1 COMPB Timer/Coutner1 compare match B
14 0x00D TIMER1 OVF Timer/Counter1 overflow
15 0x00E TIMER0 COMPA Timer/Counter0 compare match A
16 0x00F TIMER0 COMPB Timer/Counter0 compare match B
17 0x010 TIMER0 OVF Timer/Counter0 overflow
18 0x011 SPI, STC SPI serial transfer complete
19 0x012 USART, RX USART Rx complete
20 0x013 USART, UDRE USART, data register empty
21 0x014 USART, TX USART, Tx complete
Matthias Sch. schrieb:> Du irrst dich. Der Mega168 stellt für jede 'Bank' von PC Interrupts> einen Vektor zur Verfügung, plus die beiden für INT0 und INT1:
Sorry, das habe ich überlesen. Danke für eure Tipps, jetzt läuft es.
Gruß,
Werner