timer1 beim ATMEGA32, Register laden

Gast #808329
Lesenswert?

Ahoi,

kleine Frage, große Verzweiflung. Ich möchte beim ATMEGA32 den Timer1 
nutzen als 1ms Zeitquelle. Konfiguration wie folgt:

TCCR1A   = 0x00;
TCCR1B   = (1<<WGM12)|(1<<CS10);
OCR1AH   = 0x39;
OCR1AL   = 0x99;
TIMSK   |= (1<<OCIE1A);

bei 14,745610 Mhz funktioniert das.

Sobald ich aber OCR1A nicht direkt beschreibe, sondern einen 
errechnetrten Werte nehme, z.B

unit32_t mainclk = 14745610;

ocra_value = mainclk/1000
OCR1AH = ocra_value<<8;
OCR1AL = ocra_value;

dann ist die Timerfrequenz viel höcher. Kann mir das mal einer kurz 
erklären. Ich weiß gerade nicht weiter?

Eine Frage noch: Wenn ich schreibe #define MAINCLK 14745610, was ist 
dann MAINCLK für ein Datentyp, wenn ich MAINCLK beispielsweise irgendwo 
zum Rechneen verwende?

Danke, Alex
#808337
Lesenswert?

Alex wrote:

> ocra_value = mainclk/1000
> OCR1AH = ocra_value<<8;

andere Richtung schieben

  OCR1AH = ocra_value >> 8;

du willst ja an das High Byte ran

> OCR1AL = ocra_value;


Eigentlich müsste auch

  OCR1A = ocra_value;

funktionieren. Dann kümmert sich der Compiler um die
richtige Verteilung von High und Low Byte.

> Eine Frage noch: Wenn ich schreibe #define MAINCLK 14745610, was ist
> dann MAINCLK für ein Datentyp

gar keiner.
MAINCLK ist einfach nur ein Makro. Dort wo MAINCLK im Quelltext
vorkommt, wird es durch den Ersatztext 14745610 ersetzt.

> wenn ich MAINCLK beispielsweise irgendwo
> zum Rechneen verwende?

MAINCLK wird durch 14745610 ersetzt. In einer Berechnung hat diese
Konstante den Datentyp long, da sie für einen int zu groß ist
(auf dem AVR-gcc)

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