www.mikrocontroller.net

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


Autor: Marco (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die C-Funktion itoa() kann Dir helfen.

Autor: Stefan (Gast)
Datum:

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

Autor: Christian R. (supachris)
Datum:

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

Autor: Marco (Gast)
Datum:

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

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ungefähr sollte es gehen (ungetestet!)
void byte_to_ASCII_bin (char *string, unsigned char zahl)
{
  int i, j;

  j = 0;

  // 1 Byte in ASCII binaer wandeln
  for (i = 0; i < 8; i++)
  {
    if (zahl & 0x80>>i)
      string[j++] = '1';
    else
      string[j++] = '0';
  }
  
  // String Abschliessen
  string[j] = 0;
}

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.) without LIB-functions:
> >
> > __no_init double f_var;
> > __no_init long l_var;
> >
> > void main(void)
> > {
> > f_var = 13.4;
> >
> > if(f_var >= 0)
> > l_var = (long)(f_var + 0.5);
> > else
> > l_var = (long)(f_var - 0.5);
> > }
> >
> > Uses:
> > 32 bytes of CODE memory
> > 8 bytes of DATA memory
> > 2 bytes of CONST memory
> >
> >
> > 2.) with LIB-function:
> >
> > __no_init double f_var;
> > __no_init double l_var;
> > __no_init double i_var;
> >
> > void main(void)
> > {
> > f_var = 13.4;
> > l_var = modf(f_var, &i_var);
> > }
> >
> > Uses:
> > 994 bytes of CODE memory
> > 12 bytes of DATA memory
> > 2 bytes of CONST memory

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

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.) without LIB-functions:
__no_init double f_var;
__no_init long l_var;

void main(void)
{
  f_var = 13.4;

  if(f_var >= 0)
    l_var = (long)(f_var + 0.5);
  else
    l_var = (long)(f_var - 0.5);
}

Uses:
32 bytes of CODE memory
8 bytes of DATA memory
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.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich meine, dass der Code irgendwie nicht 100%ig funktioniert
void byte_to_ASCII_bin (char *string, unsigned char zahl)
{
  int i, j;

  j = 0;

  // 1 Byte in ASCII binaer wandeln
  for (i = 0; i < 8; i++)
  {
    if (zahl & 0x80>>i)
      string[j++] = '1';
    else
      string[j++] = '0';
  }
  
  // String Abschliessen
  string[j] = 0;
}

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:
j= 8;   
for (i = 0; i < 8; i++)
{
   if(zahl % 2)
       data1[j--]= '1';
   else
       data1[j--]= '0';
   zahl= zahl / 2;
}
// String Abschliessen
data1[j] = 0;
LCDOuts(data1);

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

Grüße
Marco

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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:
j = 7;  
 
for (i = 0; i < 8; i++)
{
   if(zahl % 2)
       data1[j--]= '1';
   else
       data1[j--]= '0';

   zahl= zahl>>1;
}
// String Abschliessen
data1[8] = 0;
LCDOuts(data1);


Autor: Marco (Gast)
Datum:

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

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht 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):
void byte_to_ASCII_bin (char *string, unsigned char zahl)
{
  int i;

  // 1 Byte in ASCII binaer wandeln
  for (i = 0; i < 8; i++)
  {
    if (zahl & 0x80>>i)
      string[i] = '1';
    else
      string[i] = '0';
  }
  
  // String Abschliessen
  string[8] = 0;
}


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank!

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


Vielen Dank.

Grüße
Marco

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.