-         
Ergebnis 1 bis 9 von 9

Thema: ATtiny13A: Frage(n) zum Register GTCCR

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    49
    Beiträge
    401

    ATtiny13A: Frage(n) zum Register GTCCR

    Anzeige

    Hallo zusammen,

    man findet ja leider nicht viel in AVR8ASM zu diesem Thema.

    Muss TSM wirklich einmal seperat gesetzt werden ?
    Code:
    Neustart2:
    ldi rmp,1<<TSM ; Prescaler Sync Mode
    out GTCCR,rmp
    ldi rmp,(1<<TSM)|(1<<PSR10) ; Reset Presc1
    out GTCCR,rmp
    clr rmp
    out GTCCR,rmp ; Prescaler Count Mode
    out TCNT1H,rmp ; 16-Bit-Zaehler ruecksetzen
    out TCNT1L,rmp
    ldi rmp,1<<OCIE1A
    out TIMSK1,rmp ; in Timer-Int-Maske
    ret
    Würde es beim ATtiny13A nicht auch so reichen ?
    Code:
    ldi rmp,1<<TSM|1<<PSR10
    out GTCCR,rmp
    clr rmp
    out GTCCR,rmp
    out TCNT0,rmp
    oder gar so :
    Code:
    ldi  rmp,1<<TSM
    out  GTCCR,rmp
    clr  rmp
    out  GTCCR,rmp
    out  TCNT0,rmp
    Raffe dass Englische nämlich nicht, trotz Google-Übersetzers, wegen dem
    letzten Satz :

    • Bit 7 – TSM: Timer/Counter Synchronization Mode
    Writing the TSM bit to one activates the Timer/Counter Synchronization
    mode. In this mode, the value that is written to the PSR10 bit is kept,
    hence keeping the Prescaler Reset signal asserted. This ensures that the
    Timer/Counter is halted and can be configured without the risk of
    advancing during configuration. When the TSM bit is written to zero, the
    PSR10 bit is cleared by hardware, and the Timer/Counter start counting.

    • 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
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.617
    Blog-Einträge
    133
    Zitat Zitat von Bernd_Stein Beitrag anzeigen

    Muss TSM wirklich einmal seperat gesetzt werden ?
    Code:
    Neustart2:
    ldi rmp,1<<TSM ; Prescaler Sync Mode
    out GTCCR,rmp
    ldi rmp,(1<<TSM)|(1<<PSR10) ; Reset Presc1
    out GTCCR,rmp
    clr rmp
    out GTCCR,rmp ; Prescaler Count Mode
    out TCNT1H,rmp ; 16-Bit-Zaehler ruecksetzen
    out TCNT1L,rmp
    ldi rmp,1<<OCIE1A
    out TIMSK1,rmp ; in Timer-Int-Maske
    ret

    Ich würde bei diesem Beispiel bleiben obwohl da meiner Ansicht nach eine sinnentstellender Reihenfolgefehler drin ist (wie auch bei den beiden anderen Beispielen).
    Ein gesetztes TSM Bit bewirkt das Beibehalten eines gesetzten PSR10 Bits, das sonst nach Setzten sofort wieder gelöscht wird. Ein Setzen des PSR10 Bits bewirkt das Rücksetzen des Timer Prescalers. Mit gesetztem TSM Bit bleibt der Prescaler im rückgesetzten Zustand und der Timer läuft nicht. Nun hat man Zeit den Timer zu konfigurieren und mit einem Löschen des TSM gezielt im konfigurierten Zustand loslaufen zu lassen.

    Hier ist auch der Reihenfolgefehler im Beispiel:
    clr rmp
    out GTCCR,rmp

    kommt vor vor der Konfiguration des Timers (TCNTL, TCNTH, ...). Es muß dem Sinn nach danach kommen.


    Ob das gleichzeitige Setzen von TSM und PSR10 von 0 auf 1 zum gleichen Ergebnis führt wie erst TSM und im zweiten Schritt zusätzlich das PSR10 kann ich aus dem Datenblatt nicht entnehmen. Müßte man mal ausprobieren. Bis dahin würde ich o.g. Reihenfolge des Setzens von TSM und PSR10 beibehalten.

    Raffe dass Englische nämlich nicht, trotz Google-Übersetzers, wegen dem
    letzten Satz :

    • Bit 7 – TSM: Timer/Counter Synchronization Mode
    Writing the TSM bit to one activates the Timer/Counter Synchronization
    mode. In this mode, the value that is written to the PSR10 bit is kept,
    hence keeping the Prescaler Reset signal asserted. This ensures that the
    Timer/Counter is halted and can be configured without the risk of
    advancing during configuration. When the TSM bit is written to zero, the
    PSR10 bit is cleared by hardware, and the Timer/Counter start counting.
    Grob übesetzt steht da, daß mit TSM das PSR10 Bit beibehalten und damit das Prescaler Reset Signal aufrechterhalten bleibt. Wenn TSM auf 0 gesetzt wird, wird PSR10 über hardware gelöscht und der Timer beginnt zu laufen.

    • 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.*
    Wenn PSR10 gesetzt wird, wird Timer/Counter0 prescaler rückgesetzt. Das Bit wird normalerweise sofort per hardware zurück gesetzt, außer wenn TSM gesetzt ist.


    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.617
    Blog-Einträge
    133
    Zitat Zitat von Bernd_Stein Beitrag anzeigen
    Würde es beim ATtiny13A nicht auch so reichen ?
    Code:
    ldi rmp,1<<TSM|1<<PSR10
    out GTCCR,rmp
    clr rmp
    out GTCCR,rmp
    out TCNT0,rmp
    Hab ich jetzt mal beim ATtiny45 ausprobiert. Reicht beim ATtiny45 und wahrscheinlich auch bei den anderen ähnlichen AVR. Allerdings, wie vorher schon mal erwähnt (wg. sinnvoller Reihenfolge), ist es sinnvoller das zweite
    out GTCCR,rmp
    nach dem
    out TCNT0,rmp
    zu machen.

    oder gar so :
    Code:
    ldi  rmp,1<<TSM
    out  GTCCR,rmp
    clr  rmp
    out  GTCCR,rmp
    out  TCNT0,rmp
    Reicht nicht! bzw der Timer Prescaler wird nicht zurückgesetzt da das PSR10 Bit nicht gesetzt wird.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    173
    Neustart2:
    ldi rmp,1<<TSM ; Prescaler Sync Mode
    out GTCCR,rmp

    Prescaler SYNC Mode ist FALSCH!! Es ist einer TIMER/COUNTER Synchronisationsmode sprich deine Timer 0 1 und 2 werden synchronisiert aber da der Tiny 13 nur Timer 0 hat....
    jetzt wird das TSM erstmal gesetzt UND PSR10 wird automatisch erstmal gelöscht!!!!! Auch wenn du beide Bits gleichzeitig setzt. Harwdare hat immer Vorrang vor Software



    ldi rmp,(1<<TSM)|(1<<PSR10) ; Reset Presc1
    out GTCCR,rmp

    jetzt wird dein Vorteiler erst resetet



    clr rmp
    out GTCCR,rmp ; Prescaler Count Mode

    Dieser Schritt ist unnötig, ausser es ist gewollt das die Timer wieder nicht synchron laufen solle.



    out TCNT1H,rmp ; 16-Bit-Zaehler ruecksetzen
    out TCNT1L,rmp
    ldi rmp,1<<OCIE1A
    out TIMSK1,rmp ; in Timer-Int-Maske

    HEYYY du hast nur EINEN TIMER und zwar TIMER 0!!!! Dieses zerschiest dir dein Programm weil Werte gesetzt werden irgendwo...

    ret

    Schau mal auf Seite 77 das Bild auf der oberen Seite dort findest du dein PSR10 und Synchronization


  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.617
    Blog-Einträge
    133
    Zitat Zitat von avr_racer Beitrag anzeigen
    Neustart2:
    ldi rmp,1<<TSM ; Prescaler Sync Mode
    out GTCCR,rmp

    Prescaler SYNC Mode ist FALSCH!! Es ist einer TIMER/COUNTER Synchronisationsmode sprich deine Timer 0 1 und 2 werden synchronisiert aber da der Tiny 13 nur Timer 0 hat....
    jetzt wird das TSM erstmal gesetzt UND PSR10 wird automatisch erstmal gelöscht!!!!! Auch wenn du beide Bits gleichzeitig setzt. Harwdare hat immer Vorrang vor Software
    Hallo avr-racer,
    wenn TSM nicht gesetzt war, war auch PSR10 nicht gesetzt, da das sofort nach Setzen rückgesetzt wird wenn TSM nicht gesetzt ist. Wird also nur PSR10 gesetzt, wird der Prescaler zurückgesetzt und PSR10 von der Hardware gleich wieder gelöscht - der Prescaler läuft und versorgt die Timer mit Takt.

    Wenn man TSM und PSR10 gleichzeitig setzt wie zB mit
    ldi rmp,(1<<TSM)|(1<<PSR10)
    out GTCCR,rmp
    bleiben beide Bits gesetzt, der Prescaler zurückgesetzt und gstoppt. Die/der Timer steht und kann nicht loslaufen. Hab ich ausprobiert und kann man auch leicht durch Ausgabe auf Display oder über Serielle von GTCCR vor und nach Setzten überprüfen.

    clr rmp
    out GTCCR,rmp

    Dieser Schritt ist unnötig, ausser es ist gewollt das die Timer wieder nicht synchron laufen solle.
    Da der Prescaler mit Setzen von TSM und PSR10 auch gestoppt wurde, muß er wieder freigegeben werden. Das geschieht hier mit Wert 0 ins GTCCR zu schreiben.



    Ich versuch mal zu beschreiben, wie ich die Taktversorgung des/der Timer sehe:
    http://ww1.microchip.com/downloads/e...oc/doc8126.pdf
    Seite 78 oben
    Figure 12-2. Prescaler for Timer/Counter0

    Es gibt einen Prescaler im AVR, der mehrere Taktausgänge hat. Die Ausgänge sind Takt/1, Takt/8, Takt/64, usw vermutlich nach AVR Typ variabel. An den Ausgängen liegt der entsprechende Takt und führen zu den Timern. Die Timer werden also mehreren Leitungen mit den verschieden Takten versorgt. Welchen Takt sie nutzen wird mit den CS Bits für jeden Timer individuell ausgewählt.

    Wird für einen Timer der Takt/8 ausgewählt, findet der erste Timerschritt beim 8. Systemtakt nach Strom einschalten bzw nach Reset des Prescalers statt weil die Takt/8 Leitung dann einen Impuls bekommt. Wenn man die CS Bits für den Timer zB beim 5. Systemtakt setzt, dauert es statt 8 Systemtakten nur 3 Systemtakte bis der erste Timerschritt stattfindet, weil der Prescaler ja schon läuft und die Takt/8 stur alle 8 Takte einen Impuls liefert. Unabhängig vom Setzen der CS Bits.

    Mit den TSM und PSR10 Bits hat man die Möglichkeit, den/die Timer wirklich alle gemeinsam/definiert loslaufen zu lassen. Mit TSM und PSR stoppt man den Prescaler und bringt die Zählkette dort auf Anfang (RESET). Dann kann man alle Timerkonfigurationen vornehmen und die Timer mit Löschen des TSMs definiert loslaufen lassen. Und zwar so, das nicht schon mit der Takt/8 Leitung beim 5. Systemtakt ein Timerschritt stattfindet sondern wirklich erst beim acten.

    Ich hoffe ich lieg da jetzt nicht ganz falsch und habe mich verständlich ausgedrückt

    Gruß
    Searcher

    PS Synchronisation von externem Takt über T0 ist noch was anderes.
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    173
    Zitat Zitat von Searcher Beitrag anzeigen

    Hallo avr-racer,
    wenn TSM nicht gesetzt war, war auch PSR10 nicht gesetzt, da das sofort nach Setzen rückgesetzt wird wenn TSM nicht gesetzt ist. Wird also nur PSR10 gesetzt, wird der Prescaler zurückgesetzt und PSR10 von der Hardware gleich wieder gelöscht - der Prescaler läuft und versorgt die Timer mit Takt.

    ist doch so geschrieben

    Zum PSR10 stehts auch so im DB unter PSR10 mit dem setzen/rücksetzen. Wenn TSM nicht gesetzt war bleibt PSR10, auch wenn man es setzt bei 0 da dies über eine interne UND-Verknüpfung geschieht. Sprich solange TSM = 0 und PSR = 1 wirds zwar in der SW gesetzt aber nicht in der Hardware!!! Da muss man eine gedankliche Trennung zwischen SW-Simulator und HW machen im Simulator.

    Wenn TSM = 1 und PSR10 = 1 ist es richtig das PSR10 wieder 0 wird aber erst wenn der Prescaler auf 0 wechselt, welches intern mit einer Negation in der HW verschaltet ist denn man sichert sich 100%ig ab in der HW das diese HW-Funktion auch ausgeführt wurde.

    https://www.mikrocontroller.net/topic/45304

    Dann weis man wie uralt der T13 ist.

    In manchen Anwendung notwendig aber dafür kann man dann auch gleich eine CTRL nutzen der dies includiert hat.

    Vllt ist es aber falsch verstanden worden das die Timer nicht in der HW sondern nur ZEITLICH synchronisiert werden.

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.617
    Blog-Einträge
    133
    Zitat Zitat von avr_racer Beitrag anzeigen
    Wenn TSM nicht gesetzt war bleibt PSR10, auch wenn man es setzt bei 0 da dies über eine interne UND-Verknüpfung geschieht. Sprich solange TSM = 0 und PSR = 1 wirds zwar in der SW gesetzt aber nicht in der Hardware!!! Da muss man eine gedankliche Trennung zwischen SW-Simulator und HW machen im Simulator.
    Zum PSR10 steht da eigentlich: "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." Also wird es schon im echten µC gesetzt aber dann sofort (nach Reset) gelöscht.


    Wenn TSM = 1 und PSR10 = 1 ist es richtig das PSR10 wieder 0 wird aber erst wenn der Prescaler auf 0 wechselt, welches intern mit einer Negation in der HW verschaltet ist denn man sichert sich 100%ig ab in der HW das diese HW-Funktion auch ausgeführt wurde.
    Nach meinen Versuchen nicht im Simulator, sondern an einem ATtiny45 bleibt das PSR stehen, solange das TSM steht. Man kann das mit Ausgabe des GTCCR am seriellen Monitor anzeigen lassen.

    Hast Du genauere HW Infos zu den µC als das Datenblatt? Meine Infos und Rückschlüsse stammen aus dem Datenblatt und Versuchen dazu.


    https://www.mikrocontroller.net/topic/45304
    Dann weis man wie uralt der T13 ist.
    Und der TO war da anscheinend auch schon beteiligt ...

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von Bernd_Stein
    Registriert seit
    19.09.2008
    Ort
    Deutschland : Nordrhein-Westfalen ( NRW )
    Alter
    49
    Beiträge
    401
    Zitat Zitat von Searcher Beitrag anzeigen

    Und der TO war da anscheinend auch schon beteiligt ...

    Gruß
    Searcher
    Ja, stimmt in dem genannten µC.net-Beitrag war ich es. Dass ich dies damals anscheinend theoretisch begriff nur jetzt irgendwie nicht stimmte, machte mich mächtig verwirrt.
    Der Grund war, genau der selbe Gedankenfehler ( siehe Rot ).

    Zitat Zitat von Searcher Beitrag anzeigen

    Ich versuch mal zu beschreiben, wie ich die Taktversorgung des/der Timer sehe:
    http://ww1.microchip.com/downloads/e...oc/doc8126.pdf
    Seite 78 oben
    Figure 12-2. Prescaler for Timer/Counter0

    Es gibt einen Prescaler im AVR, der mehrere Taktausgänge hat. Die Ausgänge sind Takt/1, Takt/8, Takt/64, usw vermutlich nach AVR Typ variabel.
    Takt/1 geht nämlich am Prescaler vorbei und so konnte ich den Timer0-Takt natürlich niemals aussetzen lassen bzw. hierüber stoppen.

    Den Codeauszug ( Neustart2: ) habe ich hierher. Das war der einzige Codeschnipsel den ich in AVR8ASM gefunden hatte, deshalb hatte ich ihn im Orginal belassen :

    http://www.gsc-elektronic.net/mikroe...ner_gesamt.pdf

    Dies sollte also reichen und nun in der richtigen Reihenfolge sein, wenn ich alles richtig verstanden habe :
    Code:
    ldi rmp,1<<TSM|1<<PSR10
    out GTCCR,rmp
    clr rmp
    out TCNT0,rmp
    out GTCCR,rmp
    


    Danke euch beiden. Denke meine Fragen hierzu sind super beantwortet worden.

    Bernd_Stein
    CRS Robotics A255, TRONXY X3A, TinkerCAD, c´t-Lab, ProfiLab Expert, AVR8 Assembler

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.617
    Blog-Einträge
    133
    Zitat Zitat von Bernd_Stein Beitrag anzeigen
    Takt/1 geht nämlich am Prescaler vorbei und so konnte ich den Timer0-Takt natürlich niemals aussetzen lassen bzw. hierüber stoppen.
    Stimmt. Hab ich noch gar nicht richtig realisiert. Ist aber in "Figure 12-2. Prescaler for Timer/Counter0" gut sichtbar dargestellt.


    Den Codeauszug ( Neustart2: ) habe ich hierher. Das war der einzige Codeschnipsel den ich in AVR8ASM gefunden hatte, deshalb hatte ich ihn im Orginal belassen :

    http://www.gsc-elektronic.net/mikroe...ner_gesamt.pdf

    Dies sollte also reichen und nun in der richtigen Reihenfolge sein, wenn ich alles richtig verstanden habe :
    Code:
    ldi rmp,1<<TSM|1<<PSR10
    out GTCCR,rmp
    clr rmp
    out TCNT0,rmp
    out GTCCR,rmp
    Das gefällt mir viel besser als das Original

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

Ähnliche Themen

  1. [ERLEDIGT] Kann Register nicht beschreiben - AFIO_MAPR - AF remap and debug I/O config register
    Von arwar52 im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 14
    Letzter Beitrag: 10.05.2019, 14:28
  2. Attiny13a RS232
    Von flecralf im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 09.10.2013, 18:27
  3. Frage zu Shift Register
    Von Scarabol im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 23.10.2009, 06:31
  4. TWI-Datenbus--> Frage zum TWDR-Register
    Von rema00 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 01.03.2006, 08:53
  5. Frage zu Timer1 Register
    Von michaelb im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 18.12.2005, 11:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •