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
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
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
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
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
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.
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
> 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
alles klar, du meinst also, beide Varianten ausprobieren und die bessere verwenden... :)
> 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
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 :)
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
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?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.