Forum: Mikrocontroller und Digitale Elektronik Timer0 Overflow Interrupt


von Jakob (Gast)


Lesenswert?

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
}

von Thomas E. (thomase)


Lesenswert?

Jakob schrieb:
> TIMSK |= (1<<OCIE0);
> OCR0 = 255 - 1;

Dein Timer läuft bis 254, dann fängt der Controller bei Reset wieder an, 
da er keine ISR für den Interrupt findet. Der OVF-Int ist überflüssig.

mfg.

von Jakob (Gast)


Lesenswert?

Müsste der Controller nicht beim Überlauf in die ISR springen ?

ISR (TIMER0_OVF_vect)
{
   PORTA= 0xFF;
}

Bzw. wieso findet er die denn nicht ?

von Cyblord -. (cyblord)


Lesenswert?

Jakob schrieb:
> Müsste der Controller nicht beim Überlauf in die ISR springen ?
>
> ISR (TIMER0_OVF_vect)
> {
>    PORTA= 0xFF;
> }
>
> Bzw. wieso findet er die denn nicht ?

Was denkst du tut diese Zeile?

>  TIMSK |= (1<<OCIE0);

Sie aktiviert den Compare Interrupt. Hast du eine ISR dafür? Nein. Also 
springt er zum Reset Vektor. Dein Overflow Interrupt wird nie erreicht.

Warum aktivierst du Interrupts die du nicht willst und keine ISR dafür 
hast?

von Thomas E. (thomase)


Lesenswert?

Jakob schrieb:
> Müsste der Controller nicht beim Überlauf in die ISR springen ?
>
> ISR (TIMER0_OVF_vect)
> {
>    PORTA= 0xFF;
> }
>
> Bzw. wieso findet er die denn nicht ?

Der Timer ist im CTC-Mode. Du brauchst die COMP-ISR.

mfg.

von Jakob (Gast)


Lesenswert?

Cyblord ---- schrieb:
> Was denkst du tut diese Zeile?
>
>>  TIMSK |= (1<<OCIE0);
>
> Sie aktiviert den Compare Interrupt. Hast du eine ISR dafür? Nein. Also
> springt er zum Reset Vektor. Dein Overflow Interrupt wird nie erreicht.
>
> Warum aktivierst du Interrupts die du nicht willst und keine ISR dafür
> hast?

Danke, ist mir jetzt bewusst geworden. Danke werde es für die nächsten 
male mir merken.

Habe die Zeile deaktiviert.

mfg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.