Hallo,
ich habe einige Fragen zum Timer 1 im Atmega 8, wo das Tutorial
mir nicht wirklich weiter hilft.
Man kann ja im CTC Modus einen Vergleichswert festlegen:
Bspl.:
ldi temp, high( 20000 )
out OCR1AH, temp1
ldi temp, low( 20000 )
out OCR1AL, temp1
ldi temp, ( 1 << WGM12 ) | ( 1 << CS10 ) ; CTC ein, Vorteiler
auf 1
out TCCR1B, temp
ldi temp, 1 << OCIE1A ; OCIE1A; Interrupt bei Timer Compare
out TIMSK, temp
sei
timer1_compare:
;tue dieses und jenes
reti
Wie stelle ich es an, dass der Comparewert (20000) sich durch
das Programm ändern lässt? Muss der Timer hierfür neu initialisiert
werden?
Kann man einen Timer überhaupt in einem Programm mehrfach
initialisieren?
Ich möchte erreichen, dass ich den Comparewert im laufenden Programm
verändern kann. Kann mich hier jemand aufklären?
Gruß Peter
Peter schrieb:> Wie stelle ich es an, dass der Comparewert (20000) sich durch> das Programm ändern lässt? Muss der Timer hierfür neu initialisiert> werden?
Nein.
Du schreibst einfach neue Werte in die Register.
> Kann man einen Timer überhaupt in einem Programm mehrfach> initialisieren?
natürlich. Du kannst alles zur Laufzeit ändern. Einfach die Register neu
beschreiben.
> Ich möchte erreichen, dass ich den Comparewert im laufenden Programm> verändern kann. Kann mich hier jemand aufklären?
Deine Frage ist in Wirklichkeit eigentlich eine ganz andere.
Deine Frage ist:
Wo und wie kriege ich die Werte her, so dass ich sie in die Register
schreiben kann?
Das ist die Frage der du dich stellen musst. Und die kann dir hier
keiner beantworten, weil keiner weiß, was du vorhast. Selbstverständlich
könntest du den Comparewert zb mittels ADC (und mit einem Poti) neu
ermitteln und in die Compare-Register schreiben. Selbstverständlich
kannst du dem µC per UART einen neuen Wert schicken, den das Programm
dann in die Register schreibt. Selbstverständlich könntest du einen Wert
von einer SD-Karte lesen und dann in die Compare-Register schreiben.
Selbstverständlich könntest du auch zeitgesteuert mit einem anderen
Comparewert hochkommen und den dann in die Register schreiben.
Selbstverständlich könntest du abhängig von einer Schalterstellung (oder
einem Taster) 2 verschiedene Werte in die Compare-Register laden.
Selbstverständlich könntest du xxxx und dann den dadurch ermittelten
Wert in die Register schreiben.
Deine Frage dreht sich um das xxxx und nicht um den Timer. Denn der
andere Teil ist immer gleich: Wenn du erst mal einen 16 Bit Wert hast,
dann schreibst ihn einfach in die Compare-Register und alles ist gut.
Aber den Teil xxxx musst DU programmieren. Und: dieser Teil hat erst mal
nichts mit dem Timer zu tun. Da geht es nur darum: wie und wo kriegt das
Programm einen 16 Bit Wert her?
Vielen Dank für die Antworten.
Ja, wo ich die Werte her bekomme um das Register neu zu beschreiben
wird sich aus dem Programm ergeben ob (Taster, Schalter, Poti..usw).
Nur..., dass ich "nur" das Register neu beschreiben muss war mir unklar.
Also könnte ich an x-beliebiger Stelle zB. folgendes schreiben:
ldi temp, high( 5000 )
out OCR1AH, temp1
ldi temp, low( 5000 )
out OCR1AL, temp1
Ist das so richtig?
Was passiert denn mit den Anfangswerten mit denen der Timer
zu Beginn initialisiert wurde (20000)? Werden die überschrieben?
Ich dachte das die einmal eingestellten Werte wie hier:
ldi temp, high( 20000 )
out OCR1AH, temp1
ldi temp, low( 20000 )
out OCR1AL, temp1
ldi temp, ( 1 << WGM12 ) | ( 1 << CS10 ) ; CTC ein, Vorteiler
out TCCR1B, temp
ldi temp, 1 << OCIE1A ; OCIE1A; Interrupt bei Timer Compare
out TIMSK, temp
sei
für das Programm maßgeblich sind, da hier ja auch CTC, und das "sei"
gesetzt sind.
Als Beginner verwirrt mich das ganze jetzt mehr als vorher.
Ich werde das mal mit Testprogrammen ausbaldowern.
Vielen Dank für euere Geduld.
Gruß Peter
Hi
>Was passiert denn mit den Anfangswerten mit denen der Timer>zu Beginn initialisiert wurde (20000)? Werden die überschrieben?
Ja. Die Register kann man beliebig oft beschreiben.
MfG Spess
Peter schrieb:> Was passiert denn mit den Anfangswerten mit denen der Timer> zu Beginn initialisiert wurde (20000)? Werden die überschrieben?
Wenn du einen Zettel nimmst und auf den (karriertes Papier und du
schreibst schön in die Kästchen hinein) 20000 draufschreibst und eine
halbe Stunde später kommst du, radierst alles aus und schreibst
stattdessen 05000 an dieselbe Stelle, dann sind die 20000 von vorher
wohl weg.
> ldi temp, high( 20000 )> out OCR1AH, temp1> ldi temp, low( 20000 )> out OCR1AL, temp1>> ldi temp, ( 1 << WGM12 ) | ( 1 << CS10 ) ; CTC ein, Vorteiler> out TCCR1B, temp>> ldi temp, 1 << OCIE1A ; OCIE1A; Interrupt bei Timer Compare> out TIMSK, temp> sei>> für das Programm maßgeblich sind, da hier ja auch CTC, und das "sei"> gesetzt sind.
Ja mag sein.
Aber nur weil du auf deinem Papier eine Zeile ausradierst und einen
anderen Wert hinschreibst, werden ja die restlichen vollgeschriebenen
Zeilen deines Papiers nicht ungültig.