Forum: Mikrocontroller und Digitale Elektronik MSP430 Binär in String, Display Ausgabe


von Marco (Gast)


Lesenswert?

Hallo zusammen,

ich habe hier einige Daten, die ich binär auf einem Display ausgeben 
möchte. Displayausgabe usw. ist kein Problem, aber ich weiß nicht, wie 
ich die Daten in Binärform in einen String bekomme, welchen ich dann 
einfach auf einem Display ausgeben kann, so dass ich dann z.B. 11001101 
auf dem Display.

Kann mir da jemand auf die Sprünge helfen, wie man das bewerkstelligen 
kann?


Grüße Marco

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die C-Funktion itoa() kann Dir helfen.

von Stefan (Gast)


Lesenswert?

Also wer printf(), itoa() & Co auf 'nem µC benutzt, hat wohl zuviel 
Speicher übrig?!

von Christian R. (supachris)


Lesenswert?

Die MSP430 haben doch genügend Flash, was soll man sonst mit den ganzen 
kiBytes anfangen :)

von Marco (Gast)


Lesenswert?

Hallo,

ich mss ehrlich sagen, dass ich jetzt auch erst einam gedacht hätte, das 
ganze über eine eigene Funktion zu bewerkstelligen...Ich wüsste nicht, 
dass ich schonmal Beispielcode mit itoa() usw. gesehen hätte....Ich 
meine auch in vielen Foren schon gelesen zu haben, dass man die schönen 
fertignen Funtionen nach Möglichkeit vermeidet, warum auch 
immer.........Die Sache ist auch, dass das ganze später auch auf andere 
Controller übertragen werden soll.


Grüße
Marco

von Jörg S. (joerg-s)


Lesenswert?

So ungefähr sollte es gehen (ungetestet!)
1
void byte_to_ASCII_bin (char *string, unsigned char zahl)
2
{
3
  int i, j;
4
5
  j = 0;
6
7
  // 1 Byte in ASCII binaer wandeln
8
  for (i = 0; i < 8; i++)
9
  {
10
    if (zahl & 0x80>>i)
11
      string[j++] = '1';
12
    else
13
      string[j++] = '0';
14
  }
15
  
16
  // String Abschliessen
17
  string[j] = 0;
18
}

von Stefan (Gast)


Lesenswert?

>Ich meine auch in vielen Foren schon gelesen zu haben, dass man die
>schönen fertignen Funtionen nach Möglichkeit vermeidet, warum auch
>immer.........

Ich geb' Dir mal ein Beispiel (war grad zur Hand...)
Runden einer Gleitkommazahl:
1
1.) without LIB-functions:
2
> >
3
> > __no_init double f_var;
4
> > __no_init long l_var;
5
> >
6
> > void main(void)
7
> > {
8
> > f_var = 13.4;
9
> >
10
> > if(f_var >= 0)
11
> > l_var = (long)(f_var + 0.5);
12
> > else
13
> > l_var = (long)(f_var - 0.5);
14
> > }
15
> >
16
> > Uses:
17
> > 32 bytes of CODE memory
18
> > 8 bytes of DATA memory
19
> > 2 bytes of CONST memory
20
> >
21
> >
22
> > 2.) with LIB-function:
23
> >
24
> > __no_init double f_var;
25
> > __no_init double l_var;
26
> > __no_init double i_var;
27
> >
28
> > void main(void)
29
> > {
30
> > f_var = 13.4;
31
> > l_var = modf(f_var, &i_var);
32
> > }
33
> >
34
> > Uses:
35
> > 994 bytes of CODE memory
36
> > 12 bytes of DATA memory
37
> > 2 bytes of CONST memory

Wenn man jetzt einen kleinen MSP430F2xxx mit 1 oder 2kB Flash benutzt, 
macht das einen Riesenunterschied!

Noch'n Beispiel
1
int main( void )
2
> {
3
> // Stop watchdog timer to prevent time out reset
4
> WDTCTL = WDTPW + WDTHOLD;
5
> printf("Hallo World!\n"); //*** I am very creative! ***
6
> return 0;
7
> }
8
>
9
> With standard Library (which requires 7 K-Bytes to support printf) and
10
> I/O emulation (which needs 2 Bytes), it far exceeds the 4 K-Bytes
11
> limit of IAR KickStart.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

1.) without LIB-functions:
1
__no_init double f_var;
2
__no_init long l_var;
3
4
void main(void)
5
{
6
  f_var = 13.4;
7
8
  if(f_var >= 0)
9
    l_var = (long)(f_var + 0.5);
10
  else
11
    l_var = (long)(f_var - 0.5);
12
}
13
14
Uses:
15
32 bytes of CODE memory
16
8 bytes of DATA memory
17
2 bytes of CONST memory

Das bezweifle ich. Floatingpoint-Addition und -Umwandlung in long mit 
gerade mal 32 Bytes code? Da wird wohl irgendwas wegoptimiert worden 
sein.

von Marco (Gast)


Lesenswert?

Hallo,

ich meine, dass der Code irgendwie nicht 100%ig funktioniert
1
void byte_to_ASCII_bin (char *string, unsigned char zahl)
2
{
3
  int i, j;
4
5
  j = 0;
6
7
  // 1 Byte in ASCII binaer wandeln
8
  for (i = 0; i < 8; i++)
9
  {
10
    if (zahl & 0x80>>i)
11
      string[j++] = '1';
12
    else
13
      string[j++] = '0';
14
  }
15
  
16
  // String Abschliessen
17
  string[j] = 0;
18
}

Bei einer 0 als Dez. kommt auch 00000000 raus, aber bei einer 153 z.B. 
kommt 11111111 raus. Mal davon ausgehen, dass ich nix falsch gemacht 
habe.

Ich habe dann nochmal versucht meinen grips anzustrengen und habe das 
folgende ausgebrütet, damit scheint es zu gehen:
1
j= 8;   
2
for (i = 0; i < 8; i++)
3
{
4
   if(zahl % 2)
5
       data1[j--]= '1';
6
   else
7
       data1[j--]= '0';
8
   zahl= zahl / 2;
9
}
10
// String Abschliessen
11
data1[j] = 0;
12
LCDOuts(data1);

Wäre toll, wenn da mal jemand drüber schauen könnte oder so.....

Grüße
Marco

von Jörg S. (joerg-s)


Lesenswert?

>ich meine, dass der Code irgendwie nicht 100%ig funktioniert
Hab's grad mal mit 153 probiert, geht ohne Probleme.

>damit scheint es zu gehen:
Würde mich wundern, da dein String jetzt bei Byte 0 eine 0 hat.
>// String Abschliessen
>data1[j] = 0;

Den Ausdruck "zahl= zahl / 2;" würde ich durch "zahl = zahl>>1;" 
ersetzen. Dann ist sichergestellt das er keine komplizierte Divison 
rechnet.

So sollte dein Code korrekt laufen:
1
j = 7;  
2
 
3
for (i = 0; i < 8; i++)
4
{
5
   if(zahl % 2)
6
       data1[j--]= '1';
7
   else
8
       data1[j--]= '0';
9
10
   zahl= zahl>>1;
11
}
12
// String Abschliessen
13
data1[8] = 0;
14
LCDOuts(data1);

von Marco (Gast)


Lesenswert?

Hallo,

ich habe beide Varianten noch einmal getestet. Gehen beide. Keine 
ahnung, warum der erste Code beim ersten Test nicht lief. Habe ich 
vermutlich noch was falsch gemacht.

Kann man bei den beiden Varienten sagen was besser ist oder ist das 
egal....einfach mal um noch ein wenig was zu lernen.

Grüße
Marco

von Jörg S. (joerg-s)


Lesenswert?

>Kann man bei den beiden Varienten sagen was besser ist oder ist das
>egal
Beides funktioniert. Man könnte jetzt noch schauen was weniger Speicher 
braucht oder schneller ist. Da wird es aber keine gravierenden 
Unterschiede geben.

Hab meinen Code noch mal etwas kleiner gemacht (Variable j eingespart):
1
void byte_to_ASCII_bin (char *string, unsigned char zahl)
2
{
3
  int i;
4
5
  // 1 Byte in ASCII binaer wandeln
6
  for (i = 0; i < 8; i++)
7
  {
8
    if (zahl & 0x80>>i)
9
      string[i] = '1';
10
    else
11
      string[i] = '0';
12
  }
13
  
14
  // String Abschliessen
15
  string[8] = 0;
16
}

von Marco (Gast)


Lesenswert?

Hallo,

vielen Dank!

Ich habe die neue Variante auch nochmal genommen, funktioniert natürlich 
auch einwandfrei.


Vielen Dank.

Grüße
Marco

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.