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
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
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
y = a * x + b: -15 = a * 0 + b 50 = a * 1023 + b Jetzt nur noch a und b ausrechnen, fertig. Peter
das problem hier ist nur, dass man hierzu mit dem pic multiplizieren müsste! daher funktioniert dies hier ja auch nicht wirklich! oder?
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
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
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...
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
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
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
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
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
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
Hi! Ich dachte immer Carry wird generell bei Übertrag gesetzt. (20-25 = negativer Übertrag) Ist das beim Pic anders??? MFG Uwe
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
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.
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.