Forum: Mikrocontroller und Digitale Elektronik 8051 - Umrechnung und Ausgabe


von Thiemo (Gast)


Lesenswert?

Hallo

Ich sitz grad wieder vor meinem Projekt und hab ein Problem.

Ich möchte mit meinem Assembler, eingelesene Werte(Istwert) von 0 - 255
umrechnen und ausgeben.
Mein Problem ist, daß ich z.B. bei 3,55 Volt (Wert = 182)den Wert PH4,0
(berechnen? und) ausgeben muß und bei 2,28 Volt (Wert = 117) PH7,0. Das
heißt bei grosser Spannung ein kleiner PH-Wert und bei kleiner Spannung
einen grossen PH- Wert. Ich muß auch die Werte dazwischen ausgeben bzw.
berechnen.

Hat jemand eine Anregung oder Lösung für mich !

Im voraus DANKE !!!!!!!


Gruß
Thiemo

von Jörn Bögeholz (Gast)


Lesenswert?

Du musst doch nur Deinen eingelesenen Wert vom Maximalwert (hier 255?)
abziehen, dann ist der Wert schon einmal proportional zum ph-Wert. dann
brauchts Du nur noch den Faktor errechnen. (Falls der Zusammenhang
linear ist)

von Thiemo (Gast)


Lesenswert?

DANKE !!!

Ich steh direkt vor dem Wald und seh kein Baum !!!! :-)

Jetzt steh ich aber vor dem nächsten Problem. Ich hab die Rechnung
gemacht :

z.B. für PH-Wert 4.0

255 - 182 = 73

40 : 73 = 0,54794

Das 1. Problem : Wie kann ich die Kommazahl verarbeiten ?
                 Rechnung :
                 z.B. 140 x 0,54794 = .....

Das 2. Problem : Wie kann ich das Ergebnis als Kommazahl im Display

                 anzeigen lassen ?

Im voraus DANKE !!!

Gruß
Thiemo

von crazy horse (Gast)


Lesenswert?

ich hoffe, das soll mehr ein Spielzeug als ein Messgerät werden?
pH-Sonden sind ein ein ziemlich übles Zeug
-nichtlinear
-temperaturabhängig
-altern (Offset, Koeffizient)

Mit einer einfachen Linearanzeige wirst du nicht allzuviel erreichen.
Prinzipielle Demonstration ja, mehr nicht.

Zu deinen mathematischen Problemen:
am einfachsten besorgst du dir einen Compiler, was immer du magst.
Meist wird C vorgeschlagen und vehement als einzig glücklich machende
Sprache bezeichnet (ok, ich benutze es auch ausschliesslich), Basic
(Bascom) oder Pascal sind genausogut geeignet.
Dann kannst du ganz easy mit grösseren Zahlen oder auh Gleitkommazahlen
jonglieren.
In Assembler geht das natürlich auch, dafür solltest du dir aber
fertige librarys aus dem Netz suchen. Wenn es geht, vermeide ich auf
MCs float-Zahlen, fast immer kommt man mit Ganzzahl-Arithmetik zurecht.

In deinem Fall:
40 : 73 = 0,54794
Du multiplizierst die 40 beispielweise mit 10.000.
400.0000:73=5479. Bei der Ausgabe dann beachten, dass das alles
Nachkommastellen sind.

von JRB (Gast)


Lesenswert?

Die Nichtlinearität könnte man ja durch eine look-up-table eingrenzen.
Quasi kalibrieren. Sind ja nur 256 werte zu berücksichtigen. ;-)

Gruß
Jörn

von Thiemo (Gast)


Lesenswert?

Hallo und DANKE für die schnelle Antworten.

Erstmal muß ich sagen, daß ich froh bin, dieses Forum (durch Zufall)
gefunden zu haben.

Zu meinem Projekt:

Ich habe eine Industrie PH-Mess-Sonde der Firma Jumo, welche relativ
linear ist. In verschiedenen Temperaturbereichen hab ich sie noch nicht
ausprobiert.
Es soll kein "Spielzeug" sein, sondern ich möchte den PH-Wert eines
Aquariums messen und regeln.
Hierbei kommt es nicht auf die absolut genaue Messung an (+/- 0,2).

Und mein Programm hab ich auch schon fast fertig. Ich hab das Programm
im Assembler geschrieben und möchte, wenn es möglich ist dies auch
weiter machen.
Mein problem ist nun folgendes: Ich weiß nicht (und ich hab auch nichts
in meinen Büchern gefunden), wie ich diese Rechnung mit der Kommazahl
genau realisieren soll. Ich kenn mich noch nicht so gut mit Assemblern
aus. Aber was noch nicht ist, wird bestimmt noch werden. Und ich bekomm
ja genug hilfe von Euch ! Nochmals DANKE !!!

Zitat von crazy horse:

"In deinem Fall:
40 : 73 = 0,54794
Du multiplizierst die 40 beispielweise mit 10.000.
400.0000:73=5479. Bei der Ausgabe dann beachten, dass das alles
Nachkommastellen sind."

Der Wert 0,54794 bzw. 0,548 ist mein Faktor.
Den eingelesenen Wert y(z.B.182) * Faktor(0,548) = ....(PH-Wert4.0
ergibt "40" in der Anzeige; soll später als "PH 4.0" in der Anzeige
erscheinen).
Ich weiß nicht wie ich den eingel. Wert mit der kommazahl
multiplizieren kann !?!
Und wenn ich y(z.B. 182) * 548 = ...., entsteht doch ein Überlauf, oder
???
Ich hab das in meinem Buch so verstanden, daß ich nur von 0 - 255 habe
?!? Oder lieg ich da falsch ???

Bitte helft mir !!! Ich zerbrech mir die ganzen letzten Tage den Kopf
darüber und irgendwie steh ich auf dem Schlauch.

Gruß
Thiemo
E-mail: Suzi79@gmx.de

von crazy horse (Gast)


Lesenswert?

tja klar, du musst natürlich mit grösseren Zahlen als 8bit arbeiten, im
einfachsten Fall mit 16bit, wird bei dir wahrscheinlich ausreichend
sein.
Messwert z.B. 129 *40=5120/73=70 (pH7,0?)
Kannst es noch etwas genauer machen:
129*400/73=706, würde also auf pH7,1 gerundet.
Dabei kommst du aber mit 16bit schon nicht mehr aus, meist wird dann
32bit-Arithmetik gerechnet, in Assembler hindert dich aber niemand
daran, 24bit zu verwenden.
Wie ausgeben? Kommt auch auf die Art des Displays an. Auf jeden Fall in
Dezimalstellen aufteilen und das Komma an der richtigen Stelle setzen.

Aus welchem Grund willst du mit Assembler weitermachen?

von crazy horse (Gast)


Lesenswert?

PS: von welchem MS redest du eigentlich?

von Jörn Bögeholz (Gast)


Lesenswert?


von Peter Dannegger (Gast)


Lesenswert?

Zum Thema Rechnen in Assembler:

http://home.tiscali.de/peterd/appl/soft/arithmet/index.htm


Peter

von Thiemo (Gast)


Lesenswert?

"Zitat"
Autor: crazy horse - jsgpsgmx.de
Datum: 09.06.2005 00:18

------------------------------------------------------------------------ 
--------

tja klar, du musst natürlich mit grösseren Zahlen als 8bit arbeiten,
im
einfachsten Fall mit 16bit, wird bei dir wahrscheinlich ausreichend
sein.
Messwert z.B. 129 *40=5120/73=70 (pH7,0?)
Kannst es noch etwas genauer machen:
129*400/73=706, würde also auf pH7,1 gerundet.
Dabei kommst du aber mit 16bit schon nicht mehr aus, meist wird dann
32bit-Arithmetik gerechnet, in Assembler hindert dich aber niemand
daran, 24bit zu verwenden.
Wie ausgeben? Kommt auch auf die Art des Displays an. Auf jeden Fall
in
Dezimalstellen aufteilen und das Komma an der richtigen Stelle setzen.

Aus welchem Grund willst du mit Assembler weitermachen?

Ich möchte mein Programm nicht nochmals komplett neu schreiben. Und da
ich mit Assembler angefangen habe, möchte ich es erstmal fertig
schreiben.

Wie lautet der Befehl bzw. Befehle(8051) um 16 bit zu speichern ?

Gruß
Thiemo

von Thiemo (Gast)


Lesenswert?

"Zitat"
Autor: Jörn Bögeholz - joern.boegeholzweb.de
Datum: 09.06.2005 08:30

------------------------------------------------------------------------ 
--------

Schau mal hier:

http://www.avr-asm-tutorial.net/avr_de/rechnen/fpconv.html

------------------------------------------------------------------------ 
--------

Hallo Jörn

Ich hab mir die Seite angeschaut, aber leider hab ich nicht die
gleichen Befehle.
Was bedeutet : "ldi" ???

Gruß
Thiemo

von AndreasH (Gast)


Lesenswert?

Im Microcontroller-Appliktionsbuch von Andreas Roth ist auführlich mit
Code erklärt, wie man mit 16-bit-Variablen bzw. float in Assembler
rechnet. Ich hatte mir das mal aus der Bücherei geliehen.
Den Quellcode hierzu müsste ich noch irgendwo finden. Wenn du ihn habe
willst, melde Dich mal.

Sieh Dir doch mal Peter´s Seite an. Vielleicht hilft Dir das ja
weiter.

Andere Alternative: Du installierst Dir den sdcc. Schreibst eine kleine
Funktion, die das gewünschte in C macht und siehst Dir dann den
erzeugten Assembler-Code an.

Grüße
Andreas

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.