Forum: Mikrocontroller und Digitale Elektronik Beim Auslesen des ADC in Schleife keine Werterneuerung


von Thomas H. (Gast)


Lesenswert?

Hallo,

wie noch in Auszuegen folgt habe ich ein Programm geschrieben u. a. um 
den ADC auszulesen. Durch einen rjmp-Befehl komme ich am Ende wieder an 
den Anfang des Programmes springt.

In der Simulation (AVR-Studio) werden bei jedem Durchgang neue Werte in 
die Register geschrieben (wenn sich diese aendern). In der Praxis aber 
sendet mir mein Controller jeweils immer nur den ersten eingelesenen 
Wert.

Woran koennte das liegen?

Anbei Auszuege:

; Initialisierung
; ---------------

ldi   all0, ((1<<ADEN)|(1<<ADSC)|(1<ADFR))+7
out   ADCSR, all0

ldi  all0, RAMEND
out  SPL, all0

input:

  ldi   all0, 0
  out   ADMUX, all0

  in   batl, ADCL          in  bath, ADCH
  ldi   all0, 1
  out   ADMUX, all0

  in   senl, ADCL
  in   senh, ADCH

  ldi   all0, 2
  out   ADMUX, all0

  in   widl, ADCL
  rcall  spg_category          rcall   sen_correct
ret


Vielen Dank,

Thomas H.

von Steffen (Gast)


Lesenswert?

Nach dem du einen anderen AD-Kanal ausgewählst, solltest du ne weile 
warten. Kannst also z.B. den ersten Wert auswerten und darstellen oder 
in ner Loop-Schleife ein bischen Zeit vergeuden.

von Thomas H. (Gast)


Lesenswert?

Ich habe mich getaeuscht. Mein Controller liesst ueberhaupt keine Werte 
ein. Woran kann das nun liegen. Ich habe eigentlich alles initialisiert 
(glaube ich). Was, das kann man ja oben sehen.

Weiss da jemand Rat?

Thomas H.

von Steffen (Gast)


Lesenswert?

Ist das ein schreibfehler von dir das bei der Initialisierung 
"...|(1<ADFR)..."
eine eckige Klammer fehlt?
Bei sowas schreib ich lieber die Bitfolge hin (0b11100111). Den 
Stackpointer würde ich als erstes setzen. Aber ob das dein Problem ist, 
kann ich nicht sagen.

Versuch doch mal nur einen Kanal auszulesen

.
.
.
ldi all0, RAMEND
out SPL, all0

ldi all0, ((1<<ADEN)|(1<<ADSC)|(1<<ADFR))+7
out ADCSR, all0
ldi all0, 0
out ADMUX, all0

input:

in batl, ADCL
in bath, ADCH
;do some blabla
rjmp input

von Thomas H. (Gast)


Lesenswert?

Hallo Steffen,

an der Klammer liegt es nicht. Ich habe auch schon die Bitfolge 
versucht. Das mit einem Kanal auch und den ganzen Controller habe ich 
auch schon gewechselt.

Durch Tests habe ich herausbekommen, dass bei einem Aufruf in die 
Register immer Nullen geschrieben werden (ADCL + ADCH). Vorherige 
Inhalte werden geloescht.

Ich weiss nicht mehr so recht weiter.

Kann es an irgendwelchen Interrupts liegen?

Tschau,

Thomas H.

von Günter König (Gast)


Lesenswert?

Hallo auch,
in der Codesammlung hier im Forum gibt es ein Listing für ADC Single und 
Free Run. Den schaue dir mal an.
Dann ist dir sicher geholfen.
Ach ja, welcher Controller ist das eigentlich?

Gruß,
Günter

von Thomas H. (Gast)


Lesenswert?

Hallo Guenther,

es handelt sich um einen AT90S2333. In der Codesammlung habe ich auch 
schon nachgesehen. Etwas was 1:1 passen wuerde habe ich nicht gefunden 
aber dennoch recht hilfreiche Tipps. Ich habe auch schon solche Listings 
eingebaut, aber es hat trotzdem nicht funktioniert. Darum suche ich nach 
wie vor nach einem auf das noetigste abgespeckte Programm wo ich genau 
sehe worauf es ankommt bzw. vor allem was ich vorher initialisieren 
muss.

Ich bin fast schon mit meine  Ideen am Ende.

Viele Gruesse,

Thomas H.

von Günter König (Gast)


Lesenswert?

Hallo auch,
habe grade was in die Codesammlung gepostet. Diese Routine haut hin, 
achte aber auch auf den Nachtrag. Probiers mal aus.
Bei Fragen, fragen!

Gruß,
Günter

von Steffen (Gast)


Angehängte Dateien:

Lesenswert?

Deine Initialisierung ist schon IO.
Bei mir funktionierts so jedenfalls. Hab dir aber mal meine AD.INC 
angefügt.
Mit ad_init wird der freerun-Modus ausgewählt und die AD-Wandlung 
gestartet, sowie Kanal 0 ausgewählt.
Nach dem Umschalten der Kanäle muss ich aber ne weile warten. Währe zwar 
nicht schlecht, wenn man sofort die Werte des anderen Kanals bekommen 
würde, aber man kann die Zeit ja auch sinnvoll einsetzen. Beispielsweise 
im SRAM zwischenspeichern, mathematische Funktionen Aufrufen...etc.

von Thomas H. (Gast)


Lesenswert?

Vielen Dank fuer die zahlreiche Mithilfe und Beteiligung!

Ich habe jetzt die beiden oberen Codes von euch 1:1 uebernommen und es 
funktioniert. Ich weiss zwar immer noch nicht warum meines nicht 
funktioniert hat, da es am Ende eigentlich das Gleiche (od. Selbige) war 
- aber es geht jetzt.

Meine Fehlersuche hat nun etwas mehr Zeit.

Nachmals vielen Dank und das ist ein tolles Forum,

Thomas H.

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.