timer0 atmega8

OP #2429560
Hallo zusammen,

ich bin mich gerade am Einarbeiten mit dem Atmega8 und habe folgendes 
Problemchen.
Wenn ich den Timer0 auf das Overflowflag abfrage ist alles in Butter.
Wenn ich aber das Timerzählregister abfrage komme ich nicht klar.

Danke im Vorraus
Harald

hier mein Problemkind:

//----------------------------------------------------------------------
// Titel     : Timer0 testen
//----------------------------------------------------------------------
// Funktion  : gelbe und grüne LED blinken mit Timer0 Flag bzw. 
Vergleich
// Schaltung : LED gelb an PC5, LED grün an PC4
//----------------------------------------------------------------------
// Prozessor : ATmega8  3.6864 MHz
// Sprache   : C
// Datum     : 22.11.2011
// Version   : test
// Autor     : hf
//----------------------------------------------------------------------
#define F_CPU 3686400
#include <avr/io.h>
//----------------------------------------------------------------------
#define LED_green_PC4_toggle PORTC ^= ( 1 << PC4 )
#define LED_yellow_PC5_toggle PORTC ^= ( 1 << PC5 )
//----------------------------------------------------------------------
//----------------------------------------------------------------------
void config_output(void)
{
  DDRC = ((1<<PC4) | (1<<PC5));  // Pins PCx als Ausgang
}
//----------------------------------------------------------------------
//------------ M A I N -------------------------------------------------
//----------------------------------------------------------------------

void main(void)
{
  uint8_t i=0,j=0;

  config_output();

  // Timer 0 konfigurieren
  TCCR0 |= (1<<CS00)|(1<<CS02);   // Timer 0 mit Prescaler 1024

                                  // (3686400/1024)/256 Hz = 14,0625Hz
                                  // bzw.  1/14,0625 s = 71,1 ms

  while (1)
  {
    // Variante 1 mit Overflow Flag

    if (TIFR & (1<<TOV0))    // das sieht so aus,
    {                        // als würde es richtig blinken ca. 1s

      TIFR |= (1<<TOV0);     // Overflow Flag mit "1" löschen
      i++;
      if (i>14)
      {
        i=0;
        LED_green_PC4_toggle;
      }
    }

    // Variante 2 mit Timerzählregister

    if (TCNT0==255)         // das blinkt zu schnell ca.0,6-0,7s
    {                       // wieso ???
      j++;
      if (j>14)
      {
        j=0;
        LED_yellow_PC5_toggle;
      }
    }
  }
}
//---------------------------------------------------------------------- 
--
Gast #2429613
Noch besser ist ein Timer 0 Interrrupt:


ISR (TIMER0_OVF_vect)             //
{
LED_yellow_PC5_toggle;
TCNT0 = 0;    // Die Null könnte man sich auch sparen, aber dann kann 
man hier auch andere Werte eingeben.
}


dann muss aber noch in der Initialisierung der Interrupt freigegeben 
werden:

  // Timer 0 konfigurieren
  TCCR0 |= (1<<CS00)|(1<<CS02);   // Timer 0 mit Prescaler 1024

                                  // (3686400/1024)/256 Hz = 14,0625Hz
                                  // bzw.  1/14,0625 s = 71,1 ms

sei();   // hier wird das gemacht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 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.