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?
Ähm...dann ändere im Programm einfach den Comparewert. Das geht natürlich, da brauchst auch nix initialisieren. Einfachen "beliebigen" Wert laden.
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.
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.