Moin zusammen, hab da ein echt komisches Phänomen. Versuche mich gerade mit dem Pin Change Interrupt und habe natürlich das Datenblatt vorher gelesen. Bei diesem einfachen Code funktioniert der Pin Change Interrupt nur, wenn ich in der Main vor der Hauptschleife das blink Unterprogramm aufrufe. Lasse ich die Zeile mit dem Casus Knaxus weg, blinkt nichts ?! Sieht irgendwie so aus, als würde der Compiler die blink Funktion wegoptimieren. Es handelt sich hierbei um das Crumb644-Net und den WinAVR Portable (20090313). Ich raffs nicht mehr ... Hat von Euch jemand einen Tipp? Danke !
1 | /*
|
2 | * Chip type : ATMEGA 644
|
3 | * Clock frequency : External clock 20 Mhz
|
4 | |
5 | */
|
6 | |
7 | // ************************************************************************************************
|
8 | // Include Dateien laden
|
9 | // ************************************************************************************************
|
10 | #include <avr\io.h> //AVR Register und Konstantendefinitionen |
11 | #include <avr\interrupt.h> //AVR Interrupt Vektoren |
12 | #include <util\delay.h> |
13 | |
14 | //Funktionsprototypen
|
15 | void blink(void); |
16 | |
17 | int main(void) |
18 | {
|
19 | DDRD &= ~(1 << PD6); //Pin D6 als Eingang |
20 | DDRB = 0xFF; //Port B komplett als Ausgang |
21 | PCMSK3 |= (1 << PCINT30); //Pin D6 für Pin Change Interrupt in Maske 3 setzen |
22 | PCICR |= (1 << PCIE3); //Pin Change Interrupt Control Register - PCIE3 setzen für PCINT30 |
23 | |
24 | //blink(); // ************ CASUS KNAXUS ***************
|
25 | sei(); //Interrupts enablen |
26 | |
27 | while(1) |
28 | {
|
29 | |
30 | //Dauerloop
|
31 | |
32 | }
|
33 | }//Main |
34 | |
35 | ISR(PCINT0_vect) //Interrupt Service Routine |
36 | {
|
37 | cli(); //Interrupts disablen |
38 | blink(); //Einmal kurz blinken |
39 | sei(); //Interrupts wieder enablen |
40 | } //ISR |
41 | |
42 | void blink (void) //Blinkroutine |
43 | {
|
44 | PORTB |= (1<<PB6); |
45 | _delay_ms(100); |
46 | PORTB &= ~(1<<PB6); |
47 | } //toggle |