Timer0 Overflow Problem Atmega16

Gast #1517418
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
}
Gast #1517649
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.
Gast #1517707
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
#1517716
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren