Forum: Mikrocontroller und Digitale Elektronik A/D-Wandler-Test mit Analogwert-Anzeige auf LCD


von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

bin noch ziemlich am Anfang mit µC und wollte mich nun am A/D-Wandler 
versuchen.
Meine Hardware:
µC: Atmega8 - funktioniert bis jetzt alles einwandfrei
LCD: 4-zeilig - funktioniert soweit auch, nur für die nachfolgende 
Fehlerschaltung nicht

http://www.alekto-programming.com/modules.php?name=Content&pa=showpage&pid=12
Habe mir als Test-Beispiel für den A/D-Wandler diese Tutorial Seite 
genommen und habe nun noch versucht den Analogwert auszugeben.

Das Tutorial-Programm an sich funktioniert auch nicht richtig, die 3 
LED's leuchten durchgehend... und bei meinem Zusatz mit dem LCD wird gar 
nichts angezeigt.

Ich finde soweit keine Fehler... aber das liegt glaub ich eher an meinem 
Nichtwissen.

Header File und Source File sind aus dem mikrocontroller.net-Tutorial.

Es wäre toll wenn ihr mir auf die Sprünge helfen könnt! Danke schonmal 
im Voraus für eure Hilfe!


Beste Grüße


Rob

von Flo (Gast)


Lesenswert?

Moin,

du machst die Ausgabe aufs LCD in der Funktion HINTER dem return.... Der 
Code wird also niemals ausgeführt.

Gruß,
Flo

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für deine Antwort Flo!
Dein Hinweis hat natürlich sofort Wirkung gezeigt, besten Dank.

Nun hab ich die abgeänderte C-Datei mit angehängt.
Mein Display zeigt nun permanent 1023 an. Bei Änderung der Poti-Stellung 
und neuem Brennen des Programms zeigt er auch 1023 an, also es ändert 
sich einfach nicht.


Wäre froh über jede Hilfe, dankeschön.


Gruß


Rob

von Flo (Gast)


Lesenswert?

Moin,

Ein Schaltplan wäre sinnvoll zur Fehlersuche...
Wie genau ist dein Potentiometer angeschlossen?
Im Kommentar der ReadChannel Funktion steht das die interne Referenz 
benutzt wird.
Wenn ja, dann solltest du auch diese Referenzspannung am Poti anliegen 
haben und nicht VCC des Controllers.
Besser wäre VCC als Referenz zu nehmen und das Poti dort auch 
anzuklemmen.

Gruß,
Flo

von Robert (Gast)


Lesenswert?

Also ich bin einer dieser Anfänger, die mit einem fertigen Board 
anfangen.
Habe ein Board von myavr.
Schaltplan ist hier:

-> 
http://www.myavr.info/download/produkte/myavr_board_mk2/techb_schaltplan-myavr-board-mk2-usb.png

Mein Poti liegt demnach an C0, habe auch nachgemessen, U verändert sich 
an C0.


Habe die Referenzspannung auf Vcc gelegt, mit Hilfe
1
 ADMUX |= (0<<REFS1) | (1<<REFS0);

Nun liegen 5V als Referenzspannung an Pin 20 und es wird weiterhin der 
Maximalwert von 1023 angezeigt.


Grüße,


Rob

von Karl H. (kbuchegg)


Lesenswert?

So wie Aref verschaltet ist, solltest du lieber 'externe 
Referenzspannung' auswählen.

von Route_66 (Gast)


Lesenswert?

Hallo!
So

>ADMUX |= (0<<REFS1) | (1<<REFS0);

setzt man nicht REFS1 auf Null.
Da aber der Reset-Zustand 0 ist, hat es hier keinen Einfluß.

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

@ Route_66: Vielen Dank für deinen Hinweis, habe meinen Mist sofort 
abgeändert!

@ Karl Heinz: Habe nun, wie im Anhang ersichtlich, die Referenzspannung 
auf extern geschaltet. Nun, wenn ich 5V an AREF anlege (Pin 21), gehen 
alle Lichter und mein Display aus. Irgendwas stimmt da nicht.



Freue mich schon auf meine Einzelteile, dass ich endlich unabhängig von 
dem Board bin... nervt mich schon.

von Karl H. (kbuchegg)


Lesenswert?

Robert schrieb:

> @ Karl Heinz: Habe nun, wie im Anhang ersichtlich, die Referenzspannung
> auf extern geschaltet. Nun, wenn ich 5V an AREF anlege (Pin 21), gehen
> alle Lichter und mein Display aus. Irgendwas stimmt da nicht.

Hmm.
Das sollte eigentlich nicht sein, auch wenn ich im Schaltplan nicht gut 
genug geschaut habe. Da ist ja gar kein Punkt auf der ARef Leitung und 
der senkrechten, in der die Spule sitzt. D.h. da liegt gar nicht extern 
Vcc an Aref an. Sorry, aber das hab ich gestern nicht gesehen (ist aber 
auch besch... gezeichnet)

Nichts desto trotz: Wenn du Aref per Programm auf extern stellst und an 
ARef 5V anhängst, darf da nichts passieren.

Richtigen µC-Typ in der Programmierumgebung eingestellt?
Kannst du überprüfen, ob du auch wirklich dein neuestes Programm in den 
µC geladen hast?

von Robert (Gast)


Lesenswert?

Ja es ist wirklich ziemlich unübersichtlich gezeichnet... bei 
Schaltplänen ist man anderes gewöhnt.
Kein Problem, ist ja nichts kaputt gegangen :)

Hab das eingestellte Device im AVR Studio und im Programmer (myavr...) 
gecheckt und in beiden ist der richtige eingestellt: Atmega8


Das Programm auf dem µC habe ich auch nochmal überprüft und es 
entspricht dem aktuellen Programm.

Kann es sein, dass da irgendwo eine weitere Definition des 
A/D-Einangspins fehlt, oder reicht die nachfolgende Zeile wirklich um 
Pin C0 als Eingang des Wandlers zu definieren?
1
  adc_value = ReadChannel(0);

von Jahat I. (jaib)


Angehängte Dateien:

Lesenswert?

Hallo,

bei meinem MK2 springt diese kleine Programm sofort an ... anbei die elf 
und der Code ... probier das mal die elf drauf zu flashen ... ich glaub 
nicht dass es an dem board liegt geht ja bei mir auch was soll an einem 
potentiometer am port C falsch sein?

Grüße Jahat

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Hey Jahat,

vielen Dank für die Antwort und das Programm!

Hab deine .elf draufgeschmissen, aber mein LCD zeigt dann lediglich den 
Wert "10?3" an. Ich kann drehen was ich will, aber es tut sich nichts.

Wenn du magst könntest du ja vll. mal meine .elf auf deinem Board 
ausprobieren.

Ich dachte nicht an einen Fehler beim Anschluss an C0, sondern rein die 
Definition im Programm. Ob dort praktisch nur diese eine Zeile reicht um 
"C0" als Eingang zu definieren.


Gruß


Rob

von Karl H. (kbuchegg)


Lesenswert?

Robert schrieb:

> Ich dachte nicht an einen Fehler beim Anschluss an C0, sondern rein die
> Definition im Programm. Ob dort praktisch nur diese eine Zeile reicht um
> "C0" als Eingang zu definieren.

Ja das reicht.

von Karl H. (kbuchegg)


Lesenswert?

Schmeiss doch noch mal dein Programm, sow wie es jetzt ist, auf den 
Markt. Das gibts ja gar nicht.

Die zu messende Spannung hast du direkt am µC-Pin gemessen (also nicht 
am Poti, weil du ja 'weißt', das da ein Draht hingeht)? Direkt mit dem 
Voltmeter am µC-Pin.
(Das hatten wir nämlich heute schon mal: Dreimal nachgefragt ob er die 
UART auch wirklich am µC Pin gemessen hat. Dreimal ja. Und im Endeffekt 
hat sich rausgestellt, dass er ganz woanders gemessen hat und implizit 
angenommen hat, dass die Verbindung zu seinem Messpunkt schon bestehen 
wird, was sie natürlich nicht tat).

ARef hast du jetzt wie beschaltet? So wie im Schaltplan weiter oben. 
D.h. keine externe Spannung an ARef. Wobei du, nachdem das Programm 
läuft, dort 5V messen können müsstest (weil per Programm 
draufgeschaltet)

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

Okay, gut wenn das i.O. ist, vielen Dank.

Habe jetzt mal alle 3 aktuellen Projektdateien angehängt. So wie sie 
jetzt hochgeladen sind, sind sie auf meinem µC.

Ja bin direkt mit dem Multimeter auf Pin 23 (PC0) gegangen und hab dort 
die anliegende Ausgangsspannung vom Poti gemessen.
(nur um den schlimmsten Fall von heute auszuschließen: U hat sich an Pin 
23 mit dem Drehen am Poti mitgeändert ;) )


Aref habe ich z.Z. gar nicht beschaltet, da ja wie beschrieben meine 
Spannung zusammenbricht sobald ich 5V auf Aref lege.
Wie im Programm ersichtlich, fahre ich zur Zeit auf AVcc und an Pin 20 
(AVCC) liegen 5V.

Mein LCD gibt immer noch "1023" aus, egal wie ich das Poti drehe.


Vielen Dank für eure tatkräftige Hilfe!

von NullAhnung (Gast)


Lesenswert?

moin

>>>
  char Buffer[20];      <<<<<<<<<<<<<<<<<<<<<<<<<<<<
  int i = adc_value;    <<<<<<<<<<<<<<<<<<<<<<<<<<<<

  utoa( i, Buffer, 10 );
  lcd_setcursor(0,1);
  lcd_string( Buffer );
 <<<<

Wo sind denn deine Variablen deklariert ?
Deklariere mal testweise am Anfabg deines Prg. die Variablen i und 
buffer als global !


mfg

von Robert (Gast)


Lesenswert?

Ahoi,


ich bin leider noch ziemlich neu bei den µC-Wissenschaften.
Wie genau deklariert man den eine Variable global?

Ich habe nur einen Lösungsansatz gefunden beim Stöbern:
1
 extern  unsigned int i;
2
extern char Buffer;


Kann ich das so vor dem main als global deklarieren?

von Karl H. (kbuchegg)


Lesenswert?

Robert schrieb:
> Ahoi,
>
>
> ich bin leider noch ziemlich neu bei den µC-Wissenschaften.
> Wie genau deklariert man den eine Variable global?

genau so, wie du die anderen auch deklariert hast.
(Du brauchst ein C-Buch)

> Kann ich das so vor dem main als global deklarieren?

Kann man.
Aber das ist nicht dein jetziges Problem.
Lass mich mal hier einen Testaufbau fertig machen, damit ich das mal in 
Aktion sehen kann.

von Robert (Gast)


Lesenswert?

Das hab ich mir schonmal überlegt mit dem C-Buch.. ist wohl wirklich mal 
nötig, da mir doch einiges fehlt an Sprache.


Okay, wow, vielen Dank. Da bin ich schon gespannt was bei dir rauskommt.

von Karl H. (kbuchegg)


Lesenswert?

Hmm.

Programm hat auf Anhieb funktioniert.

(Die LCD Routinen hab ich gegen meine ausgetauscht, aber dort sollte das 
Problem ja nicht sein. Ich wollte mir nur die Arbeit ersparen, deine 
Routinen an meine Belegung anzupassen)

von Jahat I. (jaib)


Lesenswert?

also in dem programm was ich dir geschicktz habe werden nur 8 bit werte 
angezeigt ... 1023 kann von meiner elf gar nicht aufs display kommen ... 
da ist irgendwas ganz gewaltig faul ... für mein prog musst du den 
jumper "READ" auf dem display auf "AUS" schalten ... hatte ich vergessen 
zu sagen hast mal die werte von der usart die ich sende am pc 
eingelesen?

gruß Jahat

von Purzel H. (hacky)


Lesenswert?

Der korrekte Weg sowas zu Debuggen ist die serielle Schnittstelle. 
Erstens sende Daten zum Controller und zeige sie auf dem Display an. 
Dann lasse wandeln und sende die Werte ueber die Schnittstelle. Wenn 
dann beides laeuft, dh der Wandler, und der Display, dann erst kann man 
die gewandelten Werte auf dem Display anzeigen. Alles vorher ist etwas 
auf der muehsamen seite.

von Robert (Gast)


Lesenswert?

Hmm.. komisch.. ich hab keinen Plan was ich falsch machen könnte.
Es ist alles richtig angeschlossen, die Spannung vom Poti steht auch an 
C0 an. Das Programm scheint auch nicht falsch zu sein.

Jetzt bleibt vielleicht noch die Fehlerquelle Programming Tool... ich 
muss ja mit dem myavr-ProgTool meinen Controller programmieren. Aber 
iwie glaube ich das auch nicht.

Sorry, aber mit UART o.Ä. habe ich noch keine Erfahrungen, da müsste ich 
mich erst reinarbeiten. Ich dachte ja nicht, dass das mit A/D-Wandler so 
schwierig sein könnte.




Grüße

Rob

von Karl H. (kbuchegg)


Lesenswert?

Robert schrieb:

> Jetzt bleibt vielleicht noch die Fehlerquelle Programming Tool... ich
> muss ja mit dem myavr-ProgTool meinen Controller programmieren. Aber
> iwie glaube ich das auch nicht.

Überprüf das mal.
Ist mir auch schon passiert, dass ich das falsche Hex-File in den µC 
geschossen habe.

Schreib ein Programm welches deine LED blinken lässt.
Reinbrennen und nachsehen ob sie wirklich blinken.


Dann würd ich folgendes machen:
Um Fehler in der Entwicklungsumgebung (irgendwo eine falsche 
projektspezifische Einstllung) auszuschliessen, fang ich einfach ein 
neues Projekt an. Kopiere den Source Code per Copy&Paste da hinein.

Auch das ist mir schon passiert, dass irgendwo eine falsche Einstellung 
parout nicht zu finden war (allerdings nicht im AVR-Studio). Neues 
Projekt angefangen, die notwendigen Änderungen gemacht und dann gings.

von Robert (Gast)


Lesenswert?

Vielen Dank für den Ratschlag, werde das mal versuchen!

von Robert (Gast)


Lesenswert?

So, hab das mal ausprobiert.

Hab ein Programm für die 3 LEDs geschrieben.. alles funktioniert 
einwandfrei.

UND

Ein neues Projekt gestartet, dort den Code reinkopiert und 
rübergeschickt.. aber leider das Gleiche wie vorher.


Also irgendwie hab ich wirklich großen Mist gebaut, ... sonst müsste das 
doch funktionieren.


Gruß

Rob

von Robert (Gast)


Lesenswert?

Falls noch jemand einen Rat, ich wär froh um irgendeinen Tipp.

Versuch mal das ganze auf meinem Breadboard aufzubauen.. mal sehen ob es 
da irgendwie geht.

von Dietrich L. (dietrichl)


Lesenswert?

Noch ein Versuch:
Um sicherzustellen, dass die LCD-Routine richtig geht, schreib mal statt
"int i = adc_value;" z.B. "int i = 15;" (irgend eine Konstante). Ändert 
sich die Anzeige entsprechend?

Gruß Dietrich

von Robert (Gast)


Lesenswert?

Hey Dietrich,

also hab die LCD-Ausgabe geändert, so wie du es beschrieben hast.

-> Mein LCD gibt die "15" aus. Also meine Routinen sind in Ordnung.

Dankeschön trotzdem für deinen Tipp!


Gruß


Rob

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.