10Bit in String für Display umwandeln

Gast #421242
Lesenswert?
• ▲
▼
Hi, das Thema verfolgt mich und es hikft nichts. hier mein Problem:
10Bit vom ADC muss ich  am Display anzeigen (T6963C) alles läuft, bis
auf die korrekte Darstellung des Messwertes. Das heißt, ich müsste
z.B.
mit itoa() den ADC Wert in einen String aus Dezimalzahlen wandeln, nur
läuft es nicht, wie ich es mir vorstelle. Hat jemand vielleicht dazu
schon was gemacht ?

mfg

LC
Gast #421244
Lesenswert?
• ▲
▼
Ich habe dazu keinen Code, sonst hätt´ ich nicht gepostet;)
Aber das prinzip ist ja klar: String als Zeiger an Low-Level Routine
übergeben, die bis zum 0-Byte aufs Display schreibt. Nur den String
bekomme ich nicht zusammen und ich hab keine Ahnung wie das geht !
Was ich versucht hatte, war das:

Rpm[x] global definiert !
1
void _itoa(uint16_t adc)
2
{
3
  
4
  
5
  int help = adc;
6
  
7
  
8
  if(val > 999)
9
        {
10
    Rpm[0] = ( adc - ( help % 1000 ) ) / 1000;
11
    help %= 1000;
12
    
13
    Rpm[1] = ( adc - ( help % 100 ) ) / 100;
14
    help %= 100;
15
          
16
    Rpm[2] =  ( help - ( help % 10 ) ) / 10;
17
    help %= 10;
18
          
19
    Rpm[3] = help;
20
  }
21
  else if(adc <= 999)
22
  {
23
    Rpm[0]  = 0;
24
    
25
    Rpm[1] = ( adc - ( help % 100 ) ) / 100;
26
    help %= 100;
27
          
28
    Rpm[2] =  ( help - ( help % 10 ) ) / 10;
29
    help %= 10;
30
          
31
    Rpm[3] = help;
32
  }
33
  
34
  
35
  DBE_Lcd_writeStr(Rpm);
36
}
#421245
Lesenswert?
• ▲
▼
Nimm dir doch bitte mal Papier und Bleistift, nimm einen Wert
für adc an und rechne mal per Hand deine Formeln durch.

(Was du da machst ist mächtig kompliziert.
Einfacher gehts mittels fortgesetzter Division duch 10.
Du kriegst halt die Stellen in umgekehrter Reihenfolge. Das
lässt sich aber mit einer Routine, die einen String spiegelt
leicht korrigieren.

   1023 % 10    ->          3
   1023 / 10    -> 102

   102 % 10     ->          2
   102 / 10     -> 10

   10 % 10      ->          0
   10 / 10      -> 1

   1 % 10       ->          1
   1 / 10       -> 0

                   ^        ^
                   |        |
    Diese Null sagt aus     |
    dass die Konvertierung  |
    fertig ist              |
                            |
                    Hier sind die einzelnen Digits

Die Digits fallen in der Reihenfolge 3 2 0 1 an.
Als String also "3201".
Dieser String muss jetzt noch gespiegelt werden, was
durch paarweises vertauschen leicht möglich ist.

               3 2 0 1
               ^ ^ ^ ^
               | | | |
               | +-+ |
               +-----+

               1 0 2 3


Hat dein Compiler keine _itoa Funktion? itoa ist zwar keine
Standardfunktion, die meisten Compiler bringen aber eine mit.
Gast #421247
Lesenswert?
• ▲
▼
Hm - und warum verwendest Du nicht die itoa()-Funktion, sondern
schreibst sie selbst?
Wenn Du kein Platzproblem hast, kannst Du auch sprintf() verwenden,
dann hast Du sogar sämtliche Formatierungsmöglichkeiten des
printf()-Befehls.
Gast #421248
Lesenswert?
• ▲
▼
Drei Schleifen und eine IF-Abfrage:
RPM[]="    "; // führende Null ignorieren
x=0;
If (ADC>999)
{
 RPM[0]='1';
 RPM[1]='0';
 ADC -= 1000;
}

while (ADC>99)
{
 RPM[1]++;
 ADC -= 100;
 RPM[2]='0';
 RPM[3]='0';
}
while(ADC>9)
{
 RPM[2]++;
 ADC -= 10;
 RPM[3]='0';
}
RPM[3] += ADC;

Ausprobiert habe ich es nicht...

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.