Forum: Projekte & Code bin to dez 10 Bit für 8051


von Stephan H. (stephan-)


Angehängte Dateien:

Lesenswert?

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

von Pieter (Gast)


Angehängte Dateien:

Lesenswert?

Hi Stephan,

sorry, aber wie mache ich ein Prog groß und langsam;-)

hab mal was rausgestrichen, ist aber nicht getestet.

Mit Gruß
Pieter

von peter dannegger (Gast)


Lesenswert?

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

von Michael (Gast)


Lesenswert?

"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.

von Stephan H. (stephan-)


Lesenswert?

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

von Pieter (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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

von peter dannegger (Gast)


Lesenswert?

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

von Pieter (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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

von Pieter (Gast)


Lesenswert?

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

von peter dannegger (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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

von Stephan H. (stephan-)


Lesenswert?

@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

von Pieter (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

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!!

von Stephan H. (stephan-)


Lesenswert?

@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 ???







.

von peter dannegger (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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.

von Stephan H. (stephan-)


Lesenswert?

@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

von peter dannegger (Gast)


Lesenswert?

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

von Pieter (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@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
Noch kein Account? Hier anmelden.