16Bit-(IO)Register - ja wie denn nun??

Dieses Thema im Forum "Hardware" wurde erstellt von LotadaC, 1. Juli 2018.

  1. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.913
    Zustimmungen:
    43
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Gerade im Datenblatt (42505D Seite 127) des Tiny102/104 drüber gestolpert:
    Das widerspricht sich doch, oder?

    Im ersten Teil steht doch quasi, daß das jeweilige High-Register an ein temporäres Register gekoppelt ist, und der Zugriff auf das entsprechende Low-Register denselben Zugriff auf das High-Register auslöst.
    Beim Beschreiben des Low-Registers wird zeitgleich der bestehende (vorher dahin geschriebene) Inhalt des temp-Registers ins High-Register geschrieben.
    Beim Lesendes Low-Registers wird zeitgleich der Inhalt des High-Registers ins temp-Register übertragen, und kann folglich danach gelesen werden.

    Warum soll dann (in der Note) das Low vor dem High beschrieben werden???
    C&P-Fehler von X-Core-Datenblättern?
    (Bei den X-Cores scheint immer(!) zuerst auf das Low-Register zugegriffen werden zu müssen beim schreiben und beim lesen)

    (Beim Tiny4/5/9/10 und beim Tiny20 paßt die Note zur vorhergehenden Erläuterung)

    Anmerkung: Dieser Schreib-/Lesemechanismus verhindert inkohärente 16Bit-Register die entstehen könnten, wenn das Modul selbst (also der Timer) sie während des Zugriffes (zwischen den beiden Zugriffen) ändert (also zB inkrementiert - insbesondere mit Überlauf zwischen Low- und Highbyte).
    Er verhindert nicht, daß ein eventueller IRQ seinerseits Änderungen an irgendeinem 16bit-Register unter Verwendung des temp-Registers vornimmt, und dieses verändert.
    Zur Unterdrückung solcher Fehler müßte in der ISR entweder der Inhalt des temp-Registers gesichert und wiederhergestellt werden, oder besser (und allgemein üblich) jeder 16bit-Zugriff vor IRQs geschützt werden (indem währenddessen IRQs global unterdrückt werden)
     
  2. Dirk

    Dirk Administrator
    Mitarbeiter

    Registriert seit:
    28. Januar 2007
    Beiträge:
    4.172
    Zustimmungen:
    117
    Punkte für Erfolge:
    63
    Sprachen:
    C, Assembler, Pascal, C++, PHP, Java
    Das wird ein Fehler im Datenblatt sein.

    So wäre es richtig ...

    To perform a 16-bit write operation, the low byte must be written after high byte.
    For a 16-bit read, the low byte must be read before the high byte.
     
  3. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.913
    Zustimmungen:
    43
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Hatte ich auch spekuliert. Das Datenblatt ist von 2016, also recht aktuell. Insbesondere moderner als einige andere TPI-Tinies, bei denen es ja stimmt.

    Bei den X-Cores scheint es hingegen so zu sein, daß immer zuerst auf das lowest Byte zuzugreifen ist. Beim schreiben und beim lesen.
     
  4. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.913
    Zustimmungen:
    43
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    So, mal'n bisschen in meinem Archiv gewühlt:
    • 42505A von 2/16 ist korrekt
    • 42505C von 7/16 ebenso (die B-Revision scheine ich nicht zu haben)
    • 42505D von 10/16 weist den genannten Fehler auf
    Im Datasheet Revision History der D-Version:
    Da haben sie wohl den Fehler eingebaut.
    Was ist da eigentlich unter "New Section" zu verstehen? Vorher hieß es:
    (in der C-Version noch auf Seite 129)

    :stupid:
     
  5. Mikro23

    Mikro23 Mitglied

    Registriert seit:
    2. Januar 2017
    Beiträge:
    228
    Zustimmungen:
    18
    Punkte für Erfolge:
    18
    Sprachen:
    C, Assembler
    Vermutlich ein Fehler, wie Dirk schon sagte. Aber kein C&P-Fehler.
    Bei den Xmegas (und vermutlich auch bei allen anderen Xcores (hab nur bei einem nachgesehen)) sieht es so aus:
    Accessing16bitRegisters.png
    Die Note gibt es nur bei den älteren tinies und megas:
     
  6. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.913
    Zustimmungen:
    43
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Bei den X-Cores steht das als Unterpunkt der AVR-CPU (genauer AVR-CPU -> Functional Description -> Accessing 16bit-Registers) - also eher global im Datenblatt.
    Bei den non-X-Cores findet sich der Punkt bei jeder 16bit-Hardware (also bei jedem 16bit-Timer).
    Bei den non-X-Cores ist ...
    Bei den X-Cores hingegen ist die Kopplung davon abhängig ob gelesen oder geschrieben wird. Deswegen ist hier immer zuerst auf das low-Byte zuzugreifen.
    Und genau das sagt auch die (falsche) Note im D-Datenblatt des Tiny102/104 (ein non-X-Tiny):
    Bis zum C-Datenblatt des Tiny102/104 war es ja noch korrekt, irgendwer hat aus irgendeinem Grund zwischen Juli und Oktober 2016 genau zwei Sachen im entsprechenden Abschnitt geändert:
    • aus
      wurde:
      (Also einmal low und high getauscht)
    • Bei den Code-Examples wurde zweimal folgende Fußnote angefügt:
    Der gesamte Rest von Abschnitt 17.6. ist Wort für Wort identisch geblieben.
    In den Code-Examples wird übrigens die korrekte Reihenfolge eingehalten.

    Damit meinst Du alle non-X-Cores?
    2016 ist ja noch nicht so lange her
     
    #6 LotadaC, 1. Juli 2018
    Zuletzt bearbeitet: 1. Juli 2018
  7. Mikro23

    Mikro23 Mitglied

    Registriert seit:
    2. Januar 2017
    Beiträge:
    228
    Zustimmungen:
    18
    Punkte für Erfolge:
    18
    Sprachen:
    C, Assembler
    Ja, aber natürlich nur die knapp ein Dutzend, deren Datenblätter ich mir vor 2016 genauer angesehen hatte.
    Hatte mich mal interessiert, was die so können, habe mich aber vorwiegend mit Xmegas beschäftigt.
    Da hat wohl jemand 'n Praktikanten rangesetzt, der noch keine Ahnung hatte... ;)
     
  8. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.913
    Zustimmungen:
    43
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Ich häng mal noch was dran, betrifft allerdings den Analog Comperator…
    Bei den Features findet man:
    Bei der Erklärung des Blockdiagrammes ferner:
    Sinngemäß steht beim Power Reduction Register (PRR) dasselbe:
    Ok, soweit sogut. Man kann ja bei diversen Controllern statt eines festen Ain-Pins den Ausgang des ADC-Muliplexers auf den negativen AC-Eingang schalten. Aber da findet sich dann üblicherweise auch irgendwas zum Auswählen dieses Einganges - ein Analog Comperator Multiplexer Enable - bit (ACME) zB (da muß(!) dann übrigens der ADC abgeschaltet sein (ADEN)).

    Beim Tiny102/104 finde ich weder ein ACME, noch irgendeinen Analog Comperator Negative Input Multiplexer (bereits im Blockdiagramm ist nur der positive "Multiplexer" mit der Bandgap vorhanden) - nur eben die genannten Andeutungen WANN ADMUX als AC-Eingang genutzt werden könnte oder nicht... aber eben nicht WIE...

    P.S. @Mikro23 : bevor Du jetzt nochmal mit dem "Stift" kommst - das ist bereits in den älteren Versionen so

    Edit: Bei der Conversion Time des ADC (Seite 172) gibt's auch noch diese Fußnote:
    Öhm... der hat doch gar keinen...
     
    #8 LotadaC, 2. Juli 2018
    Zuletzt bearbeitet: 2. Juli 2018
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden