www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer0 Atmega32


Autor: Waldemar T. (bender007)
Datum:

Bewertung
0 lesenswert
nicht 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);
 }

Autor: spess53 (Gast)
Datum:

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

Autor: g457 (Gast)
Datum:

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

Autor: Simon Budig (nomis)
Datum:

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

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.