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
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
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
@ 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.
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?
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?
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
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
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.
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)
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!
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
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
externunsignedinti;
2
externcharBuffer;
Kann ich das so vor dem main als global deklarieren?
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.
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.
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)
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
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.
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
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.
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
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.
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
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