www.mikrocontroller.net

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


Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include <avr/interrupt.h>  
#include <stdlib.h>       
#include <util/delay.h>
#include <stdio.h>


#include "macro.h"
#include "konstanten.h"
#include "lcd.h"


char txt[16];

////////////////////////////////////////////////////////////////////////////////
// TIMERINTERRUPT0
// wird alle 9,98ms durchlaufen 
ISR (TIMER0_COMP_vect)
{

  //toggle(PORTB,LED);
  out_h(PORTB,LED);
}

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

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

  // Timer Interrupt Mask - TIMSK  |  Compare Interrupt  
  TIMSK |= (1<<OCIE0);  //  |  1
  
  OCR0 = 78; 
  // BSP.: (1 / (CLK / Vorteiler)) * OCR = Zeit 
  // BSP.: Zeit / (1 / (CLK / Vorteiler)) = OCR

}

int main (void) 
{   
  unsigned char test=88;
  unsigned char count=0;
  
  set_out(DDRB,LED); // LED auf der Platine als Ausgang 

  lcd_init();
  timer0_init();
  sei();        // Alle globalen Interruptquellen Einschalten 
  

  while(1)
  {
    if(test != TCNT0)
    {  
      test = TCNT0;
      count++;
      sprintf(txt,"%3d",count);
      lcd_setcursor(0,2);
      lcd_string(txt);
    }  

    sprintf(txt,"%3d   %3d",OCR0,TCNT0);
    lcd_setcursor(0,1);
    lcd_string(txt);
    lcd_baglight();
  }

     /* wird nie erreicht */
    return 0;       
}
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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

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

Autor: Heiko (Gast)
Datum:

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

Gruß Heiko

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.