Forum: Mikrocontroller und Digitale Elektronik ADC-Ergebnis im freerun sicher lesbar?


von Christoph M. (chrito)


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

von Magnus M. (magnetus) Benutzerseite


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.

von A. S. (Gast)


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.

von jz23 (Gast)


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.

von Christoph M. (chrito)


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

von plautze (Gast)


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?

von Christoph M. (chrito)


Lesenswert?

ja, so hab ich's auch schon überlegt. Der messenden µC ist allerdings 
der Slave, nicht der Master. Das ist aufgrund der Hardware so.

von Falk B. (falk)


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.

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
Noch kein Account? Hier anmelden.