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

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.

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.