Moin, hab hier einen XMega8e5. Der ADC läuft im freerun bei maximaler Geschwindigkeit (300kSps). Wenn ich jetzt das Ergebnis auslese (Register "res") und genau den falschen Augenblick erwische, hab ich dann nicht RESH von der einen, RESL von der anderen Wandlung? Falls dem so ist, was kann man dagegen machen? Finde nix dazu im Datenblatt oder irgenwelchen Posts... Danke! Christoph
Verwende doch einfach das richtige Datenblatt: http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42005-8-and-16-bit-AVR-Microcontrollers-XMEGA-E_Manual.pdf Zitat (Seite 13): For a read operation, the low byte of the 16-bit register must be read before the high byte. When the low byte register is read by the CPU, the high byte of the 16-bit register is copied into the temporary register in the same clock cycle as the low byte is read. When the high byte is read, it is then read from the temporary register. This ensures that the low and high bytes of 16-bit registers are always accessed simultaneously when reading or writing the register.
Falls es doch mal ein Problem sein sollte (z.B. mit externer Hardware), ein Workaround: zweimal auslesen. Wenn ungleich, dann noch ein drittes Mal auslesen. Wenn es in diesem Zeitfenster 2 Überläufe geben kann (z.B. durch Interrupts), dann dritten mit dem zweitem Wert vergleichen und bei Abweichung als ungültig markieren.
Ist vielleicht eine blöde Frage, aber warum nutzt du nicht den Interrupt zum lesen? Dann kann dir das doch sowieso egal sein, unabhängig davon, dass sowieso das höhere Register beim Lesen vom unteren gesichert wird, wie mein Vorredner schon anmerkte.
Danke, absolut klar jetzt! Also sorgt die Hardware mit dem temp-Register-Trick bereits dafür, das ich konsistente 16-Bit-Werte bekomme. :) Warum kein Interrupt: So wenig Last auf der CPU wie möglich, da ich die ADC-Ergebnisse per SPI abtransportiere. Der SPI-Bus läuft auch am Maximum und der SPI-Interrupt soll die CPU für sich haben. VG
Christoph M. schrieb: > Warum kein Interrupt: So wenig Last auf der CPU wie möglich, da ich die > ADC-Ergebnisse per SPI abtransportiere. Der SPI-Bus läuft auch am > Maximum und der SPI-Interrupt soll die CPU für sich haben. Warum dann nicht die, im ADC Interrupt ausgelesenen ADC Werte sofort hinterher im gleichen ADC Interrupt per SPI abschicken?
ja, so hab ich's auch schon überlegt. Der messenden µC ist allerdings der Slave, nicht der Master. Das ist aufgrund der Hardware so.
@Christoph M. (chrito) >Also sorgt die Hardware mit dem temp-Register-Trick bereits dafür, das >ich konsistente 16-Bit-Werte bekomme. :) In der Tat, das ist so oder so das große Thema wenn eine 8 Bit CPU 16 oder gar 32 Bit Werte atomar aus dem IO-Bereich lesen muss. Steht auch explizit im Datenblatt. >Warum kein Interrupt: So wenig Last auf der CPU wie möglich, da ich die >ADC-Ergebnisse per SPI abtransportiere. Der SPI-Bus läuft auch am >Maximum und der SPI-Interrupt soll die CPU für sich haben. Bei 300 ksps scheint mir ein Interrupt so oder so unsinnig bis unmöglich zu sein, da macht man alles in einer kompakten Endlosschleife bzw State machine. Viel mehr schafft die CPU da sowieso nicht. 300 ksps sind gerade mal 100 Takte bei 32 MHz CPU Takt.
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.