Forum: Mikrocontroller und Digitale Elektronik ad-wert ausgabe an lcd


von andy c (Gast)


Lesenswert?

hallo zusammen

bin gerade dabei mir ein thermometer zu baseln mit einem 16f876. anzeige 
über ein hd-44780 basiertes LCD.

mein problem ist jetzt; wie soll ich den ad-gewandelten wert weiter 
verarbeiten.

auf eine Riesentabelle wo ich jedes einzelne bit des wertes abfrage, hab 
ich eigentlich weniger lust..wären ja etwa 1024 möglichkeiten!!(10Bit 
A/D)

hat jemand von euch schon erfahrungen damit gemacht??

danke schon im voraus für eure mithilfe..

andy

von Thomas Burkhardt (Gast)


Lesenswert?

Hallo,

prinzipiell gibt's zwei Möglichkeiten, um der gemessenen Spannung eine 
Temperatur zuzuordnen. Entweder eine Wertetabelle (wie du selber 
schreibst) oder durch einen entsprechenden funktionalen Zusammenhang. 
Damit kann man sich die Temperatur als Funktion der Spannung ausrechnen. 
Kommt jetzt sehr stark auf den Sensor und den Temperaturbereich an, wie 
komplex diese Funktion sein muss. Im einfachsten Fall reicht bereits 
eine Gerade mit zwei Parametern, die zum Sensor gehören.


Viele Grüße

von andy c (Gast)


Lesenswert?

also der Temperaturbereich liegt zwischen -15 und 50 °C
wobei -15 -> 00 0000 0000 und 55 -> 11 1111 1111 entspricht!

Wir erhalten im Pic diesen Binären Code und müssen Ihn jetzt so 
umwandeln, dass wir Ihn per ASCII-Code am Display ausgeben können.

Hm ich blicke hier leider noch nicht ganz durch ;)

Danke schon mal

von Peter D. (peda)


Lesenswert?

y = a * x + b:

-15 = a * 0 + b
50 = a * 1023 + b

Jetzt nur noch a und b ausrechnen, fertig.


Peter

von andy c (Gast)


Lesenswert?

das problem hier ist nur, dass man hierzu mit dem pic multiplizieren 
müsste! daher funktioniert dies hier ja auch nicht wirklich! oder?

von Steffen (Gast)


Lesenswert?

Warum soll das nicht funktionieren? So schwer ist es doch nicht zu 
multiplizieren. Z.B. 5*22 = 22+22+22+22+22 oder 
5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5+5.
MfG
Steffen

von Peter D. (peda)


Lesenswert?

Kommt drauf an.

MCs sind ja dazu geboren, um zu rechnen. Und was sie nicht in einem 
Schritt machen können, machen sie eben in mehreren. Geht immer noch fix 
genug.


Z.B. für den AVR / 8051 findet man reichlich Multiplikationsroutinen im 
Web, müßte es also auch für den PIC geben.


Ansonsten geht auch die brutale Methode: Addieren, bis der Arzt kommt:

for( produkt = 0; faktor1; faktor1-- )
  produkt += faktor2;



Peter

von andy c (Gast)


Lesenswert?

ja na gut..

angenommen ich würde die additionsmethode nun verwenden. trotzdem müsste 
ich diese dezimale zahl die ich nun erhalte (mit funktionen)noch in asci 
an das lcd weitergeben.. oder?
dazu fällt mir mommentan auch nur "tabelle" ein...

von Steffen (Gast)


Lesenswert?

Ne, nix Tabelle. Du zerlegst einfach das Ergebnis mit der 
Subtraktionsmethode in Einer, Zehner, Hunderter etc., addierst 0x30 dazu 
und hast die einzelnen ASCII-Zeichen.

In der Codesammlung findest Du ein Beispiel für einen Kurzzeittimer mit 
dem 16F876. Dort werden zwar nur Zahlen von 0..99 ausgegeben aber das 
Prinzip ist das selbe.

MfG
Steffen

von andy c (Gast)


Lesenswert?

hallo steffen

hab mir dein code mal angesehen. sieht so aus als ob du dich schon 
länger mit pics beschäftigst..leider ist genau die stelle 
(HexDec/ZahltoLCD) welche für mich relevant ist nur wenig kommentiert!!

könntest du mir bitte deine einzelnen schritte etwas genauer erläutern??

vielen dank für deine hilfe

von Steffen (Gast)


Lesenswert?

Hallo Andy,

Ich hab die Zeilen etwas kommentiert und mit zu dem Beitrag in der 
Codesammlung gepackt. Wenn noch Fragen offen sein sollten dann frag 
einfach.

MfG
Steffen

von andy c (Gast)


Lesenswert?

Hey Steffen...

Danke für die schnelle Hilfe :)

Aber natürlich funktioniert es immer noch nicht so ganz ;)

Hab jetzt einiges ausprobiert und bin Schritt für Schritt durch dein 
Proggy gegangen.

Den Ablauf und die Funktion verstehe ich jetzt klar.

Jedoch bleibt er bei meinem Programm immer in der einen 
Schleife!(NextSub)

Meine Überlegung:

Du setzt oben ja das Carry Bit.. dann überprüfst du ob es 0 wird. (Dies 
sollte passieren sobald Hexzahl - 10 = neg. Wert ist) Jedoch bin ich mir 
nicht sicher ob er dann das Carry Bit wechselt, also von 1 -> 0 oder ob 
er es einfach auf 1 lässt! weil dann würde er ja nie springen und immer 
in dieser Schleife bleiben oder?

Wäre super wenn du hier ne Erklärung hättest.

Grüsse
Andy

von andy c (Gast)


Lesenswert?

So ich bins nochmal..

das ganze hat mir jetzt dennoch keine Ruhe gegeben und hab mich nochmals 
über das Carry Bit schlau gemacht.. und somit konnte ich mir meine Frage 
selber beantworten ;)

D.h. wenn eine subtraktion (z.b. 20-25) einen neg. Wert gibt, so wird 
das Carry Bit gelöscht! sollte also funktionieren.. hm geht bei mir aber 
nicht.. grr hast du ne lösung?

greets

von Steffen (Gast)


Lesenswert?

Wenn das Programm hängen bleibt, dann wird das Carry-Flag nie gesetzt. 
Bei meiner Routine wird das Ergebnis der Subtrktion in w! gespeichert. 
Vergisst Du evtl. w dann wieder (also vor der nächsten Subtraktion) 
zurückzuladen? Kommt evtl. ein Interupt dazwischen bei dem der Inhalt 
des w-Registers zerstört wird?

Wenn´s nichts von dem war stell doch mal deinen Code hier rein.

MfG

von Uwe (Gast)


Lesenswert?

Hi!

Ich dachte immer Carry wird generell bei Übertrag gesetzt.
(20-25 = negativer Übertrag) Ist das beim Pic anders???

MFG Uwe

von Steffen (Gast)


Lesenswert?

Jo,

C=1 --> Ergebnis positiv. Auch eine beliebte Stolperfalle wenn man 
vorher andere Prozessoren eingesetzt hat.

Daher war meine obige Antwort auch nicht ganz richtig. Es müsste 
Eigentlich heißen "Wenn das Programm hängen bleibt, dann wird das 
Carry-Flag nie gelöscht."

MfG Steffen

von Andreas Kutschbach (Gast)


Lesenswert?

Da ihr so schön elegant das Thema "Tabelle" umgangen habt,
möchte ich dieses nochmals anreissen:
Ich habe extakt das selbe wie andy_c vor, mache das
mit dem Mega8 und einem KTY-Sensor. Also fast identisch.
Nun habe ich schon selbst gesehen, dass man die
Berechnung nur mit Polynomen ab 4.Ordnung hinbekommt
(sofern man es auf <0,2K Fehler bringen möchte).
Ich weiss..Es gibt ja noch die abschnittsweise Linearisierung,
ich will das aber alles nicht. Lieber eine Tabelle:
Genauer gehts nicht. Da ich das aber noch nicht
gemacht habe, muss mir jemand helfen.


Wie man eine byte-Tabelle anlegt ist mir schon bekannt,
Wie man eine word-Tabelle anlegt dagegen nicht. Ich
brauche ja auch 10 bit Funktionswerte, welche ich der
Tabelle entnehme. Geht da mit .dw ? Wie macht der
lpm-Befehl das mit dem high/low-byte ? Kann das
sein, dass sowieso wordweise adressiert wird ?

Die Tabelle wäre dann 2048 bytes gross. Geht das denn ?

Okay, ich nehme an das geht, dann würde
ich also mit dem .dw Befehl 1024 Werte definieren.

Dann wäre das doch folgender Programmablauf:

--------------------------------------------
-> 10Bit ad-Wert in R16,R17 (o.Ä) holen
-> index=AD-Wert setzen
-> Tabellenwert[index] mit dem lpm-Befehl aus dem
   Speicher holen um diesen dann auszugeben
-> fertig
---------------------------------------------

Stimmt das so ? Vorschläge und Kritikpunkte sind
erwünscht.

Vielen Dank im Voraus.

von Andy C (Gast)


Angehängte Dateien:

Lesenswert?

Hey Leute..

Also ich habe das Proggy jetzt ein bischen weiter gebracht. Immerhin 
funktioniert jetzt die Zerlegung in Einer-Zehner-Hunderter! Und dies aus 
einem 10bit Register.

Jetzt möchte ich den Analogen Wert der von einem TemperaturSensor kommt 
(zwischen 0.5V - 2.5V) im Pic A/D Wandeln und zuerst mal direkt so 
ausgeben (später dann noch mit der Funktion um den Wert in °C 
auszugeben).

Jedoch funktioniert der A/D Wandler noch nicht so richtig. Die Routine 
um ihn zu starten usw. sollte alles da sein (siehe Anhang). Vielleicht 
findet Ihr ja den Fehler.
P.s. Vref+ = 2.5V ; Vref- = 0.5  (ist doch so, dass Vref+ = 11 1111 1111 
entspricht oder?)

greets andy

von Steffen (Gast)


Lesenswert?

Ich hab zwar mit dem AD-Wandler noch nichts gemacht aber laut Datenblatt 
ist bei 20MHz ist der AD Conversation Clock mit FOsc/8 wahrscheinlich 
etwas zu hoch. Setz doch einfach für den Anfang den höchsten Wert ein 
oder verwende den RC-Oszilator.

Das mit vref+ am Analogeingang sollte so hinhauen.
MfG
Steffen

von Andy C (Gast)


Lesenswert?

hallo..

10 steht laut datenblatt für FOsc/32.. (steht auch bei mir im Proggy) 
hab jetzt auch mal den rc-osc ausprobiert aber hab immernoch das gleiche 
problem..

danke trotzdem und hast du sonst noch irgendwas rausgefunden?

von Steffen (Gast)


Lesenswert?

Stimmt, da hab ich mal wieder die Bits verdreht. Wie gesagt mit dem ADC 
hab ich auch noch nicht gearbeitet. Es steht zwar momentan ein Projekt 
an aber hab leider noch keine Zeit dazu gefunden.

MfG
Steffen

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.