ADC-Ergebnis im freerun sicher lesbar?

OP #5171597
Lesenswert?

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
Persönliche Seite #5171600
Lesenswert?

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.
Gast #5171603
Lesenswert?

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.
Gast #5171605
Lesenswert?

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.
OP #5171608
Lesenswert?

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
Gast #5171632
Lesenswert?

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?
#5171903
Lesenswert?

@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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren