Forum: Mikrocontroller und Digitale Elektronik ATMega8 und OCI1B


von Matthias B. (matze_56)


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

von Stefan E. (sternst)


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.

von Matthias B. (matze_56)


Lesenswert?

Danke,
auch wenn es mein Problem nicht löst, so weiß ich nun wenigstens 
weshalb.

von m.n. (Gast)


Lesenswert?

Matthias Büschel schrieb:
> Der Interrupt kommt zwar, aber mit einem Fehler um den
> Faktor 8 zu langsam.

Faktor 8 sieht nach irgendeinem aktiven Vorteiler aus.

von m.n. (Gast)


Lesenswert?

Matthias Büschel schrieb:
> muß aber für die
> UART einen Quarz mit 7372800 Hz nutzen.

Welche Baudrate willst Du denn haben?
Ein ATmega88 geht bis 20MHz und könnte mit 18,432MHz laufen. 
Andererseits kann die Baudrate problemlos einen Fehler von 1-2% haben, 
ohne Fehler zu erzeugen.

von Matthias B. (matze_56)


Lesenswert?

Nee, im Simulator sah es nicht nach aktivem Vorteiler aus. Ich will 
115.200 schaffen, die 1-2% Fehler kann ich mir noch mal ansehen, aber 
ich werde erst mal versuchen, mit einem ungenaueren 1ms-Timer 
auszukommen - vielleicht wird der Fehler gar nicht so schlimm, wie am 
Anfang gedacht.

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.