Forum: Mikrocontroller und Digitale Elektronik OCR2 -> Wert von Timer2 wird nicht geschrieben in Simulation


von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

Hallo,

bin gerade dabei eine PWM mit dem Timer2 des Mega8 zu  erstellen. Das 
Problem ist, dass in der Simulation ( Avr-Studo 4.14) das Register OCR2 
nicht mit dem gewünschten Wert geladen wird. Nachfolgend der 
dazugehörige Quelltext meiner Initialisierungsroutine des Timers:
1
pwm_init:
2
3
  push akku
4
5
  ldi  akku,   0b01001000  ; fast PWM-Mode
6
  out  TCCR2,   akku
7
  ldi  reload_t2, 7        ; Reload-Wert für Timer
8
  out  TCNT2,   reload_t2
9
  ldi  akku,   0b11000000  ; Interruptfreigabe 
10
  out  TIMSK,   akku       ; ...für Overflow und Compare
11
  ldi  akku,   12          ; Comparewert laden
12
  out  OCR2,   akku
13
  
14
  pop akku
15
  reti

Hab ich da einen Programmierfehler drin? Oder ist das ein Bug des 
Simulators?

Gruß
Robert

von holger (Gast)


Lesenswert?

Ein "reti" gehört sicher nicht ans Ende von pwm_init:

von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

naja, das pwm_init: ist doch eine Routine und diese wird mit rcall 
irgendwo im Programm aufgerufen. Hat das was mit dem Problem zu tun?

Mittlerweile hab ich rausgefunden, das OCR2 so zu setzen geht
1
pwm_init:
2
3
  push akku
4
5
  ldi  akku,   12          ; Comparewert laden
6
  out  OCR2,   akku
7
  ldi  akku,   0b01001000  ; fast PWM-Mode
8
  out  TCCR2,   akku
9
  ldi  reload_t2, 7        ; Reload-Wert für Timer
10
  out  TCNT2,   reload_t2
11
  ldi  akku,   0b11000000  ; Interruptfreigabe 
12
  out  TIMSK,   akku       ; ...für Overflow und Compare
13
  
14
  
15
  pop akku
16
  reti

aber warum muss ich es vor der Initialsierung der fast-PWM, also setzen 
der Bits in TCRR2, machen???
Jetzt habe ich ja zum späteren Zeitpunkt gar nicht die Möglichkeit das 
OCR2 zu ändern, da ich ja diese Initialsierung nur einmal aufrufe und 
TCRR2 schon gesetzt ist...
Oder wie ist es möglich dann OCR2 zu ändern?

Gruß
Robert

von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

ok, jetzt hab ich es kapiert.

OCR2 wird immer nach dem ersten Zählerdurchlauf aktualisiert. Das heisst 
sobald ich den Zähler auf fast-PWM eingestellt habe muss der Zähler erst 
einmal komplett durchlaufen. Es sei denn ich setze OCR2 auf den Wert vor 
dem Setzen von TCCR2  ( hab ich übrigens erst falsch geschrieben).

@holger: ich hoffe du hast das mit "Hat das was mit dem Problem zu tun?" 
nicht böse aufgefasst ;-)

Gruß
Robert

von holger (Gast)


Lesenswert?

>@holger: ich hoffe du hast das mit "Hat das was mit dem Problem zu tun?"
>nicht böse aufgefasst ;-)

Nein, das war mir schon klar das das mit dem Problem
nichts zu tun hat. Fakt ist aber immer noch das "reti"
nur als return von einem Interrupt benutzt werden darf.

von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

ok, aber wie komme ich dann von rcall an die Aufrufstelle zurück?

Gruß
Robert

von holger (Gast)


Lesenswert?

>ok, aber wie komme ich dann von rcall an die Aufrufstelle zurück?

Lass das "i" für Interrupt weg.

von Gast (Gast)


Lesenswert?

Mit "ret"?

von Robert P. (Firma: ---) (ausmilkel)


Lesenswert?

ok, halt nur ret ;-) habs gefunden...
danke für die Info

Gruß
Robert

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.