Forum: Mikrocontroller und Digitale Elektronik Poti-Problem am ATMega16


von Thomas O. (Gast)


Lesenswert?

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

von Rahul (Gast)


Lesenswert?

Programm her!

von Rahul (Gast)


Lesenswert?

>Zur Kontrolle gebe ich das geschobene 8Bit Signal an einen Port aus.

Wie geschoben? ADLAR benutzt oder händisch geschoben?

von Branko Golubovic (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Bernhard S. (bernhard)


Lesenswert?

>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?

von Hannes L. (hannes)


Lesenswert?

Naja, da scheint der interne PullUp auch noch eingeschaltet zu sein.

...

von Bernhard S. (bernhard)


Lesenswert?

@HanneS

>Naja, da scheint der interne PullUp auch noch eingeschaltet zu sein.

Das kann auch sein und dann sucht man lange ;)

Bernhard

von Thomas O. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Bernhard S. (bernhard)


Lesenswert?

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

von johnny.m (Gast)


Lesenswert?

BTW: das ADC-Steuerregister heißt beim Mega16 ADCSRA und nicht ADCSR...
So stehts auch in der m16def.inc

von Hannes L. (hannes)


Lesenswert?

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.

...

von johnny.m (Gast)


Lesenswert?

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...

von Thomas O. (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von Thomas O. (Gast)


Lesenswert?

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).

von Hannes L. (hannes)


Lesenswert?

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.

...

von Christian Rötzer (Gast)


Lesenswert?

Hat er jetzt die Spannung schon mal mit einem Multimeter gemessen?

von Thomas O. (Gast)


Lesenswert?

ja die Spannung entspricht genau den dig. Werten die der ADC ausspuckt.

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von Thomas O. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Branko Golubovic (Gast)


Lesenswert?

VCC-ADC0-GND

von Thomas O. (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

>Habt ihr die Pullups eingeschalten

Die müssen abgeschaltet sein !!

von johnny.m (Gast)


Lesenswert?

Die Pull-Ups müssen aus sein. Der Wert von 10k sollte eigentlich kein
Problem sein

von Michael Wilhelm (Gast)


Lesenswert?

2 Fragen:
1. ist es ein lineares Poti?
2. ist der entsprechende Portpin auf Eingang geschaltet (DDRX auf 0)?

MW

von johnny.m (Gast)


Lesenswert?

P6M-LIN 10K sagt eigentlich alles, gell?

von Hannes L. (hannes)


Lesenswert?

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.

...

von Thomas O. (Gast)


Lesenswert?

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.

von Branko Golubovic (Gast)


Lesenswert?

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?

von Thomas O. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.