Forum: Mikrocontroller und Digitale Elektronik Fragen zum Timer1 im Atmega8


von Peter (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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?

von Servobrummer (Gast)


Lesenswert?

Ähm...dann ändere im Programm einfach den Comparewert.
Das geht natürlich, da brauchst auch nix initialisieren. Einfachen 
"beliebigen" Wert laden.

von Servobrummer (Gast)


Lesenswert?

KHB war schneller^^

von Peter (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

Peter schrieb:
>     ldi     temp, high( 5000 )
>     out    OCR1AH, temp1
                     ^^^^^
Sollte das nicht 'temp' heißen?

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.