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.
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
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?
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
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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.