Hallo liebe Gemeinde, ist vermutlich eine blöde Anfängerfrage... ich möchte gern alle 5 sec prüfen, ob seit der letzten Prüfung eine fallende Flanke an INT0 vorlag. Ich möchte allerdings nicht die ISR für den INT0 nutzen. Im Simulator des AVR Studio 4.18 und 5 geht das auch prima. PINB1 schaltet alle 5 sec um, PINB0 nur wenn fallende Flanke vorlag. Die fallende Flanke wird am gesetzten Flag INTFR0 im EIFR Register erkannt. Wenn ich die hex in meinen Microcontroller übertrage, gibt es keine Reaktion auf die fallende Flanke die ich durch einen Taster auf GND simuliere. Kann mal bitte jemand auf meinen Codeschnipsel schauen ob ich hier vieleicht einen Denkfehler gemacht habe? Oder verhält sich der Mega168 in real anders als der Simulator? Vielen Dank im Voraus!
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | |
4 | #define CPU_CLOCK 3686400
|
5 | |
6 | ISR(TIMER1_COMPA_vect){ |
7 | if (bit_is_set(EIFR,INTF0)) |
8 | {
|
9 | EIFR|=(1<<INTF0); // write one for clear interrupt flag |
10 | PORTB^=(1<<PINB0); // change state of PINB0 |
11 | }
|
12 | PORTB ^=(1<<PINB1); // change state of PINB1 |
13 | };
|
14 | |
15 | int main(void) |
16 | {
|
17 | PORTD |=(1<<PIND2); // Pull up enable - PIN for external INT0 (button is low active) |
18 | EICRA |= (1<< ISC01); //INT request on falling edge |
19 | DDRB |= (1<<PINB0)|(1<<PINB1); // PB0, PB1 as output |
20 | |
21 | // configure timer0
|
22 | OCR1A = 18000; //OCR1A for 5 seconds |
23 | TCCR1B|= (1<<WGM12); //clear timer on match |
24 | TCCR1B|=(1<<CS10)|(1<<CS12); //scaler =1024 |
25 | TIMSK1|= (1<<OCIE1A); // enable Timer1 Compare match A ISR |
26 | sei(); |
27 | |
28 | // infinite loop
|
29 | while(1) |
30 | {
|
31 | asm("NOP"); |
32 | };
|
33 | }
|