Forum: Mikrocontroller und Digitale Elektronik Binär/ASCII zum realen Wert


von Wini (Gast)


Lesenswert?

Hallo ihr,

ich habe einen Problem. Ich möchte eine Digitale Spannungsanzeige mit 
einem PIC realisieren.

Ich habe es bereis geschaft ein 8bit Datenwort aus dem ADC rauszuholen 
und in seine Zehnerstellen zu zerlegen.


5V = 255 usw.


Jetzt zu meiner Frage. Wie bekomm ich daraus jetzt den Momentanen 
Spannungswert.

Mit 5V * Momentan Wert / 255 geht es ja leider nicht :(
Jemmand eine Idee ?

von Helfer (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC#Ein_paar_ADC-Grundlagen

Gesuchte_Spannung = (Gemessener_ADC_Wert * Referenzspannung) / 
2^Bitzahl_des_ADC

Bei 8-Bit ADC und Vref 5V:
y = (ADC * 5V) / 256

von Michael R. (dj_motionx)


Lesenswert?

Hallo ! Das stimmt alles Ich glaube aber eher der Gedanke der dir fehlt 
ist, dass du das ganze nicht ganzzahhlig sondern in floats rechnen 
musst. Also bei der Berechnung einfach in floar konvertieren dann pfeift 
das ;-)

L.g. michi

von M. J. (manfred-64)


Lesenswert?

Wini schrieb:
> Mit 5V * Momentan Wert / 255 geht es ja leider nicht :(
> Jemmand eine Idee ?

geht schon nur is das in Assembler nich so simpel.

Wini schrieb:
> Mit 5V * Momentan Wert / 255 geht es ja leider nicht :(
> Jemmand eine Idee ?

Nimm die, wahrscheinlich auch in Deinem mir leider unbekannten Pic,
vorhandene VRev. dann hast Du nur noch mit den Faktoren 4,8 o. 16
zu tun.
Ich messe dann halt meist so oft und addiere das ganze, verringrt die 
Messfehler.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wini schrieb:
> Mit 5V * Momentan Wert / 255 geht es ja leider nicht :(
> Jemmand eine Idee ?
Rechne in milliVolt: 5000*ADC / 256
Oder in centiVolt: 500*ADC /256

von Michael Dierken (Gast)


Lesenswert?

Meinst du sowas wie hier im Tutorial?

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

(Etwas runter Scrollen, dann kommt ne Formel un beschreibung wie man aus 
dem ADC die Spannugn bekommt)

von Wini (Gast)


Lesenswert?

Michael Rathmair schrieb:
> Hallo ! Das stimmt alles Ich glaube aber eher der Gedanke der dir fehlt
>
> ist, dass du das ganze nicht ganzzahhlig sondern in floats rechnen
>
> musst. Also bei der Berechnung einfach in floar konvertieren dann pfeift
>
> das ;-)

Das klingt gut.
Und wie konvertiere ich das ?


Sry bin noch Anfänger ^^

Arbeite mit dem PIC16F887

von Wini (Gast)


Lesenswert?

Ich habe gerade das hier gefunden!

Das sollen wohl Makkros sein.
Kann mir bitte jemmand erklären wie man die benutzt ?

Muss ich die in mein Projekt einbinden (MPLAB)?

von Uwe (Gast)


Lesenswert?

Wie schon gesagt : Arbeite mit Millivolts statt Volts !
Ist schnell, Speichersparend und einfach.

von M. J. (manfred-64)


Lesenswert?

Verrat uns doch mal welche Programmiersprache Du verwendest!

von Wini (Gast)


Lesenswert?

Assembler :)

von bitte löschen (Gast)


Lesenswert?

Lothar Miller schrieb:
> Rechne in milliVolt: 5000*ADC / 256

Aber das Kürzen nicht vergessen:
5000 * ADC / 256 = 625 * ADC / 32

von M. J. (manfred-64)


Lesenswert?

Wini, kann es sein das Dir grad furchtbar langweilig is :D

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Philipp Klostermann schrieb:
> Aber das Kürzen nicht vergessen:
> 5000 * ADC / 256 = 625 * ADC / 32
Das bedeutet nich unbedingt den kürzeren Code. Denn TEILEN durch 256 ist 
idR. schneller als Teilen durch 32.
Interessant ist also, ob bei der Multiplikation (625 statt 5000) vorher 
mindestens soviel Zeit eingespart wurde... ;-)

von Wini (Gast)


Lesenswert?

Warum soll mir langweilig sein ? ^^


Ich verstehe gerade nur nicht (würde auch mit Millivolt rechnen) wie ich 
dem Pic sagen soll, Rechne jetzt mit Kommastellen ! ^^


Wie gesagt bin jetzt erst seid 3 Wochen dabei :D


Sry wenn ich nerve :(

von NopNop (Gast)


Lesenswert?

Lothar Miller schrieb:
> Denn TEILEN durch 256 ist
> idR. schneller als Teilen durch 32.

Rein aus Interesse.
Wieso denn dass? Sind doch beides Schiebeoperationen?

von Justus S. (jussa)


Lesenswert?

NopNop schrieb:
> Rein aus Interesse.
> Wieso denn dass? Sind doch beides Schiebeoperationen?

wenn ich mich nicht täusche, kann man bei /256 einfach das hintere Byte 
"abschneiden", und der Compiler das "merkt", dürfte das vermutlich 
schneller gehen als mehrmals Schieben...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

NopNop schrieb:
> Wieso denn dass? Sind doch beides Schiebeoperationen?
/256 ist bei 8-Bit Prozessoren eine "Ignorier"-Operation.
Einfach das unterste Byte ignorieren...  ;-)

von M. J. (manfred-64)


Lesenswert?

Wini schrieb:
> Warum soll mir langweilig sein ? ^^

nix für ungut.

Dir fehlen die absoluten Grundkenntnisse im Umgang mit Binärzahlen
und Rechnen in Assembler.
Das kann und will Dir hier sicher keiner beibringen.
Internet, Bücher ist hier das Stichwort oder Du wechselst zu einer 
Hochsprache wie C, Pascal o. BASIC (Wo wir dann aber wieder bei 
Internet, Bücher etc. wären :))
Obwohl ich eine Grundkenntnis in Assembler für unabdingbar zum 
erfolgreichen Programmieren eines mC's halte.

von NopNop (Gast)


Lesenswert?

Lothar Miller schrieb:
> NopNop schrieb:
>> Wieso denn dass? Sind doch beides Schiebeoperationen?
> /256 ist bei 8-Bit Prozessoren eine "Ignorier"-Operation.
> Einfach das unterste Byte ignorieren...  ;-)

Gut zu wissen...danke.

von Wini (Gast)


Lesenswert?

NopNop schrieb:
> Dir fehlen die absoluten Grundkenntnisse im Umgang mit Binärzahlen
>
> und Rechnen in Assembler.
>

Wohl möglich :,(
Kann mir gerade nicht so wirklich vorstellen wie ein mC mit Kommastellen 
rechnet.

Ich kenne momentan nur das rechnen mit ganzen zahlen die den Wert 255 
nicht überschreiten. (da fehlt mir wohl noch so einiges)


> Das kann und will Dir hier sicher keiner beibringen.
>
Eine kurze Erklärung reicht mir ^^


> Internet, Bücher ist hier das Stichwort oder Du wechselst zu einer
>
> Hochsprache wie C, Pascal o. BASIC

Wenn das so einfach wäre ^^


> Obwohl ich eine Grundkenntnis in Assembler für unabdingbar zum
>
> erfolgreichen Programmieren eines mC's halte.

Ist rechnen mit Kommastellen noch Grundkenntnisse ?
Dann fehlen die mir wirklich. Tut mir leid das ich hier so unvorbereitet 
reinschreibe :(

von Karl H. (kbuchegg)


Lesenswert?

Wini schrieb:
> NopNop schrieb:
>> Dir fehlen die absoluten Grundkenntnisse im Umgang mit Binärzahlen
>>
>> und Rechnen in Assembler.
>>
>
> Wohl möglich :,(
> Kann mir gerade nicht so wirklich vorstellen wie ein mC mit Kommastellen
> rechnet.

Mit Kommestallen, also echten Floating Point, ist das aufwändig.
Aber das musst du ja auch nicht. Das Stichwort ist ja schon gefallen: 
Fixed Point Arithmetik. Also einfach einem geeigneten Vielfachen. Bei 
dir zb 1000

> Ich kenne momentan nur das rechnen mit ganzen zahlen die den Wert 255
> nicht überschreiten. (da fehlt mir wohl noch so einiges)

Dann wird dein nächster Punkt auf deiner Lernliste darin bestehen, dass 
du dich mit 16 Bit Arithmetik vertraut machen musst. Denn ein 
Zahlenbereich 0 bis 255 ist dann schon sehr einschränkend. Aber mit 0 
bis 65536 sieht es dann schon besser aus. Dann kann man auch in 
Millivolt rechnen (also einfach dem Tausendfachen des Volt-Wertes)

von bitte löschen (Gast)


Lesenswert?

Lothar Miller schrieb:
> Interessant ist also, ob bei der Multiplikation (625 statt 5000) vorher
> mindestens soviel Zeit eingespart wurde... ;-)

Das stimmt wohl, mir ging es eher um die Bereichsüberschreitung, und da 
haben wir in beiden Fällen mehr als 16 Bit (18, bzw. 20 Bit) im 
Zwischenergebnis. (Da hatte ich nicht aufgepasst.)
Wenn man das vermeiden will, bleibt, von Millivolt auf Centivolt 
umzusteigen, also
ADC * 500 / 256
bzw.
ADC * 250 / 128 (Zwischenergebnis maximal (0xF909)
oder
ADC * 125 / 64
wenn man eh' nicht das letzte Byte ignorieren kann, da man nicht mehr 
durch 256 teilt.

von Wini (Gast)


Lesenswert?

Gut,

dann werde ich mich mal ransetzen.
War gestern schon ein wenig deprimiert ;) (aber naja...was will man 3 
Wochen programmieren schon erwarten)


Kennt jemmand gute Bücher über das Thema (PIC programmierung, vlt sogar 
über den PIC16F887)

Hab das Buch Mikrocontroller für Einsteier und Unterlgagen Elabo.




Und noch eine Frage: Ist es einfacher sowas in C zu programmieren ?
Und wo liegen die Nachteile es in C zu programmieren?

von Karl H. (kbuchegg)


Lesenswert?

Wini schrieb:

> Und noch eine Frage: Ist es einfacher sowas in C zu programmieren ?

Ja.
Denn dein Compiler weiß, wie man in 16 (oder 32) Bit rechnet und setzt 
das dann ein. Im Grunde ersetzt dir der Compiler viel Wissen, dass du 
auf Assemblerebene brauchst um Programme schreiben zu können. Der 
Compiler entlastet dich von vielen Details.

> Und wo liegen die Nachteile es in C zu programmieren?

Ein Laufzeitpenalty. Der liegt bei C-Anfängern etwas höher, aber mit ein 
wenig Übung bewegt sich der Penalty im (kleinen) einstelligen 
Prozentbereich. Und natürlich muss man auch C lernen, was etwas 
umfangreicher ist als die Assemblerbefehle auswendig zu lernen.

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.