Forum: Mikrocontroller und Digitale Elektronik Einfachstes Timer Beispiel


von Dirac-Impuls (Gast)


Lesenswert?

Hallo!


Ich möchte einfach nur einen Timer laufen lassen und nach einer 
bestimmten Zeit soll ein Ausgangspin invertiert werden.

Dazu habe ich mir dieses Tutorial angesehen: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#16-Bit_Timer.2FCounter

Wenn ich dies

#define   F_CPU 3686400
#include  <avr\io.h>


main ()
{
  TCCRA |= (1<<COM1A0);  // Das Signal am Pin OC1 wird invertiert 
(Toggle).

  while(true)
  {

  }
}

auf den Controller laden will kommt die Fehlermeldung

error: 'TCCRA' was not declared in this scope


Muss der Timer vorher noch initialisiert werden oder muss eine Header 
Datei eingebunden werden?


Vielen Dank!

von Oliver (Gast)


Lesenswert?

Schau ins Datenblatt von deinem Controller. Vermutlich heisst das 
Register
dort anders.

Oliver

von Dirac-Impuls (Gast)


Lesenswert?

Auf sowas hätt ich auch kommen können. Es hat nur eine 0 gefehlt. Vielen 
Dank schonmal!

So lässt es sich rüberspielen.

#define   F_CPU 3686400
#include  <avr\io.h>


main ()
{
  TCCR1A |= (1<<COM1A0);  // Das Signal am Pin OC1 wird invertiert 
(Toggle).

  while(true)
  {

  }
}


Dieses Programm macht leider noch nicht sonderlich viel. Ich versuche 
hier die ganze Zeit einen einfachen Timer einzustellen, komme aber mit 
den ganzen Registern nicht klar.

Ich würde mich sehr freuen, wenn mir jemand sagen könnte wie ich auf 
einem Pin ein Rechtecksignal mittels Timer ausgeben kann.

Der Toggle Mode ist ja bereits eingeschaltet. Soweit ich weiß muss ich 
ihm jetzt nurnoch sagen wie weit er bis zu einem Neustart zählen soll 
und dass der Timer überhaupt gestartet wird.


Könnte mir vielleicht jemand einen Tip geben um WELCHE Register es sich 
hier handelt die ich ansprechen muss? Was ich in die Register dann 
reinschreiben muss werd ich versuchen selbst rauszufinden.


Vielen Dank!

von Dirac-Impuls (Gast)


Lesenswert?

Es ist ein ATMEGA48 falls es jemanden interessiert.

von Gast (Gast)


Lesenswert?

TCCR1A und TCCR1B.

PS: Datenblatt ab Seite 131.

PPS: Mit drei Stunden Herumprobieren kann man sich oft 10 Minuten 
Datenblattstudium ersparen... ;-)

von Gast (Gast)


Lesenswert?

Schnellanleitung:

Am besten, Du betreibst den Timer im CTC-Mode, denn dann kannst Du die 
Togglefrequenz auf Deinen Wunschwert einstellen.

Für den CTC-Mode musst Du das Bit WGM12 in TCCR1B einschalten. Ticken 
tut der Timer, sobald Du seinen Prescaler mit den Bits CS12, CS11, CS10 
auf einen Wert ungleich Null setzt, also z. B. 1, 8, 64 etc.

Damit der OC1A-Pin toggelt, muss das COM1A0-Bit in TCCR1A gesetzt und 
der Pin über das DDR als Output konfiguriert sein.

Für den CTC-Modus musst Du zusätzlich noch in das OCR1A-Registerpaar 
(OCR1AH:OCR1AL) einen Wert schreiben, der Dir gefällt. Erreicht der 
Zählerstand des Timers diesen Wert, so wird der Timer sebsttätig 
zurückgesetzt (von der Hardware). Je kleiner der OCR1A-Wert ist, desto 
höher ist die resultierende Togglefrequenz (maximal Systemtakt/2 mit 
Prescaler = 1 und OCR1A = 0).

Viel Erfolg! :-)

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.