mikrocontroller.net

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


Autor: Michael Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eingehirner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eingehirner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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...

Autor: Bernd Stein (bernd_stein)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eingehirner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;) )

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eingehirner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt, geht auch, ich hatte jetzt an Schieberegister gedacht...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.