www.mikrocontroller.net

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


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

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

Autor: Gast (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Ok dann werde ich mal schleifen im ISR Basteln

Autor: Jochen R. (josch90)
Datum:

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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>...Controller ist ein Mega 16 mit 16MHz

@Jochen
NOP ;-)

Autor: Jochen R. (josch90)
Datum:

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

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jochen
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP =1µs bei 16Mhz mit Mega16

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

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

Autor: Jochen R. (josch90)
Datum:

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

Autor: yalu (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht lesenswert
Bitte mal zurück zum Thema.

danke

Autor: Gast (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: spess53 (Gast)
Datum:

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

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.