Forum: Mikrocontroller und Digitale Elektronik [newbie] Poti messen mit at89s52


von Karl W. (karlweber)


Angehängte Dateien:

Lesenswert?

So, ich habe mir gerade mal eine Kleinigkeit überlegt:
Ich möchte gerne den Poti p1 nutzen um eine Eingabe innerhalb eines
gewissen Wertebereichs ( z.B. 0 - 99) zu tätigen.

Kann ich so den Poti messen, oder ist die Schaltung schlecht?

* p2.0 auf 1 setzen (also Lesemodus für p2.0)
* über (p2.1 = high) den Transistor öffnen -> Kondensator wird geleert
Widerstand R3 verhindert Kurzschluss
* warten bis Kondensator geleert ist
* timer starten
* p2.1 auf low setzen (Transistor schließt)-> Kondensator wird geladen
* p2.0 in einer schleife auslesen bis der Kondensator sich auf einen
  bestimmten Grenzwert gefüllt hat (input p2.0 = high)
* timer auslesen
* Etwas Mathematik um geeignet zu skalieren

Oder habe ich einen groben Denkfehler in der Beschaltung? Die
Widerstandswerte habe ich jetzt pi mal Schnauze genommen, möchte halt
weder einen Kurzschluss (R3) noch den µC (R1) zerstören.

Gruß und Danke für Hilfe Karl

von peter dannegger (Gast)


Lesenswert?

Ob man damit 7 Bit Genauigkeit erreicht, ist sehr unsicher, da ja die
Schwellen und die internen Pullups stark Temperatur und
Betriebsspannungs abhängig sein dürften.


Ich würde aber einen P0-Pin als Eingang nehmen, dann fällt zumindest
der Fehler durch den Pullup weg.


Genauer gehts auf jeden Fall mit dem Komparator des AT89C2051 oder mit
nem 555.


Peter

von Bernhard S. (bernhard)


Lesenswert?

Hallo Karl,

>Oder habe ich einen groben Denkfehler in der Beschaltung?

Nein das Prinzip ist ok!

Gefällt mir.

Teste es mal und bericht uns.

Ich vermute der at89s52 hat keinen Analogeingang?

Bernhard


PS: man könnte den Transistor sogar noch einsparen und nur einen
einzigen PIN verwenden.

Dieser PIN hätte eine Doppelfunktion:

als Ausgang ===> um den Kondensator zu entladen
als Eingang ===> um High/Low zu bestimmen

von Karl W. (karlweber)


Lesenswert?

Danke für den Tipp mit p0, Peter, du hast natürlich recht, denn
ansonsten würde sich der Ladestrom für C1 ja aus der Summe der Ströme
durch Pullup- und Poti ergeben. Und wenn, wie du sagst Pullupwiderstand
stark temp und spannungsabhängig ist, ist es natürlich ungenauer. Ich
gehe sowieso davon aus, dass ich nach dem Starten wohl erst eine
Kalibrierung vornehmen muss...(oder ist dies in der Regel nicht
notwendig?)

Zu  deinem Vorschlag mit dem Analogeingang(Komparator):
Wie ich das Datenblatt verstanden habe, kann man den Komperator des
89c2051 nur intern Nutzen (Eingang p3.6), oder ist es möglich, das
Ergebnis auch ohne Nutzung des Chips als µC aussen abzugreifen? Den s52
würde ich jedoch gerne wegen der ISP-Programmierung nutzen.

Die Idee ohne Transistor, Bernhard, hört sich ebenfalls interessant
an.

Gesetzt den Fall, dass ich p0.0 verwende, brauche ich dann noch einen
Schutzwiderstand zwischen Kondensator und µC oder ist die Zeit des
Entladevorgangs so klein, dass es dem Controller nichts ausmacht?

Sehe ich es richtig, dass das neue Programm dann folgendes machen
müsste(Transistor entfällt bei diesem Beispiel)
Schutzwiderstand auf jedenfall in Reihe zum Poti (dass bei Stellung
poti P1= 0 Ohm) kein kurzschluss entsteht für den Fall, dass p0.0
geöffnet ist.

1. setze p0.0 auf low ( entlade Kondensator)
2. warte, bis Kondensator leer
3. starte timer
4.setze p0.0 auf high( Kondensator lädt sich auf und ich kann lesen)
5. polle solange, bis eingang p0.0 high



PS: Ich habe noch ein wenig Problem mit dem Lesen des Datenblattes
(at89s52) , was die Ströme in die Ports anbelangt. Unter anderem sind
keine Maximalangaben für port 0 angegeben. So verstehe ich insgesamt
noch nicht, wieviel Strom bei fließt bzw. fließen kann, wenn am Ausgang
eine 0 anliegt und der Kondensator gefüllt ist.

Danke fürs Lesen,
Gruß Karl

von Roland P. (pram)


Lesenswert?

Das sollte funktionieren. die machen das hier genau so:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Analog-Digital-Wandlung_ohne_internen_ADC

Gruß
Roland

von Karl W. (karlweber)


Angehängte Dateien:

Lesenswert?

Hallo Roland,

ich habe mich noch nicht mit dem AVR auseinandergesezt. Wenn ich mit
dem at89s52 arbeite kann ich jedoch nur eine 1 anlegen bzw. 0 anlegen.
Wenn ich eine 1 anlege, arbeitet er der Port gleichzeitig als Eingang.
In deinem Beispiel wird zum Lesen ein hochohmiger Zustand angelegt, so
dass  sich der Kondensator füllen kann. Würde ich mit dem at89s52 das
Bild aus dem Tut umsetzen, würde sich der Kondensator laden wenn ich
eine 0 anlege, sobald ich jedoch eine 1 anlege um zu lesen, würde er
sich doch wieder entladen. ( da der Kondensator zwischen VDD und dem
Ausgang (in diesem Fall high) liegt)

Ich habe nocheinmal das Schaltbidl angehängt, wie ich es mir im
vorherigen Beitrag vorgestellt hatte, nachdem Bernhard mich darauf
hinwies, das es ohne Transistor geht. Ähnnlich wie der Tipp in deinem
Tutorial, nur eben muss ich den Kondensator zwischen Masse und den Port
hängen.

Naja, ich bin mal gespannt, ob ich das irgendwann lerne...
Aber interessant finde ich es.

von Bernhard S. (bernhard)


Lesenswert?

Hallo Karl,

>Ich habe nocheinmal das Schaltbidl angehängt

Das Schaltungsprinzip ist ok, würde funktionieren, bei richtiger
Dimensionierung würde der µC keinen Schaden nehmen,

aber wann könnte man eine größere Genauigkeit erreichen?


A: Wenn beim Mess-Zyklus die Spannung am Pin ansteigt und man auf das
HIGH wartet

B: Wenn beim Mess-Zyklus die Spannung am Pin fällt und man auf das
LOW wartet


Bernhard

von Karl W. (karlweber)


Lesenswert?

mmh... sorry, versteh diesen Gedanken gerade nicht

von Bernhard S. (bernhard)


Lesenswert?

> versteh diesen Gedanken gerade nicht

In Deinem Beispiel (Bild "Schaltung2.jpg") wird der C durch das
Potentiometer aufgeladen,
d.h die Spannung am PIN steigt wärend des Mess-Zykluses.

Das ganze geht auch andersrum, brauchst nur mal gedanklich Poti und C
zu tauschen.

Interessant ist die Spannung am PIN, wo der µC einen HIGH/LOW-Wechsel
erkennt.
Sinnvoll wäre es für die Genaugigkeit, das Verfahren zu wählen, wo so
spät wie möglich ein HIGH/LOW bzw LOW/HIGH - Wechsel erkannt wird.

Bernhard

von Karl W. (karlweber)


Lesenswert?

alles klar, du meinst also, beide Varianten ausprobieren und die bessere
verwenden... :)

von Bernhard S. (bernhard)


Lesenswert?

> beide Varianten ausprobieren und die bessere verwenden

Oder vorher mal in das Datenblatt schauen,
und per Experiment die realen Werte des High/Low Übergangs ermitteln.

Und anschließend mit Papier und Bleistift rechnen ;)

Bernhard

von Karl W. (karlweber)


Lesenswert?

mein ich doch ;)

von karlweber (Gast)


Lesenswert?

So, lange Zeit ist verstrichen, ich habe endlich mal wieder meine
Schublade mit dem Elektronik zeug aufgemacht...


Inzwischen klappt es ganz gut, ich konnte die Schaltung, wie ich sie
auf dem Schaltbild gezeichnet hatte auf Anhieb laufen lassen und ich
bekomme auch Werte heraus, die mit der Potistellung korrelieren...

Ich werde demnächst dann mal testen, wie ich sowohl eine größere
Geschwindigkeite als auch die beste Genauigkeit erreiche. Insbesondere
deiner Frage, Bernhard werde ich dann auch noch nachgehen.

Ich bin zufrieden und das musste jetzt mal raus  :)

von Karl Weber (Gast)


Lesenswert?

Mal noch so ne Frage zum Verständnis:

Hier rufe ich noch einmal den Algorithmus in Erinnerung:

http://www.mikrocontroller.net/attachment/14714/schaltung2.JPG

1. setze p0.0 auf low ( entlade Kondensator)
2. warte, bis Kondensator leer
3. starte timer
4.setze p0.0 auf high( Kondensator lädt sich auf und ich kann lesen)
5. polle solange, bis eingang p0.0 high

Ich möchte nun mal die Zeit des Aufladevorgangs rechnerisch grob 
nachvollziehen.

Frage A)
Kann ich davon ausgehen, dass der Strom, der im input- Modus( p0.0 = 1) 
durch den Kondensator fließt vernachlässigbar gering ist? Immerhin ist 
ja kein interner Pull-up vorhanden.

Dann wäre die Formel für die Zeit nach den Gesetzen, die man für 
RC-Schaltungen im Internet findet doch (voraussgestzt ich lasse R1 mal 
weg):

tau = R*C = (R2 + P1 ) * C

Die Zeit, die der Kondensator lädt, bis er zur Umschaltspannung U_C 
kommt ist dann mit dem Gesetz
U_C = U - U * exp(- t/ tau)

t = - tau * ln( (U -U_C) /U )


Im Datenblatt habe ich keine Antwort gefunden:

Frage B)
Wenn ich die Schaltung nun ohne R1 zum Einsatz bringe und ständig den 
Kondensator über den Mikrocontroller ( p0.0) entleere, zerstöre ich dann 
den Mikrocontroller auf Dauer...

Hat der Mikrocontroller beim output- Modus(p0.0 = 0) einen 
Innenwiderstand?
Oder entlade ich den Kondensator über einen Kurzschluss.

Ich würde mich freuen, wenn ich auf Frage A) und B) eine Antwort bekäme.
Ich hoffe meine Überlegungen, die zu den Fragen führen waren 
einigermaßen verständlich und nachvollziehbar.

Gruß und Danke Karl




von Karl W. (karlweber)


Lesenswert?

Korrektur!!!!!

Ich habe mich dummerweise vorhin nicht richtig angemeldet, deshalb kommt
die Korrektur jetzt im nachfolgenden Posting :-/

>
> Frage A)
> Kann ich davon ausgehen, dass der Strom, der im input- Modus( p0.0 = 1)
> durch den ****Kondensator***** fließt vernachlässigbar gering ist? Immerhin ist
> ja kein interner Pull-up vorhanden.


Mit ****Kondensator***** meinte ich natürlich *port des
Mikrocontrollers*


Noch ein paar Fragen:
--------------------


Hier ist mal das Datenblatt des AT89S52 verlinkt:
http://www.atmel.com/dyn/resources/prod_documents/...


In Abschnitt 4.3 Port 0 steht:


Port 0 is an 8-bit open drain bidirectional I/O port. As an output port,
each pin can sink eight TTL
inputs. When 1s are written to port 0 pins, the pins can be used as
high-impedance inputs.

Was bedeutet in diesem Fall high-impedance? Kann ich daraus auf einen
Widerstand schließen? Ist dieser Widerstand gegen Masse oder VCC
geschalten?

In Abschnitt 27 steht:

input leakage current I_LI (Port 0)  ist  +/-10 µA

Was genau ist denn der leakage current (Leckstrom?) und könnte dies eine
Antwort auf meine Frage A)  sein?

von Ralf (Gast)


Lesenswert?

High Impedance heisst in diesem Fall, dass die internen Pull-Ups 
abgeschalten sind. Das bedeutet fürs Lesen, dass von extern ein High 
angelegt werden muss, um eine 1 zu lesen.

Ralf

von Karl W. (karlweber)


Lesenswert?

ok, danke für die Antwort, Ralf.

Mir hat das Dokument 8051 Hardware Manual von ATMEL geholfen
http://www.atmel.com/dyn/resources/prod_documents/doc0509.pdf

Anhand den Schaubildern im Kapitel 2.5 habe ich mir mal die interne 
Beschaltung der Ports angeschaut.
Insbesondere weiß ich nun, was es mit dem fehlenden internen Pull - up 
Widerstand beim Port 0 auf sich hat und ich habe grob verstanden, wieso 
man eine 1 an den Eingang des Latches anlegen muss, um den Port zu 
lesen.
Für alle, die es interessiert, lohnt sich ein Blick in dieses Dokument 
auf jeden Fall. Zusätzlich helfen die Folien 
http://robot.schoolnet.ir/download/Microcontroller%208051.ppt


Frage A) habe ich inzwischen experimentell gelöst.
Ich ließ einfach auf gut Glück den Widerstand R1 weg und habe reale 
Werte für
die maximale Zeit (R_Poti maximal) und minimale Zeit (R_Poti = 0) 
eingesetzt. Mit diesen zwei Gleichungen habe ich Werte für R2 und C 
herausbekommen.
Die  Bauteile habe ich ins Steckbrett eingesetzt und es hat beinahe 
exakt gestimmt.

Immerhin schaffe ich es, 200 Poti-Stellungs - Messungen pro Sekunde 
durchzuführen und habe auf dem Mikrocontroller noch genug Zeit, die 
gemessenen Potistellungen weiter als Midi codiert an meinen 
Gitarrenverstärker zu schicken.

Leider kann ich das zweite Posting in diesem thread von Peter Danneger 
bestätigen, dass es mit der Genauigkeit ein wenig hapert. Selbst 
zwischen zwei Messungen habe ich leichte Schwankungen.

Der nächste Schritt wird also sein, dass ich den Mittelwert über 3 
nacheinanderfolgende Messungen bilde.

Ausserdem werde ich mir noch eine Kalibrierungsfunktion programmieren 
müssen...


Frage B) habe ich noch nicht gelöst, allerdings hat ein 
"Langzeiteinsatz"  :-) von 30 Minuten bis jetzt keinerlei Probleme oder 
gar Zerstörungen hervorgerufen. Hoffe, dass dies so bleibt


Gute Nacht Gruß Karl

von Bernhard S. (bernhard)


Lesenswert?

Hallo Karl,

>Frage B)
>Wenn ich die Schaltung nun ohne R1 zum Einsatz bringe und ständig den
>Kondensator über den Mikrocontroller ( p0.0) entleere, zerstöre ich dann
>den Mikrocontroller auf Dauer...

Zerstören wirst Du den µC nicht gleich, aber der Entladestrom kann einen 
ziemlich hohen Wert annehmen, so dass ev. anderes nicht exakt 
funktioniert, z.B. die ADC Messung.

Gruß

Benhard

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.