www.mikrocontroller.net

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


Autor: andy c (Gast)
Datum:

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

Autor: Thomas Burkhardt (Gast)
Datum:

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

Autor: andy c (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
y = a * x + b:

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

Jetzt nur noch a und b ausrechnen, fertig.


Peter

Autor: andy c (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: andy c (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: andy c (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: andy c (Gast)
Datum:

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

Autor: andy c (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

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

MFG Uwe

Autor: Steffen (Gast)
Datum:

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

Autor: Andreas Kutschbach (Gast)
Datum:

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

Autor: Andy C (Gast)
Datum:
Angehängte Dateien:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Andy C (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

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.