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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.