ATMega8 und OCI1B

#3375935
Lesenswert?

Hallo Leute,
ich stehe wohl gerade auf'm Schlauch, alle Suche und Probieren hat nix 
gebracht, dabei will ich was ganz einfaches machen:
Beim ATMega8 will ich den OCIE1B Interrupt auswerten, aber nix geht.

Ich will einen ziemlich genauen ms-Timer oranisieren, muß aber für die 
UART einen Quarz mit 7372800 Hz nutzen.
Am genauesten wird der 16Bit-Timer, den A-Part benötige ich für eine 
PWM, die jetzt auch zu gehen scheint.

Beim Initialisieren:

initTC1:

; B.1 als 16Bit-(fast)PWM
; OC1A=PortB,1    (OC1B= PortB,2 wird nicht benutzt!)
; TCCR1A=   COM1A1  COM1A0  COM1B1  COM1B0  FOC1A  FOC1B  WGM11  WGM10
;
; TCCR1B=  ICNC1  ICES1  -  WGM13  WGM12  CS12  CS11  CS10
  sbi  DDRB,1    ; Port B.1 muß als Ausgang gesetzt werden
  ldi  r16,0b10000010  ;COM1A1 & WGM11: Clear OC1A on compare match(Set 
Output to low level) Set OC1A at Bottom ;  0b10100000
  out  TCCR1A,r16
  ldi  r16,0b00011001  ;WGM13 & WGM12 & CS10: Fast PWM TOP=ICR1; Update 
OCR1A at Bottom; TOV1 Flag at Top  0b00010001
  out  TCCR1B,r16
...
  cli
; ICR1 ist TOP
  ldi  r16,0x7f
  out  ICR1H,r15
  out  ICR1L,r15
; OCR1A laden
  out  OCR1AH,r16  ; nur Startwert
  out  OCR1AL,r15
  ldi  r16, low(7373)
  ldi  r17, high(7373)
  out  OCR1BH,r17  ; Startwert für ms-Timer
  out  OCR1BL,r16
  in  r16,TIMSK
; Kanal A: kein Interrupt, alles über Hardware
; Kanal B nur OC-Interrupt
  ori  r16, 1<<OCIE1B
  out  TIMSK,r16
        ret

soweit, sogut - bei jedem Takt (Teiler 1) eins hochzählen, macht nach 
7372,8 Takten eine ms (oder liegt hier schon mein Problem?), gerundet 
sind das 7373 Takte.

; Millisekunden hochzählen
ms_Int:
...
  in  r16,OCR1BL
  in  r17,OCR1BH
  ldi  r18,low(7373)
  add  r16,r18
  ldi  r18,high(7373)
  adc  r17, r18
  out  OCR1BH,r17
  out  OCR1BL,r16

...
  reti
d.h., ich zähle bei jedem Interrupt den Compare-Wert um 7373 hoch. Macht 
er aber nicht. Der Interrupt kommt zwar, aber mit einem Fehler um den 
Faktor 8 zu langsam.
Den Simulator (AVR Studio 4) kann man an der Stelle vergessen.
Hat jemand eien Idee!!
Danke
#3375960
Lesenswert?

Matthias Büschel schrieb:
> Am genauesten wird der 16Bit-Timer, den A-Part benötige ich für eine
> PWM, die jetzt auch zu gehen scheint.
> ...
> d.h., ich zähle bei jedem Interrupt den Compare-Wert um 7373 hoch.

Geht nicht. Bei PWM-Modes sind die OC-Register doppelt gepuffert und der 
eigentliche Update des Registers erfolgt synchron zum Timer-Überlauf.

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