Forum: Mikrocontroller und Digitale Elektronik ATtiny, Prescaler für Timer0 syncronisieren


von Michael Schmidt (Gast)


Lesenswert?

Hallo!

Kann mir jemand in wenigen Worten erklären, wie man den Vorteiler für
Timer/Counter0 eines ATtiny13 zurücksetzt?

Erst TSM-Bit setzen, dann PSR10 setzen und danach TSM-Bit wieder
löschen oder geht das auch in einem Rutsch?

Danke im Vorraus!
Michael

von Bernhard S. (bernhard)


Lesenswert?

Hallo Michael,

hat noch keiner geantwortet, ich were mich mal benmühen.

Wolltest Du wirklich den Vorteiler ändern?

Bsp: von 128 auf 64


Ist etwas ungewöhnlich, deshalb muss ich's hinterfragen.

Bernhard

von johnny.m (Gast)


Lesenswert?

Um den Prescaler einfach nur rückzusetzen brauchst Du nur das PSR10 zu
setzen. Es wird dann auch sofort wieder gelöscht. Das TSM sorgt dafür,
dass das PSR10 nicht sofort wieder gelöscht wird und das dient dazu,
den Prescaler dauerhaft anzuhalten, während Du am Timer
rumkonfigurierst. Erst wenn TSM wieder gelöscht wird, wird der
Prescaler wieder freigegeben.

von Michael Schmidt (Gast)


Lesenswert?

Na die Antwort war mal Klasse!
Man muß also das TSM-Bit gar nicht bemühen, um nur den Vorteiler zu
resetten. Da war ich noch gar nicht drauf gekommen.

Vielen Dank!
Michael

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hallo zusammen,

ich befasse mich auch gerade mit dem Timer/Counter Prescaler vom 
ATtiny13.
Habe bisher soviel verstanden, das dieser vom Systemtakt ( clk_I/O ) 
getaktet wird und mit dem Bit PSR10 im Register GTCCR zurückgesetzt 
werden kann, so das dieser mit dem nächsten Systemtakt auch wieder von 
vorn beginnt.
Mit dem Bit TSM im gleichen Register kann der Prescaler ( Vorteiler ) in 
seinem Reset-Zustand festgehalten werden.

Nun habe ich folgendes Programm geschrieben und im AVR-Studio simuliert.

;
;Prgrammspeicher initialisieren
;

.CSEG         ;Code Segment
.ORG  $0000   ;Programm beginnt bei Adresse 0

;
;Programmstart mit Interrupt Vektoren
;

    rjmp Anfang    ;(RESET) External Pin, Power-on Reset, Brown-out 
Reset,
                   ;Watchdog Reset
    reti           ;(INT0)External Interrupt Request 0
    reti           ;(PCINT0) Pin Change Interrupt Request 0
    reti           ;(TIM0_OVF) Timer/Counter Overflow
    reti           ;(EE_RDY) EEPROM Ready
    reti           ;(ANA_COMP) Analog Comparator
    reti           ;(TIM0_COMPA) Timer/Counter Compare Match A
    reti           ;(TIM0_COMPB) Timer/Counter Compare Match B
    reti           ;(WDT) Watchdog Time-out
    reti           ;(ADC) ADC Conversion Complete
;
; Hier Startet das Programm bei einem Reset
;
Anfang:  ldi   r16,$FF      ;Zählerwert laden...
         out   TCNT0,r16    ;...und Zähler damit initialisieren
         in    r16,TCCR0B   ;Teiler...
         ori   r16,1<<CS01  ;...durch 8...
         out   TCCR0B,A     ;...im Prescaler (Vorteiler) einstellen.
Endless: rjmp  Endless      ;Endlosschleife

Ich erwartete das der Zähler ( TCNT0 ) bereits nach 8 Takten
(Processor => Cycle Counter ) auf $00 springt, da ja schließlich
nach 6 Takten der Prescaler auf den Teiler durch 8 eingestellt war.
Ich erwartete dieses, da der Prescaler ja vom Systemtakt bereits 
mitgetaktet wurde und ich weder das Bit PSR10 noch TSM genutzt habe.
Der Zähler bzw. das TCNT0-Register wird aber nach 14 Takten auf $00 
gesetzt.

Hier stimmt doch etwas mit dem Simulator nicht oder ?
Ich benutze den Simulator2 in der Version 4.18 Build 700

Ich suche schon seit einiger Zeit etwas wo die Datenblattseiten
74 und 75 vom Timer/Counter Prescaler mal in deutsche übersetzt wurden 
oder wenigstens erklärt werden.

Bernd_Stein

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Bernd Stein schrieb:
> Hallo zusammen,
...
> Ich suche schon seit einiger Zeit etwas wo die Datenblattseiten
> 74 und 75 vom Timer/Counter Prescaler mal in deutsche übersetzt wurden
> oder wenigstens erklärt werden.
>
Nach dem ich nun mit dem Simulator nicht weiter komme,
hoffe ich auf eure Hilfe.
Im General Timer/Counter Control Register ( GTCCR ) befinden sich ja nur 
zwei Bits, nämlich
PSR10 ( Prescaler Reset Timer/Counter0 ) und
TSM ( Timer/Counter Synchronization Mode ).

Falls ich es richtig verstehe hält das Bit TSM durch setzen,
den Prescaler in seinem momentanen Zählstand fest.

Nur das Bit PSR10 zu setzen bringt doch keine wirkliche Synchronisation 
oder ?

Zum richtigen Synchronisieren muß ich also erst das Bit TSM setzen und 
danach das Bit PSR10 oder ?

Wenn ich nun nach der oben beschriebenen Reihenfolge nur das Bit TSM 
wieder lösche, dann ist doch die Sychronistion abgeschlossen oder ?

Wenn ich den Satz im Datenblatt richtig interpretiere, dann wird das Bit 
PSR10 doch nur durch die Hardware gelöscht, wenn auch das TSM Bit vorher 
gesetzt war und nur durch löschen von TSM wird auch PSR10 gelöscht oder 
?

• Bit 0 – PSR10: Prescaler Reset Timer/Counter0

When this bit is one, the Timer/Counter0 prescaler will be Reset. This 
bit is normally cleared immediately by hardware, except if the TSM bit 
is set.

Bernd_Stein

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hallo zusammen,

der Thread scheint etwas untergegangen zu sein.
Es wird doch mittlerweile jemand hier sein, der etwas gescheites dazu 
sagen kann.

Bernd_Stein

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Bernd Stein schrieb:
> Hallo zusammen,
>
> der Thread scheint etwas untergegangen zu sein.
> Es wird doch mittlerweile jemand hier sein, der etwas gescheites dazu
> sagen kann.
>
> Bernd_Stein

von Eingehirner (Gast)


Lesenswert?

Ich muß sagen, ich versteh deine Frage nicht... dein Prescaler muß nicht 
synchronisiert werden, der gibt nur den Vorfaktor für den Timer an. Wenn 
du z.B. einen Prescaling-Faktor von 64 hast, wird nicht bei jedem Takt 
der Timer eins hochgezählt, sondern bei jedem 64ten.

Das Zurücksetzen machst du einfach, indem du im laufenden Betrieb 
irgendwann die Bits für den Zahlenwert des Vorteilers auf 0 setzt, oder 
eben alternativ (ich kenne die Spezialitäten des ATTiny nicht so genau) 
das PSR0-Bit auf 1.

Was genau willst du denn synchronisieren? Willst du, daß der Timer 
meinetwegen immer GENAU einen Durchlauf lang auf Prescaler 64 und einen 
auf Prescaler 128 läuft (quasi ein handgemachter Prescaler 192)?

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Eingehirner schrieb:
...
> Was genau willst du denn synchronisieren? Willst du, daß der Timer
> meinetwegen immer GENAU einen Durchlauf lang auf Prescaler 64 und einen
> auf Prescaler 128 läuft (quasi ein handgemachter Prescaler 192)?
>
Nein.
Ich wollte einfach nur verstehen was man mit den Bits TSM und PSR10 
anfangen kann.

Habe das bisher so verstanden, das der Prescaler immer vom Systemtakt 
getaktet wird. Der Timer läuft z.B. über einen Prescaler von 8.
So könnte es z.B. vorkommen das man den Timer stoppt und irgendwann 
wieder startet ( freigibt ) dieser jedoch z.B. schon sieben Sytemtakte 
bekommen hat und nach nur einem weiteren Sytemtakt bereits um eins 
seinen Zälerstand erhöhen würde, weil ja der Prescaler dann seine acht 
Takte hat.
Seit der Freigabe des Timers jedoch erst ein Systemtakt vergangen ist.

Bernd_Stein

von Eingehirner (Gast)


Lesenswert?

Ah, jetzt kapier ich dein Problem besser, ok... So ein Reset des 
internen Prescaler-Timers (was anderes ist das ja nicht) sollte mit dem 
PSR10-Bit gehen, wie ich das Datenblatt verstehe. Das TSM-Bit ist dafür 
da, daß du den Timer schön konfigurieren kannst, ohne daß er sich 
verändert, quasi um die Uhr bei rausgenommener Batterie zu stellen. Wenn 
du also irgendwann
1
out GTCCR, (1 << PSR10)
machst, wird der Prescaler-Zähler auf Null zurückgesetzt. Wenn du 
"lustig" drauf bist, gibst du also einen Prescaler von 64 vor und machst 
alle 60 Takte in deinem Programm einen PSR10-Reset... dann kommt er nie 
bei 64 an und der Timer zählt nie hoch...

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Eingehirner schrieb:
> Ah, jetzt kapier ich dein Problem besser, ok... So ein Reset des
> internen Prescaler-Timers (was anderes ist das ja nicht) sollte mit dem
> PSR10-Bit gehen, wie ich das Datenblatt verstehe. Das TSM-Bit ist dafür
> da, daß du den Timer schön konfigurieren kannst, ohne daß er sich
> verändert, quasi um die Uhr bei rausgenommener Batterie zu stellen.
...
>

Danke für die Antwort.
Denke das ganze jetzt richtig verstanden zu haben.
Werde ich natürlich erst genau wissen, falls ich jemals damit arbeiten 
werde.

Bernd_Stein

von Eingehirner (Gast)


Lesenswert?

Wenn du Spaß dran hast: Kauf dir das Billig-LCD DG-12232 von Pollin, 
nimm eine der vielen Ansteuerbibliotheken und schreib dir was, das die 
Steuerbytes ständig ausgibt, dann kannst du kontrollieren, was passiert 
(das Datenblatt find ich da auch nicht ganz eindeutig). Ich nutz das 
Display ständig als Primitiv-Debugger ;) geht wunderbar.

(Bevor hier alle mit JTAG und ICE anfangen: Ich komm aus der 
FORTRAN77-Ecke. Debuggen heißt für mich, ein paar Textausgaben im Code 
zu versenken ;) )

von Peter D. (peda)


Lesenswert?

Eingehirner schrieb:
> Wenn du Spaß dran hast: Kauf dir das Billig-LCD DG-12232 von Pollin,
> nimm eine der vielen Ansteuerbibliotheken und schreib dir was, das die
> Steuerbytes ständig ausgibt, dann kannst du kontrollieren, was passiert
> (das Datenblatt find ich da auch nicht ganz eindeutig). Ich nutz das
> Display ständig als Primitiv-Debugger ;) geht wunderbar.

Dein Tip paßt vielleicht woanders hin, aber nicht zum ATtiny13.
Wenn Du alle 6 IOs für das LCD benötigst, welche IOs bleiben dann für 
Deine Anwendung ???

Dann schon besser eine SW-UART und nur senden.


Peter

von Eingehirner (Gast)


Lesenswert?

Stimmt, geht auch, ich hatte jetzt an Schieberegister gedacht...

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hier gibt es auch eine sehr gute Diskusion zu diesem Thema :

https://www.roboternetz.de/community/threads/74825-ATtiny13A-Frage%28n%29-zum-Register-GTCCR


Bernd_Stein

von Stefan F. (Gast)


Lesenswert?

Ich glaube, das interessiert die Teilnehmer nach 14 Jahren nicht mehr.

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.