mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 10 bit nach Dezimal


Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC=10 bit MSB=2,5V. Alle Bits gesetzt.
4,999.. =Hbyte= 00000011
         Lbyte= 11111111.
Hat jemand in AVR Assembler eine Routine um 4999 (5,000) darzustellen 
oder ähnlich?.
Die Geschichte mit der Div durch 10 + Hez Offset ist bekannt.

Autor: Gerhard Paulus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

etwas aehnliches hatte ich mal gemacht, um den ADC Rohwert per UART 
auszugeben. Der ADC-Wert wird erwartet in Registern binH und binL.

Gerhard

;--------------------------------------------------
sendDecimal:

  ldi decH, high(10000)
  ldi decL,  low(10000)
  rcall bin2digit
  ldi decH, high(1000)
  ldi decL,  low(1000)
  rcall bin2digit
  ldi decH, high(100)
  ldi decL,  low(100)
  rcall bin2digit
  ldi decH, high(10)
  ldi decL,  low(10)
  rcall bin2digit
  ; Einser-Stellen bleiben übrig
  mov digit, binL
  rcall sendDigit
ret

;--------------------------------------------------
bin2digit:
  clr digit
  label1:       ; vergleichen mit 10er-Potenz
    cp binH, decH
    brlo label3
    brne label2
    cp binL, decL
    brlo label3
  label2:       ; 10-er Potenz abziehen
    sub binL, decL
    sbc binH, decH
    inc digit
    rjmp label1 ; neu testen
  label3:
  rcall sendDigit
ret


;--------------------------------------------------
sendDigit:
  subi digit, -48  ; addi gibt es nicht
  mov send, digit
  rcall transmit
ret

Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verstehe ich das richtig wenn ich in binH dez 3 lade und in binL dez 255 
(alle bit 10 bit gesetzt) das ich den 50 00 erhalte ?

Autor: Oliver K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
die Version von Gerhard hatte leider nicht die Transformation drin:
0    ---> 0
1023 ---> 5000

Eine Lösung (sollte ich mir patentieren lassen ;-) ) für das Problem 
lautet:


index: 0 1  2  3  4  5   6   7   8    9
val:   5 10 20 39 78 157 314 625 1250 2502



Diese Zahlenfolge stellt ein Zahlensystem dar. Die Eigenschaft jeder 
Zahl ist, daß sie
größer als die Summe jeder vorangegangen Zahlen ist. Die Gesamtsumme 
beträgt 5000.

Im Binärsystem ist die Folge zum Beispiel:
1 2 4 8 16 etc.

Um jetzt deinen 10-Bit ADC-Wert zu konvertieren gehst Du folgendermaßen 
vor:

Pseudocode:
Summe = 0;
für (i = 0 und i < 10)
{
 Wenn Bit i im ADC-Wert gesetzt, dann Sume = Summe + val[i];
 i = i+1
}

Das ganze muss man dann noch in Assembler implementieren. Sollte nicht 
so schwer sein.

Grüße
Oliver

Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke

Autor: Gerhard Paulus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frankl,

offensichtlich willst Du mehr als nur den Rohwert dezimal ausgeben :-)

Vielleicht hilft Dir dieser Code weiter:

 ftp://ftp.berlios.de/pub/avrprogger/comtec2002/led-temp.asm

Das dazu passende Bildchen findest Du hier:

 http://www.gnomsoft.de/comtec.html

Gerhard

Autor: Frankl (Gast)
Datum:

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