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.