Atmega32 Timer0 TCNT0 zählt nicht

Gast #1981521
Lesenswert?
• ▲
▼
Hallo,

suche verzweifelnd den Fehler in meinem Code...
Habe die Beiträge studiert, es gibt sogar ähnliche Beiträge, doch ich 
bekomme meinen Atmega 32 intern mit 8MHZ getacktet nicht zum laufen. Ich 
nutze Programmers Notepad mit einem Beispielmakefile welches früher für 
einen Atmega64 erzeugt wurde.
Viele andere Funktionen habe ich auf meiner Platine schon umgesetzt und 
zum laufen gebracht, somit gehe ich nicht von irgendwelchen Hardware 
fehlern aus.

Hier mein derzeitiger Testcode:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>  
3
#include <stdlib.h>       
4
#include <util/delay.h>
5
#include <stdio.h>
6

7

8
#include "macro.h"
9
#include "konstanten.h"
10
#include "lcd.h"
11

12

13
char txt[16];
14

15
////////////////////////////////////////////////////////////////////////////////
16
// TIMERINTERRUPT0
17
// wird alle 9,98ms durchlaufen 
18
ISR (TIMER0_COMP_vect)
19
{
20

21
  //toggle(PORTB,LED);
22
  out_h(PORTB,LED);
23
}
24

25
////////////////////////////////////////////////////////////////////////////////
26
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
27
// Timer 0 wird auf 9,98ms eingestellt
28
void timer0_init(void)
29
{
30
  // Vorteiler           |  No clock source  |  clk    |  clk/32  |  clk/64  |  clk/128  | clk/256  | clk/1024  
31
    TCCR0 |= (1<<CS02);    //  |  0        |  0     |  0    |    1  |     1  |    1  |  1
32
    TCCR0 |= (1<<CS01);    //  |  0        |   0    |  1    |    0  |     0  |    1  |  1
33
  TCCR0 |= (1<<CS00);    //  |  0        |  1     |  1    |    0  |     1  |    0  |  1
34

35
  // Der Compare Interrupt Handler Wird aufgerufen wenn TCNT0 mit OCR0 übereinstimmt
36
  //                |   OCR nutzen    |  Normal  |
37
  TCCR0 |= (1<<WGM01);    //  |  1        |  0
38
  TCCR0 &= ~(1<<WGM00);    //  |  0        |  0
39

40
  // Timer Interrupt Mask - TIMSK  |  Compare Interrupt  
41
  TIMSK |= (1<<OCIE0);  //  |  1
42
  
43
  OCR0 = 78; 
44
  // BSP.: (1 / (CLK / Vorteiler)) * OCR = Zeit 
45
  // BSP.: Zeit / (1 / (CLK / Vorteiler)) = OCR
46

47
}
48

49
int main (void) 
50
{   
51
  unsigned char test=88;
52
  unsigned char count=0;
53
  
54
  set_out(DDRB,LED); // LED auf der Platine als Ausgang 
55

56
  lcd_init();
57
  timer0_init();
58
  sei();        // Alle globalen Interruptquellen Einschalten 
59
  
60

61
  while(1)
62
  {
63
    if(test != TCNT0)
64
    {  
65
      test = TCNT0;
66
      count++;
67
      sprintf(txt,"%3d",count);
68
      lcd_setcursor(0,2);
69
      lcd_string(txt);
70
    }  
71

72
    sprintf(txt,"%3d   %3d",OCR0,TCNT0);
73
    lcd_setcursor(0,1);
74
    lcd_string(txt);
75
    lcd_baglight();
76
  }
77

78
     /* wird nie erreicht */
79
    return 0;       
80
}
Auf meinem Display steht folgendes:
78      0
1

somit gehe ich davon aus das TCNT0 nicht inkrementiert wird.
Woran liegt das?
Kann evtl. das makefile ein solches Problem aauslösen?
Ziel meiner Software soll es sein, einen ca. 10ms Interrupt auszulösen.

Vielen Dank für Eure Hilfe
Heiko
Persönliche Seite #1981740
Lesenswert?
• ▲
▼
> TCCR0 |= (1<<CS01);

Prüf das. Für den gewünschten Vorteiler 1024 ist das falsch.
Warum steht im Datenblatt bei der Tabelle der Prescalerwerte.

> OCR0 = 78;

Prüf das auch. 78 ergibt nicht die gewünschten 9.98 ms sondern 10.08 ms.
Warum steht in 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR#CTC-Betriebsart_.28Clear_Timer_on_Compare_Match.29

Wenn dann der Timer0 läuft, prüfe deine Programmlogik, denn
> if(test != TCNT0)
ist ziemlich oft erfüllt...

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.