www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega16 Timer1 ungenauigkeiten


Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R--- S--- (rene66)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Fred S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

...

Autor: Andreas K. (a-k)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.