Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S64 - Auslesen des Last Converted Data Register


von Tim L. (oreas)


Lesenswert?

Hi,

Ich habe ein vermutlich relativ simples Problem:

Es geht um eine AD-Wandlung von einem Sensorwert von einem ADXRS300.
Nach der AD-Wandlung möchte ich gerne den Wert, der in dem Last 
Converted Data Register liegt in einer Variablen speichern um damit 
andersweitig zu arbeiten. Ich bin jetzt den ganzen Tag schon am suchen, 
ob es möglich ist den Wert aus dem Register auszulesen und in eine 
Variable zu speichern. Leider bin ich bisher nicht weiter gekommen und 
hoffe nun, dass einer von euch mir helfen kann.

Wäre für eine schnelle Antwort, vorzugsweise mit der Antwort "Ja, es 
geht so ..." dankbar. Für andere antworten auch ^^

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Tim L. schrieb:
> Ich bin jetzt den ganzen Tag schon am suchen,
> ob es möglich ist den Wert aus dem Register auszulesen und in eine
> Variable zu speichern.

Ja, was sollte man denn mit dem Wert sonst noch tun können wenn
nicht auslesen und abspeichern?

Was genau hast du denn versucht?

von Tim L. (oreas)


Lesenswert?

Hatte bisher versucht das Register direkt anzusprechen und in eine
1
unsigned int
 zu speichern. Der Compiler hat auch net gemeckert, aber funktioniert 
hat es trotzdem net. Stand immer nur der Wert 1023 oder bei einem 
anderen Versuch immer nur 0 drinne.

Mein letzter Versuch sieht momentan so aus:
1
value= AT91C_ADC_LDATA;

Was natürlich sein kann, ist, dass ich mich einfach ein bischen blöd 
anstelle und vor der Lösung seit gestern hocke ...

Als Anmerkung am Rande: ich bin noch nicht so erfahren im Programmieren 
von Controlern.

von hp-freund (Gast)


Lesenswert?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Tim L. schrieb:

> Mein letzter Versuch sieht momentan so aus:
1
value= AT91C_ADC_LDATA;

Das Register heißt aber AT91C_ADC_LCDR.  Wofür der Name ADC_LDATA
überhaupt gut sein soll, erschließt sich mir nicht, die Definition
lautet auf 0x3FF.  Da es sich um einen 10-bit-ADC handelt, soll
ADC_LDATA (bzw. ADC_DATA) möglicherweise als Maske gut sein.

Wenn du mehr als nur ein Register zugreifst, könnte es sich übrigens
lohnen, die Strukturvariante zu benutzen:
1
  AT91PS_ADC adcp = AT91C_BASE_ADC;
2
...
3
  value = adcp->ADC_LCDR;

So, wie ich die Architektur des ARM verstanden habe, ist es ziemlich
aufwändig, eine 32-bit-Zahl (bspw. halt die Adresse des ADC_LCDR)
in ein Register zu laden.  Hingegen liegen die Basisadressen der
einzelnen peripherals allesamt so, dass sie sich mit einem einzigen
Befehl in ein Register laden lassen, und der anschließende Struktur-
zugriff lässt sich ebenfalls vom Compiler gut als offset-indirekte
Adressierung umsetzen.

von Tim L. (oreas)


Lesenswert?

Hey,

vielen vielen Dank!!! Funktioniert so, wie ich es will. Nun kann ich 
weiter basteln ^^

Danke an alle, die mir helfen konnten.

@Jörg: Hatte mir das falsche Register rausgesucht. Mit deiner Lösung 
läufts jetzt einwandfrei.

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.