Hallo Leute, ich suche nen kurzen Weg nen 10Bit A/D wert nach dez. zu wandeln. 16 Bit Routinen gibts ja genug....... Bin leider kein großer ASM Mathematiker :-( Daher meine Idee.: 1. Wandlerwert minus ganze Volt bis Null 2. Wandlerwert minus 1/10 Volt 3. die einer mV aus ner Tabelle lesen Alles unsignierte Werte, weil es in ein Netzteil soll. OK. der 1/10 V könnte ja auch noch in die Tabelle..... Läßt sich noch was wegkürzen ?? Danke Euch. Stephan
Hi Stephan, sorry, aber wie mache ich ein Prog groß und langsam;-) hab mal was rausgestrichen, ist aber nicht getestet. Mit Gruß Pieter
Das ist ja eine sehr spezielle Wandlungsroutine nur für den Bereich 0,00V..4,09V. Ich mache das lieber in der allgemeinen Form, also erst mit dem Skalierungsfaktor multiplizieren und dann ganz normal wandeln. Dann kann man solche Routinen in vielen Programmen nachnutzen und muß nicht jedesmal das Fahrrad neu erfinden. Spätestens, wenn Du verschiedene Sachen anzeigen willst (Spannung, Drehzahl, Temperatur, Uhrzeit usw.) spart Dir die allgemeine Methode massig Code, da ja nur der Skalierungsfaktor anders ist. Peter
"ich suche nen kurzen Weg nen 10Bit A/D wert nach dez. zu wandeln. 16 Bit Routinen gibts ja genug......." Dann nimm eine 16 Bit Routine Es ist zulässig, die oberen 6 Bit auf Null zu setzen und dann eine 16 Bit Routine zu nehmen. Ein µP geht dadurch nicht kaputt. Die Ergebnisse der Wandlungen unterscheiden sich nur in den Nachkommestellen und im Stromverbrauch.
Kritik angenommen. :-) Im Heinbereich wie bei mir sind voole 16 Bit Auflösung irrelevant !!! Mein LTC kann eh nur 10 und das sind bei Vref 4V eben 4mV im LSB ! Was habt Ihr denn an zu Hause Meßtechnik um Eure A/D Wandlerprojekte mit 12 14 oder 16 Bittern auf 1mV oder 40 oder 50 uV abzugleichen ???? "Das ist ja eine sehr spezielle Wandlungsroutine nur für den Bereich 0,00V..4,09V." na so schlimm is ja auch nicht, Peter. Irgendein Meßbereich hast Du ja immer mit Vref. Bei 2,048 V zieht man eben 1F4 ab. Zur Scalierung hatte ich Dir ja ne Mail geschickt (danni@spec??? ) aber keine Antwort erhalten. Mein Wert wurde beim Serielllen einlesen schon Scaliert !!! Kommen ja nur 10 Bit rein, also bei Vref 4,096V nicht 6 Mal rechts sondern nur 4 Mal. Scalierung fertig !! Erledigt sich jetzt aber eigentlich. Ich wollte ja nur etwas abkürzen und nicht bis ins letzte Bit Auflösen. 4 oder 8 mV bei 5,10 oder 15 Volt ???? Wozu ???? Aber Eurer Meinung entnehme ich, das ja keine Grundsätzlichen Denkfehler drin zu sein scheinen. Also ich danke Euch @Pieter, ich schaue heute Abend mal was Du gestrichen hast. Melde mich. Danke
moin moin, Leitspruch: messe so genau wie möglich und messe so genau wie nötig. Für zuhause habe ich mir ein kalibiertes Fluke189 geleistet. Die 4,096V werden da als 4,0960 angezeigt. Beim MAX186A sind so in der Ref-Spannung schon Unterschiede zu sehen. Mit Gruß Pieter
@Pieter, habe mal kurz draufgeschaut....naja mal wieder auf Arbeit :-( Verstehe ich auf die Schnelle nicht vollständig. Ich lass das heute Abend mal durchs Progstudio laufen. Ich denke dann komme ich drauf was Du gemacht hast. Ist aber schön kurz. Was hälst du von der Tabelle für 1/10 ?? Mittelwert und Rundung in einem Rutsch ! Tja mein "volcraft" geht da eben nur auf 4,09 !!! LEIDER !!! Offensichtlich auch nur 10 Bit. Meine Vref ist noch nen LM4040 soll dann aber Analog Dev. rein. REF19 irgendwas. Den LM gibts ja in 2 Toleranzen. Meiner hat nur 1%.Naja .....zum testen .... Also bis dann
Es geht überhaupt nicht um die benötigte Genauigkeit, sondern darum, sich selber die Programmierarbeit so einfach wie möglich zu gestalten. Und da bietet es sich eben an, eine 16Bit Routine auch für die Ausgabe kleinerer Zahlen mitzuverwenden. Ich benutze auch 10-Bit ADCs, käme aber nie auf die Idee, extra ne 10Bit-Routine zu schreiben. Der 10Bit-ADC-Wert wird in 16 Bit gespeichert und gut is. Erfahrene Programmierer versuchen immer, Programmteile möglichst universell zu schreiben, damit man nicht jedesmal bei Null anfängt. Bei einer Ausgaberoutine für Menschen lohnt es sich einfach nicht um einige µs zu feilschen, der Mensch kann eh nicht so schnell ablesen. Effektivität = Nutzen / Aufwand Peter
moin moin, @Peter Hier steht für mich die reine Optimierung im Vordergrund. Das ist eine überschaubare Sache und da kann man mal etwas probieren. Eine solche Routine hattest Du ja auch schonmal eingestellt. @Stephan klar, bin auf arbeit. Klebe z.Z. ein Gehäuse für einen Prüfplatz zusammen. Als Kleber für die Plaste verwende ich ein Lösungsmittel. Das muss immer erst verfliegen und der Raum gelüftet werden. Solange habe ich Zwangspause. Mit Gruß Pieter
ist wohl war..... Aber ich verdiene ja kein Geld damit. Ist doch NUR Spaß an der Freude. Und des Equipment auf einen neueren Stand bringen. Stephan
@Pieter,
> habe mal kurz draufgeschaut....naja mal wieder auf Arbeit :-(
bezog sich nur auf mich selber !!! Nicht auf deinen Code. !!!!
Keine Kritik an dich gewesen.
Also dann lüfte mal schön lange.
Sollte ich hier auch rauchen, um dann lange lüften zu können :-)))
Also bis dann
Stephan
moin moin,
>> Sollte ich hier auch rauchen, um dann lange lüften zu können :-)))
laut Bundesregierung werden Teile der zusätzlich erhobenen
Zigarettensteuer für die Terrorismusbekämpfung eingesetz....wer also
nicht raucht ist (möglicherweise) ein Terrorismus-Sympatisant.
Mit Gruß
Pieter
Hier hast Du nochwas zum draufschauen. Aber wie gesagt, die Optimierung wird kein Mensch je bemerken können. Im Gegenteil, ich machen bei Ausgaben sogar noch ein Delay von mindestens 200ms rein, damit der Mensch den Wert auch ablesen kann und nicht nur Geflackere sieht. Etwa 2..5 Ausgaben pro Sekunde sind ergonomisch. Peter
@Peter, du erinnerst Dich an die LCD Routine 4Bit in ISR ??? 4 Aktualisierungen /sec ?? genau dafür. Nur soll die ISR wirklich ein Grundbaustein sein, deswegen wollte ich so wenig wie möglich am PSW fummeln und habe Var. statt Reg. genommen. Optimierung bemerken ?? sicherlich subjektiv nicht !!!!! Und Flashspeicher gibts ja im Überfluss. Ist nur Ehrgeiz. Ich schaue mal rein heute Abend. Danke
@Pieter, @Peter, Jungs ich muß Euch noch mal auf den Sack gehen. Ihr schreibt beide Mov X,#"0"-1 Was habt Ihr vor ???? Wollt Ihr 29h oder FFh laden ??? Eine ASCI 0 -1 wären 29h , eine 0 biär -1 wäre ffh Danke
moin moin, '0'-1, in den Schleifen wird doch einmal blind incrementiert, daher -1. Ist also die erste Stufe einer Optimierung. Man könnte auch mit '0' laden und dann vor der Schleife decrementieren oder unschön in die Schleife springen. Ist Geschmackssache. Mit Gruß Pieter
habe ich mir doch gedacht. FFh soll rein. OK Wurde halt nur stutzig wegen der ''. Die nutze ich nie !! Wenn '' sehe, sind ja eigentlich ASCI gemeint. aber dann sind´s ja eigentlich "" Kleiner aber feiner Unterschied. Kommt vom vielen C en!!
@Pieter, blindes Increment............geiler Ausdruck !!! nie gehört. Aber genau das ist es was ich suche. Diese kleinen Spitzfindigkeiten und Tricks. Das macht den "Assembler" aus Ich bin da doch ehr konventionell. Muß doch alles seine Ordnung haben ;.-). Frage: beim negativen Überlauf addierst du nur den Low Wert inkl. Carry wieder auf. Muß ich High nie berücksichtigen ???????????????? Bitte um Antwort !!!!! Das kürzt dann natürlich um einiges !!! Ansonsten...clever..... Ich springe bei Carry in extra Routine und du springst bei No Carry auf weiter SUBB sonst plus Wert NUR in LOW und gut......schön !!!! Bin echt kein ASM Mathe Freak !!! Steuern, Schalten und Lesen ok. ABER Mathe .... @Peter hast Du compiliert oder in ASM ?? Ich weis Du bist mit C richtig fit, aber ich denke, Du kannst mir sagen was Du gemacht hast. Ich verstehe was nicht.: _disp409_1: inc r7 ;r7 = hunderter add a, #low(-250) xch a, r2 addc a, #high(-250) xch a, r2 Welchen Wert hat A bei Eintritt ? Mich interessiert die Zeile add a,#low(-250) in ASM würde ich schreiben, mov b,#250 oder FAh mov a,R6 subb a,b mov rx,a mov a,r6 add a,rx Meinst Du das so ??? Mein Assembler/Simulator nimmt mir DAS so natürlich nicht ab. Also muß ich umschreiben. Wozu ich aber wissen muß was Du vor hattest. Erklärungsnotstand !!!! Wir werden nicht zu alt zum rogrammieren, sondern zu bequem zu lernen. Danke für die Mühe. Stephan ps.: was ist mi der Tabelle für 1/10 ??? Mittelwertbildung und Rundung GUT umschifft ??? .
1 | mov a, #'0'-1 |
ist, wenn Du die Ausgabe in ASCII haben willst, ansonsten natürlich
1 | mov a, #-1 |
und die
1 | add a, #'0' |
Zeilen fallen auch raus. "Welchen Wert hat A bei Eintritt ?" A wurde zu Anfang mit R3 geladen, was das Lowbyte Deines ADC-Wertes ist. "Mein Assembler/Simulator nimmt mir DAS so natürlich nicht ab." Was für nen komischen Assembler benutzt Du denn ? Die low() und high() Funktionen für das Separieren der beiden Bytes einer 16Bit-Konstanten muß doch jeder können. Ansonsten: X - Y = X + (-Y) D.h. Durch Addition des negativen Wertes sparst Du das Löschen des Carry-Flags. Dabei aber beachten, die Bedeutung des Carry kehrt sich um. Peter
@Pieter, du hast mir ja netter Weise mal Deine Math Lib gepostet. Warum können die C "Freaks" kein Deutsch ?? Müßt Ihr immer Cryptische Sachen schreiben ?? ( kein persönlicher Angriff ) sehe ich aber oft bei C Sourcen !! ich würde denken Schar2fs könnte Char to ?? heißen. Hat wohl was mit ASCI zu tun. Public _schar2fs Public _sint2fs Public _slong2fs Public _uchar2fs Public _uint2fs Public _ulong2fs Public _fsadd Public _fssub Public _fsmul Public _fsdiv Public _fseq Public _fs2uint Public _fs2ulong Public _fs2uchar Public fs_compare_uint32 Public fs_check_negative_zeros Public fs_normalize_a Public fsgetargs Public fs_swap_a_b Public fs_rshift_a Public fs_round_and_return Public fs_zerocheck_return Public fs_return_zero Public fs_return_inf Public fs_return_nan Public fs_direct_return Hst Du verstädliche Überschriften dafür ?? Danke Nobody is perfect.
@Peter, wie schon öfter erwähnt, nutze ich das Progstudio von Batronix. Aber Zeilen wie MOV A,#-1 gehen da wirklich nicht. Er kann zwar Konstanten beim "Compilerlauf" berechnen aber solche Ausdrücke sind mir echt neu. Obwohl er mit If Then Else umgehen kann. Kann ja auch nicht jeder. Nutze ich aber nicht. Also ich schau mir Deinen Code noch an. Danke stephan
Nun, dann mußt Du eben negative Zahlen selber ins Zweierkomplement umrechnen und selber Low- und Highbyte abtrennen (z.B. mit Windows-Taschenrechner). Oder Du nimmst nen besseren Assembler. Peter
moin moin, @Peter mein Assembler (Marke Eigenbau) kann auch kein Hi/lo. Für hi nehme ich immer x >> 8. Dafür kann er direkt 4Byt-Realzahlen umrechnen. DB 1 ;die 1 als 1Byt DW 1 ;die 1 als 2Byt -> Word DR 1 ;die 1 als 4Byt nach IEEE754 DB 1[1] ;Byt mit Exponent von DR 1 @Stephan >> habe ich mir doch gedacht. FFh soll rein. OK NEIN!! #'0'-1 => #2FH Der Assembler soll einem Arbeit abnehmen. Kannst Du auf die schnelle den Hexwert von 'q' angeben? Oder den Vorgänger von ']'. Ein ähnliches Problem ist #-1. In ASM definierts Du einfach eins EQU 1 DB eins In Hochsprachen erfolgt das ungefähr so: eins Byte=1 (Wertebereich 0..255) eins Word=1 (Wertebereich 0..65535) eins Integer (Wertebereich -32768..+32767) eins Short=1 (Wertebereich -128..+127) Beachte die unterschiedlichen Wertebereiche. Diese Typisierung ist in Hochsprachen notwendig, um dem Compiler weitere Infos zu den Variablen zu geben. Vesuche doch mal das zu assemblieren mov a, #(-1 UND(welche Schreibweise?) 255) Die -1 wird als 0FFFFH dargestellt, a kann aber nur mit einem Bytwert geladen werden und eventuell meckert der Assembler den Überlauf an. Die Namensgebung ist in den Hochsprachen keineswegs kryptisch, sondern gut durchdacht. uchar UnsignetCharakter Wertebereich 0.. 255 schar SignetCharakter Wertebereich -128..+127 Somit ist es möglich, aus dem 1. Buchstaben auf den Wertebereich zu schliessen. ------- >>Frage: beim negativen Überlauf addierst du nur den Low Wert inkl. Carry wieder auf. Muß ich High nie berücksichtigen ???????????????? ---- Da der Hi-Wert hier später nicht mehr gebraucht wird--warum dann berechen? Das muss erstmal reichen. Mit Gruß Pieter
@Pietr, Peter, ja dann wird mir natürlich einiges klar. Warum einen binäwert in Dezimal überführen um ihm dann noch 30H draufzupacken um einen ASCII zu haben, wenn ich die Dezimalstellen gleich mit 2Fh vorladen kann. In diesem Fall 3Mal ADD a,30h gespart Danke
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.