OCR1A Wert in Simulator falsch?

Gast #866615
Lesenswert?

Hallo,

bei meinen ersten Versuchen eine Mega8 mit gcc zu programmieren bin ich 
beim Simulieren auf folgendes Problem gestoßen:

Ich setze den OCR1A mit
1
OCR1A=400;

während der Simulation zeigt mir der AVR-Studio Simulator jedoch als 
OCR1A Wert 144, also genau 256 (8 Bit) zu wenig, an. Der gcc-Doku habe 
ich entnommen, dass das Schreiben des Low- und High-Byts automatisch 
geschieht.

Mache ich was falsch, muß ich noch irgendetwas einstellen oder stimmt 
etwas mit dem Simulator nicht?

Freue mich auf Eure Hilfe. Vielen Dank ... Jorge
Gast #866689
Lesenswert?

Okay, wer lesen kann ist klar im Vorteil, mega8. Ich ziehe die Frage 
zurück. Der Timer1 hat dort 16 bit, meine Vermutung eines 8 bit-timers 
ist also falsch (denn der könnte ja nur von 0-255 zählen).
#866823
Lesenswert?

Jörg Wunsch wrote:
> Vielleicht solltest du dir ja außer OCR1AL auch noch OCR1AH ansehen?
> Das Pseudo-16-Bit-Register gibt's nur für den Compiler, in Wirklichkeit
> sind es zwei 8-Bit-Register.
Der Simulator zeigt es zumindest im I/O-View aber komplett an (als ein 
Register). Ich weiß natürlich nicht, wo Jorge den angegebenen Wert 
gesehen hat...
Gast #867107
Lesenswert?

Hallo Jorge,

ehe wir hier weiter im Dunkeln tappen und das Problem nicht 
reproduzieren können: zeig doch mal bitte Deinen Code und die Ausgabe 
des Simulators. Welche Version verwendest Du?

Gruß

Fred
Gast #868299
Lesenswert?

Hallo,

Lutz hat mich auf die Idee gebracht nach einem 8/16 Bit Problem zu 
suchen...

Ich habe es im Setzen der TCCR1A mit CS00 gefunden:

Das war mein Code:
1
TCCR1A|=(1<<CS00);//Prescale 1
2
TCCR1B|=(1<<WGM12);//CTC
3
OCR1A=400;

aber mit TCCR1A|=(1<<CS00) setze ich den Timer scheinbar in den 8-Bit 
PWM Modus. So funktioniert´s jetzt:
1
TCCR1B|=(1<<CS00);//Prescale 1
2
TCCR1B|=(1<<WGM12);//CTC
3
OCR1A=400;

Vielen Dank nochmal für Eure Hilfe .... Jorge
Gast #868493
Lesenswert?

Hi Jorge,

>
1
> TCCR1A|=(1<<CS00);//Prescale 1
2
> TCCR1B|=(1<<WGM12);//CTC
3
> OCR1A=400;
4
>
CS00 ist ja auch kein Name eines Bits in TCCR1A, bezeichnet aber Bit0, 
so dass Dein Code identisch ist mit
1
TCCR1A|=(1<<WGM10); // PWM, phase-correct 8-bit mode !!!!

> aber mit TCCR1A|=(1<<CS00) setze ich den Timer scheinbar in den 8-Bit
> PWM Modus.
Genau, s.o.

>
1
> TCCR1B|=(1<<CS00);//Prescale 1
2
> TCCR1B|=(1<<WGM12);//CTC
3
> OCR1A=400;
4
>
Sei vorsichtig mit dem "Mischen" der Bit-Namen: CS00 gehört nicht zu 
TCCR1B. Das Ergebnis ist zwar das gleiche als wenn Du CS10 nimmst, aber 
man kann sich leicht Probleme (s.o.) einhandeln, wenn man die Bit-Namen 
nicht sauber trennt.

Gruß

Fred
Gast #868689
Lesenswert?

Das Problem scheint zwar gelöst, aber noch ein Wort dazu: Der Simulator 
im AVR Studio ist buggy und verhält sich in vielen Fällen nicht wie die 
echte Hardware - der Grund warum ich den Simulator so gut wie nie 
benutze.

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