Forum: Mikrocontroller und Digitale Elektronik 10Bit in String für Display umwandeln


von LC-HC (Gast)


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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>Hat jemand vielleicht dazu schon was gemacht ?

Bestimmt!
Besser wäre es aber, wenn du hier deinen Code einstellen würdest.

von LC-HC (Gast)


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
}

von Karl H. (kbuchegg)


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.

von Schubi (Gast)


Lesenswert?

Da fällt mir folgende Seite ein:
http://www.cc5x.de/LCD.html
(Die gesuchte Funktion ist fast ganz am Ende der Seite)

von thkais (Gast)


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.

von inoffizieller WM-Rahul (Gast)


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

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.