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
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.
Danke, auch wenn es mein Problem nicht löst, so weiß ich nun wenigstens weshalb.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.