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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christoph M. (chrito)


Bewertung
0 lesenswert
nicht 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


Bewertung
3 lesenswert
nicht 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. (achs)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.