Hallo,
ich verwende den ATmega32 und würde gerne über einen Timer einen
Interrupt auslösen. Da es dabei Probleme gibt, habe ich das Programm
zunächst reduziert - die Interrupt-Funktion ist zunächst leer.
Der folgende Code sollte den Timer und den Interrupt entsprechend
einstellen und anschließend Port B zunächst auf 0x0F und anschließend
auf 0xF0 stellen und dann verharren. An Port B sind zu Testzwecken LEDs
angeschlossen.
1 | #include "main.h"
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | int main()
|
6 | {
|
7 | TCCR0 = (1 << WGM01); //CTC Modus
|
8 | TCCR0 |= (1 << CS02) | (0 << CS01) | (1 << CS00); //Prescaler
|
9 | OCR0 = 255; //Output Compare Register 0
|
10 | TIMSK |= (1 << OCIE0); //Compare Interrupt erlauben
|
11 |
|
12 | DDRB = 0xFF;
|
13 |
|
14 | sei(); // Global Interrupts aktivieren
|
15 | PORTB = 0x0F;
|
16 | _delay_ms( 10 );
|
17 | PORTB = 0xF0;
|
18 |
|
19 | while(1);
|
20 | }
|
21 |
|
22 | ISR(TIMER0_COMPA_vect)
|
23 | {
|
24 | }
|
Starte ich den ATmega32, so flackern die LED 0-3 und 4-7 abwechselnt.
Daraus schließe ich, dass der Mikrocontroller ständig neugestartet wird,
ansonsten würde die LEDs nicht flackern, sondern einige leuchten und
einige aus sein. Kommentiere ich "TIMSK |= (1 << OCIE0);" oder "sei();"
aus, so funktioniert dies korrekt. Deshalb denke ich, dass der Interrupt
schuld sein muss. Kann mir jemand sagen, was ich falsch mache? (Im AVR
Studio Simulator scheint er auch immer wieder zu resetten.)
Gruß
Ben
P.S.: STK 500 + AVRISP mkII (3.6864MHz Quarz)