Forum: Mikrocontroller und Digitale Elektronik Timer0 Atmega32


von Waldemar T. (bender007)


Lesenswert?

Hallo,

ich habe eine Frage zu MC-Programmierung. Also ich bin der Anfänger in 
dieser Sache. Wollte mal mit 8 Bit Timer mich auseinandersetzten.
Ich wollte das eine LED in 10 sek. sich schaltet. Ich habe Timer0 so 
initialisiert, laut Datenblatt war eine Formel mit die ich ein OCRR0 
Wert ermittelt habe -für eine Millisikunde soll der Wert bei OCR0=125-1 
liegen. Mit Hilfe der Integer wert habe ich dann diese Millisekunden 
gespeichert. NAch der überprüfung mit einer Stopuhr stellte sich 
heraus,dass der Wert nich mit 10 sek übereinstimmt, sondern mit 5 sek. 
Wie kann dass man erklären? Man Quellqode sieche unten:


#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL


//Variablen fu"r die Zeit
volatile unsigned int  millisekunden;
volatile unsigned int sekunde;
volatile unsigned int minute;
volatile unsigned int stunde;

// Bitmanipulation
//x = Port     y = Pin
#define BitSetzen(x,y)       (x|=(1<<y))        //Bit setzen
#define BitLoeschen(x,y)  (x&=~(1<<y))    //Bit loeschen
#define TestBit(a,b)         (a&(1<<b))        //Bit Zustand lesen

int main(void){

//Initilisation der LEDs Port
PORTA = 0xFF;
DDRA = 0xFF;
//
  // Timer 0 konfigurieren
  TCCR0 = (1<<CS00)|(1<<CS01)|(1<<WGM01); // CTC Modus+ prescaller 64
  OCR0 = 125-1;
   // Compare Interrupt erlauben
  TIMSK |= (1<<OCIE0);

  // Global Interrupts aktivieren
  sei();

  while(1)
  {

  }
}


SIGNAL(SIG_OUTPUT_COMPARE0)

{
  millisekunden++;
  if (millisekunden==10000) BitLoeschen(PORTA,PIN0);
 }

von spess53 (Gast)


Lesenswert?

Hi

Ein 8Bit-Timer hat bei Vorteiler 64 und 16MHz eine Overflow-Time von 
512µs. Damit kannst du keine 1 ms erreichen.

MfG Spess

von g457 (Gast)


Lesenswert?

> #define F_CPU 16000000UL
[..]
>   TCCR0 = (1<<CS00)|(1<<CS01)|(1<<WGM01); // CTC Modus+ prescaller 64
>   OCR0 = 125-1;

F_CPU /prescaler /(OCR +1) == 16MHz /64 /(125 -1 +1) == 2000

Also 2000 Interrupts pro Sekunde oder eben alle 0.5ms.

HTH

von Simon B. (nomis)


Lesenswert?

Die Formel auf die Du Dich vermutlich beziehst, ist in meinem Datenblatt 
beschrieben als "The waveform frequency is defined by the following 
equation:"

  f_OCnx = f_clkI/O / (2 · N · (1 + OCRnx))

Beachte, dass das die Formel ist, um die Freqenz der nach der darüber 
beschriebenen Methode erzeugten Wellenform zu berechnen. Die Wellenform 
beinhaltet aber zwei (gleichlange) Perioden mit Pegel 1 resp. 0, 
zwischen denen bei einem Timerinterrupt getoggelt wird.

D.h. pro Wellenform hast Du zwei Interrupts, die Interrupts fallen 
also mit der doppelten Frequenz an.

Viele Grüße,
        Simon

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.