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

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