mikrocontroller.net

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


Autor: Stephan Henning (stephan-)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi Stephan,

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

hab mal was rausgestrichen, ist aber nicht getestet.

Mit Gruß
Pieter

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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 ???







.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mov a, #'0'-1
ist, wenn Du die Ausgabe in ASCII haben willst, ansonsten natürlich
mov a, #-1
und die
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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan Henning (stephan-)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.