Forum: Mikrocontroller und Digitale Elektronik ATMega16 Timer1 ungenauigkeiten


von R--- S. (rene66)


Lesenswert?

hallo,

ich habe versucht Timer 1 mit diesem Code in einem Interrupt abzufragen.
Funktioniert auch aber nicht genau genug.


hier mal der Code Schnipsel

               ldi   tempL, (1<<CS12)|(1<<CS11)|(0<<CS10)|(1<<WGM12) ; 
Start Timer1 mit Externer Takt über Pin B1
               out   TCCR1B, tempL

szeit1:        in  templ,TIFR
               sbrs templ,4 ;OCF1A bei Match
               rjmp szeit1
               ldi templ,(1<<OCF1A);16
               out TIFR,templ
               ldi tempL, (0<<CS12)|(0<<CS11)|(0<<CS10)|(0<<WGM12) ; 
Timer Stop
               out     TCCR1B, templ


gibt es noch genauere Methoden auch ohne Interrupt kann ich auch ein 
anderes Timer1 Register direkt abfragen denn mit dem TIFR geht das ja 
nicht direkt.

von Fred S. (Gast)


Lesenswert?

Hi René,
> ich habe versucht Timer 1 mit diesem Code in einem Interrupt abzufragen.
Du fragst in Deinem Code OCF1A ab, also ein Interrupt Flag, verwendest 
aber keinen Interrupt, zumindest sehe ich keinen Interrupt Handler und 
weiß nicht, ob irgendwo vorher sei steht.

> Funktioniert auch aber nicht genau genug.
Was Du damit meinst, musst Du schon besser erklären. Dein Code macht 
nichts weiter, als solange in einer Schleife zu warten, bis ein Compare 
Match erfolgt -- was Du damit erreichen willst, ist nicht ersichtlich. 
Ich sehe nirgendwo, dass Du OCR1 initialisierst; OK, Du schreibst, es 
wäre eine Code-Schnipsel, aber so kann man nur raten, was der Zweck ist.

Dein letzter Satz is unverständlich, nicht zuletzt wegen fehlender 
Interpunktion. Ich rate mal, Du meinst eine Abfrage mit sbis/sbic? TIFR 
kannst Du damit beim Atmega16 nicht erreichen.


Gruß

Fred

von R--- S. (rene66)


Lesenswert?

Hallo,

gibt es ein anderes Register des Timer 1 mit dem ich den Compare A Match 
abfragen kann? Ich habe Variable Zeiten ich von außen Takt über Port B1 
die relativ genau abpassen muss. (VGA Vsync und Hsync Signal). Durch 
diese schleife bekomme ich Abweichungen rein.

wenn ich z.B. nach der 1 Zeile (in  templ,TIFR) das OCF1A Bit gesetzt 
wirs dann dauert es länger als wenn es in der letzten Zeile gesetzt 
wird.

szeit1:        in  templ,TIFR
               sbrs templ,4 ;OCF1A bei Match
               rjmp szeit1

gibt es kann ich beim Timer1 nur das TIFR bit auswerten oder gibts noch 
was anderes?

oder muß ich die Eingangssingnale noch etwas mit Hardware aufarbeiten um 
saubere Signale zu erhalten?

von Fred S. (Gast)


Lesenswert?

Hi René,

Du schreibst, dass Du ein Ereignis abpassen möchtest, wobei die Zeit 
zwischen Ereignis und Bearbeitung konstant sein soll. Da kann ich Dir 
nur einen Interrupt empfehlen, wobei Du natürlich den Overhead hast, der 
nötig ist, um zum Interrupt Handler zu springen. In Deinem Code sehe ich 
nirgendwo, dass Du gleich agierst, wenn der Timer Compare Match 
eingetreten ist, außer dass Du den Timer anhältst. Wenn Du ungefähr 
weißt, wann das Ereignis eintritt, könntest Du dann nicht einfach auf 
einen Flankenwechsel warten, z.B. mit einem externen Interrupt?

Gruß

Fred

von Hannes L. (hannes)


Lesenswert?

Es ist immer noch nicht klar, was Du machen willst.

Willst Du die Dauer eines externen Signalimpulses messen, dann schau Dir 
die Input-Capture-Einheit an (Datenblatt).

Willst Du in regelmäßigen Abständen Ereignisse auslösen (Impulse 
erzeugen, Zeiten summieren, Uhr, ...), dann lass einen Timer im CTC-Mode 
laufen und Interrupts auslösen.

Willst Du unterschiedliche (also sich ändernde) Zeiten erzeugen, dann 
ist es sinnvoll, den Timer durchlaufen zu lassen und im 
Compare-Interrupt den Termin für den nächsten Interrupt in der ISR zu 
setzen (OCR einlesen, Intervall draufaddieren, OCR zurückschreiben). Das 
freie Durchlaufenlassen eines Timers ermöglicht auch das Benutzen 
mehrerer Interrupts von einem Timer.

Falls Du allgemeine Verständnisprobleme betreffs Interrupt hast (soll es 
ja auch geben, hatten wir alle mal), dann schau mal in fremde Codes. 
z.B. hier: http://www.hanneslux.de/avr/index.html

...

von Andreas K. (a-k)


Lesenswert?

Wäre auch nützlich zu erfahren, was denn nun "genau genug" wäre.

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.