Gerade im Datenblatt (42505D Seite 127) des Tiny102/104 drüber gestolpert:
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)
Das widerspricht sich doch, oder?Accessing the low byte triggers the 16-bit read or write operation: When the low byte of a 16-bit register is written by the CPU, the high byte that is currently stored in TEMP and the low byte being written are both copied into the 16-bit register in the same clock cycle. When the low byte of a 16-bit register is read by the CPU, the high byte of the 16-bit register is copied into the TEMP register in the same clock cycle as the low byte is read, and must be read subsequently.
Note: To perform a 16-bit write operation, the low byte must be written before the high byte. For a 16-bit
read, the low byte must be read before the high byte.
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)