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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren