Forum: Compiler & IDEs Atmega32 Timer0 TCNT0 zählt nicht


von Heiko (Gast)


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

von Stefan B. (stefan) Benutzerseite


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...

von Heiko (Gast)


Lesenswert?

Vielen vielen Dank @Stefan !
hatte mich, wie du angedeutet hast,  mit der Einstellung des Vorteilers 
vertan....

Gruß Heiko

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.