Hallo, ich wollte eine Overflow Interrupt mit dem Timer0 erzeugen, es
wird kein Interrupt erzeugt bzw. das was in der ISR Routine drinn steht
wird nicht ausgeführt. Ich habe es eigentlich wie im Tut gemacht und
meine Timer0 Routine ergänzt.
Atmega32
Wenn ich PORTA= 0xFF; so auf rufe bekomme ich mein High Signal.
1 | void start_timer0(uint8_t prescale0){
|
2 |
|
3 | TCCR0 = 0; //8bit Timer
|
4 |
|
5 | if (prescale0 == 0)
|
6 | {
|
7 | TCCR0 = (1<<CS00) | (1<<WGM01);
|
8 | }
|
9 |
|
10 | if (prescale0 == 1)
|
11 | {
|
12 | TCCR0 = (1<<CS01) | (1<<WGM01);
|
13 | }
|
14 |
|
15 | if (prescale0 == 2)
|
16 | {
|
17 | TCCR0 = (1<<CS01) |(1<<CS00) | (1<<WGM01);
|
18 | }
|
19 |
|
20 | if (prescale0 == 3)
|
21 | {
|
22 | TCCR0 = (1<<CS02) | (1<<WGM01);
|
23 | }
|
24 |
|
25 | if (prescale0 == 4)
|
26 | {
|
27 | TCCR0 = (1<<CS02) | (1<<CS00) | (1<<WGM01);
|
28 | }
|
29 |
|
30 |
|
31 | TIMSK |= (1<<OCIE0); //Timerinterrupt für Vergleich aktivieren
|
32 | OCR0 = 255 - 1; //Vergleichswert bis wohin er durchzählt zählt!(länge des Timers abhängig vom Prescaler)
|
33 | TIMSK |= (1<<TOIE0); // Timer Overflow Interrupt freischalten
|
34 | sei(); //Interrupt enable
|
35 |
|
36 | }
|
37 |
|
38 |
|
39 | void start_clock0(void)
|
40 | {
|
41 | start_timer0(0);
|
42 | }
|
43 |
|
44 |
|
45 |
|
46 | ISR (TIMER0_OVF_vect)
|
47 | {
|
48 | PORTA= 0xFF;
|
49 | }
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | ______________________________
|
57 |
|
58 | Main
|
59 |
|
60 | ______________________________
|
61 |
|
62 | #include <avr/io.h>
|
63 | #include <stdio.h>
|
64 | #define F_CPU 16000000UL
|
65 | #include "avr/interrupt.h"
|
66 |
|
67 | int main(void)
|
68 | {
|
69 | DDRA = 0xFF; //Deklaration 11110000 1=Ausgang 0=Eingang // X1-4a bis 7c
|
70 | DDRB = 0xFF;
|
71 | DDRC = 0xFF;
|
72 | DDRD = 0xFF;
|
73 |
|
74 | start_clock0(); // Timer0 + Overflow Interrupt
|
75 |
|
76 | while(1){
|
77 | }
|
78 | }
|