Timer0 Atmega32

OP #1823974
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);
 }
Gast #1823984
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
#1823991
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

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