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 ?
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
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
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.
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
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)
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
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)?
Wie schon gesagt : Arbeite mit Millivolts statt Volts ! Ist schnell, Speichersparend und einfach.
Lothar Miller schrieb: > Rechne in milliVolt: 5000*ADC / 256 Aber das Kürzen nicht vergessen: 5000 * ADC / 256 = 625 * ADC / 32
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... ;-)
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 :(
Lothar Miller schrieb: > Denn TEILEN durch 256 ist > idR. schneller als Teilen durch 32. Rein aus Interesse. Wieso denn dass? Sind doch beides Schiebeoperationen?
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...
NopNop schrieb: > Wieso denn dass? Sind doch beides Schiebeoperationen? /256 ist bei 8-Bit Prozessoren eine "Ignorier"-Operation. Einfach das unterste Byte ignorieren... ;-)
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.
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.
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 :(
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)
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.