Hallo, ich habe ein kleines Potiproblem mit dem ATMega16 und hoffe das mir jemand helfen kann. Zur Kontrolle gebe ich das geschobene 8Bit Signal an einen Port aus. Dort bekomme ich aber immer 255 angezeigt egal welche Potistellung. Wenn ich aber die Leitung zum ADC mit 10 kOhm gegen Masse belaste dann sehe ich das zumindestens mein Programm funktioniert. Das Ergebniss ist aber trotzdem ernüchternd da ich nur Werte zw. 170-255 erhalte. Ist das normal? Wenn ja müsste ich die Leitung noch weiter belasten bis ich auf 0 runterkomme. Hoffe mal nicht das das normal ist und das es ne simplere Lösung für mein Problem gibt. Auf eine Filterung habe ich gänzlich verzichtet, da es keine hohen Anforderungen an die Auflösung gibt und ich das springen per Software wegbekomme. Als Referenzspannung nutze ich die normalen 5V die wie auch die AVCC-Spannung mittels 10µH und 100nF gefilter sind und das ganze im Programm auch mittels REFS0=0 und REFS1=0 auf externe VREF umgestellt. A = 5Volt (Potityp 10 kOhm linear) | | ------->ADC0 | | E = GND
>Zur Kontrolle gebe ich das geschobene 8Bit Signal an einen Port aus.
Wie geschoben? ADLAR benutzt oder händisch geschoben?
Hallo Thomas, Ich wurde sagen,dass du der Poti nicht mit GND werbunden hast,und deswegen funtioniert er nur als enderbare Widerstand. Wenn du aber die Leitung ADC0 mit 10KOhm gegen masse belastest dann bildet sich ein Spannungsteiler(Poti 10K und R 10K) und deine Werte(170 bis 255) sind in ordnung. Also noch einmall die Schaltung prüfen. Branko
Und falls es noch möglich ist, A und E vertauschen, dann stimmt auch der Drehsinn. A ist nämlich "Anfang" und gehört auf GND, wenn Linksanschlag 0 entsprechen soll. E ist demzufolge "Ende", gehört ans "Maximum" und entspricht dem rechten Anschlag. Ansonsten meine ich auch, dass deine Schaltung nicht stimmt. Und das Programm vermutlich auch nicht. ...
>Wenn ich aber die Leitung zum ADC mit 10 kOhm >gegen Masse belaste dann sehe ich das zumindestens mein Programm >funktioniert. Spannung am ADC-Eiingang mal gemessen?
Naja, da scheint der interne PullUp auch noch eingeschaltet zu sein. ...
@HanneS
>Naja, da scheint der interne PullUp auch noch eingeschaltet zu sein.
Das kann auch sein und dann sucht man lange ;)
Bernhard
Hallo, hier ein ganz kurzer Auszug aus meinem Programm mit den wichtigen Teilen im Prinzip gebe ich das ganze an einen Port aus(JTAG ausgeschaltet) und wiederhole das ganze wieder. das mit dem Poti habe ich nochmal überprüft, die beiden Anschlüsse an welchen sich der Wiederstand nicht ändert( da sich ja der eine beim drehen erhöht und der andere verringert) habe ich an +5V und GND angeschloßen den anderen als Mittelabgriff zum µC geführt.
Das High-Byte solltest du nicht RORen sondern LSRn, denn mit ROR schiebst du dir das Carry wieder oben rein. Das hat aber in deinem Fall keine Auswirkung, da du das obere Byte ja wegwirfst. Durch Setzen von ADLAR in ADMUX und Auslesen von nur ADCH kannst du dir das aber sparen. Wenn du mal ins Datenblatt schaust, wirst du feststellen, dass man den ADC mit einem ADC-Takt von 50kHz bis 200kHz betreiben soll. Deine 7,812kHz liegen doch in diesem Bereich, oder? Du setzt ADIE in ADCSR, betreibst den ADC alsi im Interrupt-Mode. Ich kann in deinem Programm aber weder Interrupt-Vektoren noch eine ISR noch die globale Interrupt-Freischaltung finden. ...
ror temp2 ;Wandelt Ergebniss in 8bit um ror temp ror temp2 ror temp ;Ergebniss steht in temp besser wäre: LSR temp2 ;Wandelt Ergebniss in 8bit um ror temp LSR temp2 ror temp ;Ergebniss steht in temp
BTW: das ADC-Steuerregister heißt beim Mega16 ADCSRA und nicht ADCSR... So stehts auch in der m16def.inc
Sorry, ich nehme alles zurück und behaupte das Gegenteil... :) Denn ich habe mich auch bei ADIE verguckt. (schäm) Da scheint also noch mehr unstimmig zu sein. Ich frage mich nur, wie sich das (mit falschen Bezeichnern) im AVR-Studio assemblieren lässt? Wenn ich falsche Bezeichner schreibe (Tippfehler, falschen Namen im Hinterkopf), dann verweigert der Assembler die Arbeit und listet mir meine Fehler und Warnungen auf. Deshalb drücke ich auch nach wenigen neu eingetippten Codezeilen immer mal die F7-Taste, das zeigt mir nämlich meine Fehler. ...
Vielleicht postest Du mal den kompletten Code (v.a. den Anfang). Dann kann man ein bisschen mehr sagen. Wenn Du natürlich anstelle der m16def.inc irgendwas anderes .included hast, ist es kein Wunder, dass nix richtig läuft...
Hallo, also in meiner m16def.inc steht ADCSR wenn ich das ändere bringt das AVR-Studio ne Fehlermeldung, anscheinend gibt es da mehrere Versionen dieser m16def.inc. Hatte das ganze Ursprünglich mit 8 mHz also mit 62,5 kHz habe dann beim Umrechnen garnicht mehr dran gedacht das es zw. 50 und 200 kHz muss. Ja der ADC Interrupt ist ausgeschalten. Wie schalte ich die Pullups aus? So wie ich den Poti dranhabe habe ich bei Linksanschlag eine niedrige Spannung und bei rechtanschalg ne Hohe (ca. 3,25 - 5,0V). Das ändern brachte auch nichts.
> also in meiner m16def.inc steht ADCSR wenn ich das ändere bringt das > AVR-Studio ne Fehlermeldung, anscheinend gibt es da mehrere > Versionen dieser m16def.inc. Jou, es gibt ja auch mehrere Assembler... > Wie schalte ich die Pullups aus? - Datenblatt aufrufen, - Control-f tippen, - "pullup" in die Suchmaske eintippen, - Enter drücken, - so oft F3 drücken, bis du eine vernünftige Erklärung findest. Oder gleich Nullen in den Port schreiben. ...
Beide Möglichkeiten haben funktioniert. 1. Nullen in den Port schreiben oder 2. Im SFIOR-Register das PUD-Bit setzen um generell alle Pullups zu deaktivieren. Ein Problem wäre gelöst. Die Routine zum Umwandeln habe ich mir abgeschaut, im Prinzip ist es mir aber egal ob mit ror oder lsr sind so oder so 4 Takte deswegen sehe ich keine vor oder Nachteil. Habe das ganze jetzt aber mit dem sbi ADMUX, ADLAR reingemacht so kann ich auf diese Schieberei ganz verzichten. Danke nochmal an dieser Stelle. Aber das eigentlich Problem besteht noch immer. Da ich da eh nicht soviel Ahnung habe würde mir eine Empfehlung genügen was für ein Poti ich nehmen soll. Ich denke das das 10kOhm Poti viel zu niedrig dimensioniert ist, weil der ADC ja nen Eingangswiderstand von 100 MOhm hat. Deswegen wird es warscheinlich auch besser, sobald ich den Mittelabgriff mit einem Pulldown belaste. Umso größer ich die Last mache desto weiter komme ich zur gewünschten Null-Spannung beim Linksanschlag (A und E war nicht vertauscht).
Also wenn ich ein Poti an den AVR-ADC anschließe, dann bekomme ich Werte von 0 bis 255 bzw. 0 bis 1023. Da brauche ich keine Pulldowns oder Pullups oder sonst irgendwelche Korrekturen. Du machst also noch irgend etwas anderes grundlegend falsch, was du uns verheimlichst. Die Pullup-Deaktivierung mittels PUD ist eine heikle Sache, denn ich bin eigentlich ganz froh, dass es die Pullups gibt. Und bei einem Port, den man selbst während des ganzen Programms (nach dem Init) nie verändern muss, weil man die ADC-Quelle mittels ADMUX selektiert, da sollte es kein Problem sein, in PORTx und DDRx eine 0 (oder das benötigte Bitmuster) zu schreiben. Achja, ich nehme meist Potis mit 22k oder 47k. Ich schließe sie zwischen GND und (A)VCC an und lege den Schleifer an den ADC-Pin. An AREF liegt dann ein C von 100nF gegen GND, die Referenzspannung ist (bei Potibetrieb) auf (A)VCC geschaltet. ...
ja die Spannung entspricht genau den dig. Werten die der ADC ausspuckt.
> ja die Spannung entspricht genau den dig. Werten die der ADC > ausspuckt. Das war jetzt Rückwärtslogik, oder? Der ADC-Wert hat der angelegten Spannung zu entsprechen. Entspricht denn die Spannung (und damit der ADC-Wert) der Winkelstellung des Potis? Wenn nicht, dann ist deine Potibeschaltung falsch oder dein Poti ungeeignet oder kaputt. Ein kurzzeitiger falscher Anschluss an 5V ("mal probieren") kann das Poti schon zerstören. ...
habe noch ein 3tes identisches und jungfräuliches Poti vielleicht kann mir ja jemand sagen welcher Anschluß für 5V, GNG und für den µC gedacht ist. Die Bezeichnung lautet P6M-LIN 10K und ist bei Reichelt mit Datenblatt zu finden.
ja genau so habe ich es angeschlossen. Habe jetzt gerade das andere Poti angeschlossen und der Effekt ist genau der Gleiche. Es gibt 5V aus egal welche Stellung erst wenn ich ich die Leitung zum ADC mit 1kOhm gegen Masse belaste komme ich durch einen Linksdreh bis auf dez. 42 runter. Wie es scheint ist es also ne Sache des Poti-Wertes. Muss mich nochmal in den Foren umschauen was für Poti-Werte in der Praxis zum Einsatz kommen. Zur Sicherheit frage ich jetzt nochmal nach, nicht das ich das ganz anderst mache als ihr. Habt ihr die Pullups eingeschalten und das Poti zieht einen gewissen Teil gegen Masse runter oder habt ihr die Pullups aus und das Poti gibt einen gewissen Teil an den ADC? Mein erstes ADC Projekt am ATTINY26 funktionierte einwandfrei nur habe ich da keinen Spannungsteiler benutzt sondern einen Drucksensor der 0-5V lieferte.
Die Pull-Ups müssen aus sein. Der Wert von 10k sollte eigentlich kein Problem sein
2 Fragen: 1. ist es ein lineares Poti? 2. ist der entsprechende Portpin auf Eingang geschaltet (DDRX auf 0)? MW
Ich vermute ganz stark, dass du den Port auf Ausgang geschaltet hast. Schau dir mal das Register DDRA an. Oder den AREF ist nicht definiert. Wenn du den Pin offen lässt (nur C nach AGND), dann musst du intern auf VCC schalten. Das ist üblicherweise mit im Register ADMUX, obs beim Mega16 auch da ist, musst du im Datenblatt nachschlagen. ...
Mein Port ist schon auf Eingang geschalten, das wäre ja zu einfach gewesen ;-) Die Pullups habe ich auch aus. Ich gebe die externe Referenzspannung(mit kleinem Tiefpass wie für AVCC) an den AREF-Pin und habe im ADMUX-Register REFS0 und REFS1 gelöscht also auf externe Referenzspannung umgestellt. Also ich kann nicht glauben das es ne Softwaresache ist. Wenn ich nämlich am Poti (nicht am ADC angeschloßen) zw. der Mittleren Leitung und GND das Multimeter hänge dann habe ich dort auch 5V egal was für ne Stellung erst bei einer Belastung des Mittelabgriffes spuckt das Multimeter einigermassen korrekte Werte aus. Kann mir nicht vorstellen das ich 3 defekte Potis von Reichelt bekomme.
Ich vermute, dass einfach Poti-GND nicht mit ATmega-GND verbunden ist.Nimm dein Multimeter und überprüfe den Widerstand zwischen Poti-GND und ATmega-GND.Dann den Poti drehen ,Spannung auf ADC0 messen und beobachten. Ändert sich die Spannung am ADC0 zwischen 0 und VCC?
Das ist mir jetzt aber peinlich, habe tatsächlich auf dem Steckbrett ein Brücke für die Masseleitung falsch gesetzt wo die ganzen Potis an Masse hängen. Jetzt geht es ohne Belastung bis auf 0 runter. Danke nochmal für die unermüdliche Hilfe und die ganzen Tips die ich den Beiträgen entnehmen konnte.
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.