Forum: Mikrocontroller und Digitale Elektronik Mit Timer1 Match sofort Timer2 loslaufen lassen


von R--- S. (rene66)


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.

von Gast (Gast)


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.

von R--- S. (rene66)


Lesenswert?

Ok dann werde ich mal schleifen im ISR Basteln

von Jochen R. (josch90)


Lesenswert?

also wenn es um wenige µS geht, wäre es doch schon fast in Betracht zu 
ziehen einfach ein paar NOP's einzusetzen, bei einem Quarz mit 12kHz 
würde man für eine µS ja nur ein NOP benötigen.

Gruß

Jochen

edit: ein Quarz mit 12 MHz natürlich ;)

von Gast (Gast)


Lesenswert?

>...Controller ist ein Mega 16 mit 16MHz

@Jochen
NOP ;-)

von Jochen R. (josch90)


Lesenswert?

ICh geb ja zu dass ich die 16 MHz übersehen hab, aber die 12 hab ich nur 
genommen um mir dass Rechnen zu erleichtern ;)

von Rudi (Gast)


Lesenswert?

@Jochen
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP =1µs bei 16Mhz mit Mega16

von R--- S. (rene66)


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

von Jochen R. (josch90)


Lesenswert?

16 Quarztakte sind eine µS, soweit richtig, aber ein Controller benötigt 
12 Quarztakte für einen Prozessortakt

von yalu (Gast)


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.

von R--- S. (rene66)


Lesenswert?

Bitte mal zurück zum Thema.

danke

von Gast (Gast)


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?

von Peter D. (peda)


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

von spess53 (Gast)


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

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.