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 ^^
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.