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
Stimmt, geht auch, ich hatte jetzt an Schieberegister gedacht...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.