mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Poti-Problem am ATMega16


Autor: Thomas O. (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programm her!

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Zur Kontrolle gebe ich das geschobene 8Bit Signal an einen Port aus.

Wie geschoben? ADLAR benutzt oder händisch geschoben?

Autor: Branko Golubovic (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Bernhard S. (bernhard)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, da scheint der interne PullUp auch noch eingeschaltet zu sein.

...

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@HanneS

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

Das kann auch sein und dann sucht man lange ;)

Bernhard

Autor: Thomas O. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Bernhard S. (bernhard)
Datum:

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

Autor: johnny.m (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: johnny.m (Gast)
Datum:

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

Autor: Thomas O. (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Thomas O. (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat er jetzt die Spannung schon mal mit einem Multimeter gemessen?

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja die Spannung entspricht genau den dig. Werten die der ADC ausspuckt.

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Thomas O. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Branko Golubovic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
VCC-ADC0-GND

Autor: Thomas O. (Gast)
Datum:

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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Habt ihr die Pullups eingeschalten

Die müssen abgeschaltet sein !!

Autor: johnny.m (Gast)
Datum:

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

Autor: Michael Wilhelm (Gast)
Datum:

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

MW

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P6M-LIN 10K sagt eigentlich alles, gell?

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Thomas O. (Gast)
Datum:

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

Autor: Branko Golubovic (Gast)
Datum:

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

Autor: Thomas O. (Gast)
Datum:

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

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.