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.
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.
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 ;)
>...Controller ist ein Mega 16 mit 16MHz
@Jochen
NOP ;-)
ICh geb ja zu dass ich die 16 MHz übersehen hab, aber die 12 hab ich nur genommen um mir dass Rechnen zu erleichtern ;)
@Jochen NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP =1µs bei 16Mhz mit Mega16
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
16 Quarztakte sind eine µS, soweit richtig, aber ein Controller benötigt 12 Quarztakte für einen Prozessortakt
> ... 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.
@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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.