Forum: Mikrocontroller und Digitale Elektronik Timer1 und Bascom


von Mr-400-Volt (Gast)


Lesenswert?

Hallo, ich würde gerne den Timer im laufenden Programm ändern. Z.B. gebe 
ich eine Frequenz zwischen 1 und 200 vor, die bestimmen soll, wie oft 
ein Interrunpt ausgelöst werden soll. Ist das überhaupt möglich, und 
wenn ja, wie berechne ich das ?

Danke!!!

von Mr-400-Volt (Gast)


Lesenswert?

Gibt es da keine Formel für ?

von Sonic (Gast)


Lesenswert?

Bascom kenn' ich nicht, aber was du willst geht mit dem 
Output-Compare-Interrupt. Das OCR1x - Register ändern lässt den OC-INT 
auch früher oder später auftreten. Siehe Datenblatt.

von Karl heinz B. (kbucheg)


Lesenswert?

Dein Prozessor läuft wie schnell?
Der macht x Takte in der Sekunde

Über einen Vorteiler gehst du in einen Timer
hinein. Das heist der Timer sieht nur noch x / Vorteiler
Takte in der Sekunde.

Jetzt hängt es davon ab, in welchem Modus du den Timer
betreibst. Je nachdem dauert es y Timer-Takte bis ein
Interrupt ausgelöst wird.

D.h. du kriegst

   ( x / Vorteiler ) / y   Interrupts in der Sekunde

das x ist fest (den Quarz kannst du schlecht im
Betrieb umlöten). Das einzige was du variieren kannst
ist Vorteiler und y. Beim Vorteiler hast du nicht
allzuviele Möglichkeiten. Und das y kann je
nach Timer Modus entweder fest (normaler Timer
Modus, die PWM Modi) oder variabel sein (CTC Modus,
Fast PWM - Modus).

Also: Such dir einen Vorteiler aus und schau noch
ob du bei deinem gewählten Timer Modus ein passendes
y erhältst. Wenn sichs nicht ausgeht, dann nimm einen
anderen Vorteiler.

Wenn man verstanden hat wie Timer arbeiten und wie speziell
die verschiedenen Timermodi arbeiten ist es so einfach
wie einem Baby den Schnuller wegnehmen.

von Mr-400-Volt (Gast)


Lesenswert?

Könnta das so gehen ? Die Variable Timervorgabe ist im Programm 
veränderlich. Obwol ich lieber eine Frequenz als veränderliche größe 
hätte.



Config Timer1 = Timer , Prescale = 8
On Timer1 Wobbeln

Timervorgabe = 4000
.
.
.
.
.
.
Wobbeln:
  Timer1 = Timervorgabe

  If X = 0 Then
     F1 = F1 + Ftempo
     If F1 >= Fwobbel(2) Then
       X = 1
     End If

   Else
     F1 = F1 - Ftempo
     If F1 <= Fwobbel(1) Then
       X = 0
     End If
   End If

Gosub Ad9835out

Return

von Karl heinz B. (kbucheg)


Lesenswert?

> Könnta das so gehen ?

Versuch macht kluch

> Obwol ich lieber eine Frequenz als veränderliche größe
> hätte.

Und was hindert dich daran die gewünschte Frequenz
in die Vorgabe umzurechnen?

  f = 1 / t

Du weist welche Frequenz du brauchst.
Durch umstellen obiger Formel kannst du dir
ausrechnen, wie lange also eine Schwingungsperiode
ist, wieviele Quarz Ticks also vom Beginn eines
Anstiegs bis zum Beginn des nächsten Anstiegs vergehen
müssen.
Weiters weist du wie oft in dieser Zeit der Timerinterrupt
aufgerufen werden soll (das weist du, weil du weist wie
gross dein FTempo ist und daraus kann man wiederrum
berechnen wieviele Interrupt Aufrufe benötigt werden
um F1 einmal von Fwobbel(1) bis Fwobbel(2) und wieder
zurück zu treiben.

Also: du weist wieviele Quarz Ticks du brauchst, damit
genau die Zeit vergeht, die einer Periode der Wobbelfrequenz
entspricht. Weiters weist du wieviele Timer Interrupts
in diesem Zeitraum auftreten sollen. Also kannst du
berechnen, wieviele Quarz Ticks von einem Timer Interrupt
zum nächsten vergehen müssen. (Das eine dividiert durch
das andere, den Vorteiler des Timers nicht vergessen).

Weiters weist du bei welchem Zählerstand der Timer auslöst.
D.h. wenn du so und soviele Ticks bis zum Interrupt haben
willst, setzt du den Vorgabewert auf die Differenz.

Huch. Da haben wir ihn ja: Den Vorgabewert.

Sorry: Noch genauer schluessle ich das dir jetzt nicht
auf. Ein bischen denken musst du schon selbst.

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.