mikrocontroller.net

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


Autor: Thomas H. (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Thomas H. (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Thomas H. (Gast)
Datum:

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

Autor: Günter König (Gast)
Datum:

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

Autor: Thomas H. (Gast)
Datum:

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

Autor: Günter König (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:
Angehängte Dateien:
  • AD.INC (260 Bytes, 95 Downloads)

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

Autor: Thomas H. (Gast)
Datum:

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

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.