Mit Timer1 Match sofort Timer2 loslaufen lassen

OP #1005182
Lesenswert?

Hallo,

gibt es eine möglichkeit per Software nach Interrupt Timer 1 Match 
sofort Timer2 oder Timer1 "loslaufen" zu lassen.
Der Hintergrund ist der das ich nach einem ereignis Timer 1 Match noch 
eine Verzögerung benötige um dann nach der Verzögerung einen weiteren 
Interrupt auslösen zu können. Die grösse des bereichs ist das Problem 
der sich von 2,5 uS bis 25 uS Controller ist ein Mega 16 mit 16MHz.
Gast #1005199
Lesenswert?

Bei 2,5µs sollte man in der ISR warten, bei 25µs könnte man es auch noch 
machen.
Generell könnte man das Register, welches den T1-Interrupt ausgelöst hat 
neu laden und dann den 2. Interrupt nutzen. Einen 2. Timer braucht man 
nicht.
OP #1005777
Lesenswert?

Hallo,

Verzögerung mit schleife.

hab nur immer das Problem das bei 0 Werten ein Übertrag stattfindet und 
der Zähler dann bei 255 anfängt anstatt einfach Durchzulaufen.
Problematischer ist noch das wenn der Wert TempH = 0 und TempL = 1 ist 
dann
gibt es einen Übertrag im high Bereich. Also vorher immer alles +1 wenn 
tempH oder TempL = 0 sind oder gibt es noch andere Lösungen. Wie gesagt 
den einen Timer dafür zu nehmen kostet mit der Initialisierung vorher 
zuviel Zeit.

        lds  tempH,vorzeitH
vz_lo_2:      lds  tempL,vorzeitL
vz_lo_1:      dec  templ
        brne vz_lo_1
        dec  temph
        brne vz_lo_2
Gast #1005798
Lesenswert?

> ... ein Controller benötigt 12 Quarztakte für einen Prozessortakt

Das sind aber andere Controller (8051 und ältere Derivate desselben).
Die AVR-Controller, um die es hier geht, brauchen für viele Befehle
(insbesondere auch den NOP) tatsächlich nur einen Oszillatortakt.
Gast #1005862
Lesenswert?

@René

Was sind 0 Werte?
Ohne jetzt ins Datenblatt zu sehen, würde ich ein Compare-Register 
(16bit) nehmen, um von T1 einen Interupt zum Start der Verzögerung zu 
erhalten. In der ISR wird das Flag gelöscht, die Verzögerungszeit zum 
Compare-Register addiert und dann gewartet, bis das Flag wieder gesetzt 
ist.
Dazu sind Timer doch da.

Ist m.E. ganz einfach oder habe ich etwas nicht verstanden?
#1005863
Lesenswert?

René Schink wrote:
> Verzögerung mit schleife.
>
> hab nur immer das Problem das bei 0 Werten ein Übertrag stattfindet und
> der Zähler dann bei 255 anfängt anstatt einfach Durchzulaufen.
> Problematischer ist noch das wenn der Wert TempH = 0 und TempL = 1 ist
> dann
> gibt es einen Übertrag im high Bereich. Also vorher immer alles +1 wenn
> tempH oder TempL = 0 sind oder gibt es noch andere Lösungen.

Das Carry-Flag ist Dein Freund, wenn es um Rechnungen >8Bit geht.

Hier ein zyklusgenaues Delay:

http://www.mikrocontroller.net/attachment/416/Mdelay.asm



> Wie gesagt
> den einen Timer dafür zu nehmen kostet mit der Initialisierung vorher
> zuviel Zeit.

Das mußt Du mal näher erklären.
Du hast doch 2 Compare Interrupts.
Einfach OCR1A auf die erste Zeit setzen und OCR1B auf die Zeit + Delay.

Und wenn Du zu beiden Zeiten nur einen Pin setzen mußt, dann nimm 
einfach die Compare-Output-Pins.
Dann sind die Zeiten zyklusgenau, sogar ganz ohne Interrupthandler.


Peter
Gast #1005866
Lesenswert?

Hi

Der Timer1 hat zwei OC-Interrupts. Wenn du das zweite OC-Register mit 
einem Wert erstes OC-Register+Verzögerung lädst und OCIE1B in TIMSK am 
Anfang der ersten IR setzt (sbi TIMSK,OCIE1B) bekommst du eine genaue 
Verzögerung mit einem Timer hin.

MfG Spess

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren