Forum: Mikrocontroller und Digitale Elektronik Timer0 Overflow Problem Atmega16


von Vladimir (Gast)


Lesenswert?

Irgendwie kriege ich es nicht hin ein den Timer0 Overflow richtig zu 
benutzen mit einen Atmega8 funktionierte es. Mit mega16 nicht mehr.

Ich habe jetzt das Programm auf den Timer0 reduziert und sehe den Fehler 
immer noch nicht.
Der Timer zählt hoch bis 255 und fängt wieder von vorne an aber 
ISR(TIMER0_OVF_vect) wird nicht ausgeführt. Die Variablen lass ich am 
Display anzeigen.

Am PB0 liegt ein Rechtecksignal von ca. 60 kHz an den der Timer auch 
zählt.

Kann jemand bitte kurz drüberschauen.

STK500, Quarz intern 8MHz schein alles in Ordnung eingestellt zu sein.
1
#include <avr/io.h>
2
#include "lcd.h"
3
#include <avr/interrupt.h>
4
#include <stdlib.h>
5
6
char Buffer[20];
7
volatile unsigned char x = 0;
8
9
ISR(TIMER0_OVF_vect) //Timer0 Interrupt
10
{
11
    x++;
12
}
13
14
int main(void)
15
{
16
    lcd_init(LCD_DISP_ON);  
17
  lcd_clrscr();
18
19
  TCCR0 |= (1<<CS00 | 1<<CS01 | 1<<CS02); 
20
  TCNT0 = 0; 
21
  TIMSK |= (1 << TOIE0);
22
  sei();
23
24
    while(1)
25
    {
26
    itoa( TCNT0, Buffer, 10 ); 
27
    lcd_gotoxy(0,0);
28
    lcd_puts(Buffer);
29
    
30
    itoa( x, Buffer, 10 ); 
31
    lcd_gotoxy(0,2);
32
    lcd_puts(Buffer);
33
  }
34
}

von Uwe (Gast)


Lesenswert?

Hi!
>TCCR0 |= (1<<CS00 | 1<<CS01 | 1<<CS02);
= External Clock Source on T0 Pin, Clock on rising edge
So gewollt und Clock angelegt?

Viel Erfolg, Uwe

von Vladimir (Gast)


Lesenswert?

ja, am Display sehe ich ja dass TCNT0 hoch zählt. Das ist ja was ich 
nicht verstehe obwohl Timer läuft wird ISR ignoriert.

von Edi (Gast)


Lesenswert?

Am Code habe ich auch nichts Ungewöhnliches entdeckt. Aber wenn Du mit 
60 kHz taktest, kannst Du den Timer (bzw. den Wert von TCNT0 am LCD) 
nicht mehr hochzählen sehen. x müsste mit einer Frequenz von 234 Hz 
hochgezählt werden, das könnte man noch sehen (fast 1 Durchlauf pro 
Sekunde). Kann es nicht sein, dass Du am LCD x anschaust und für TCNT0 
hältst? Schreib doch mal x-- in die ISR, nur zum Ausprobieren.

von Vladimir (Gast)


Lesenswert?

Hallo Edi,

Hast natürlich recht, TCNT0 läuft so schnell das man es kaum sieht, 
außer man drückt reset und das Display friert ein, dann kann mans 
ablesen. Nur var. „x“ ist immer gleich null.

Ich lass beides gleichzeitig anzeigen:
1
    while(1)
2
    {
3
    itoa( TCNT0, Buffer, 10 ); 
4
    lcd_gotoxy(0,0);
5
    lcd_puts(Buffer);
6
    
7
    itoa( x, Buffer, 10 ); 
8
    lcd_gotoxy(0,1);
9
    lcd_puts(Buffer);
10
  }

Gruß Vladimir

von Stefan E. (sternst)


Lesenswert?

Vladimir schrieb:
> Irgendwie kriege ich es nicht hin ein den Timer0 Overflow richtig zu
> benutzen mit einen Atmega8 funktionierte es. Mit mega16 nicht mehr.

Und übersetzt und linkst du den Code jetzt auch wirklich für den Mega16? 
Die verwendeten Register liegen nämlich auf den gleichen Adressen, so 
dass der Zähler trotzdem laufen sollte, auch wenn du weiterhin den Mega8 
eingestellt hast. Der Interrupt würde aber nicht gehen, weil der Mega16 
2-Word-Vektoren hat (der Mega8 nur 1-Word-Vektoren).

von Vladimir (Gast)


Lesenswert?

Das ist es!

Project Configuration war natürlich die alte (von atmega8)

Vielen Dank Stefan, und alle anderen.

In solchen Momenten könn’t ich mich ohrfeigen.


Gruß Vladimir

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.