ATMega8 und OCI1B

OP #3375935
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
Gast #3375989
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.
OP #3376230
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.