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
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
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.
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
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
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
Hallo zusammen,
der Thread scheint etwas untergegangen zu sein.
Es wird doch mittlerweile jemand hier sein, der etwas gescheites dazu
sagen kann.
Bernd_Stein
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
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)?
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
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...
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
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 ;) )
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