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
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
>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.)withoutLIB-functions:
2
>>
3
>>__no_initdoublef_var;
4
>>__no_initlongl_var;
5
>>
6
>>voidmain(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
>>32bytesofCODEmemory
18
>>8bytesofDATAmemory
19
>>2bytesofCONSTmemory
20
>>
21
>>
22
>>2.)withLIB-function:
23
>>
24
>>__no_initdoublef_var;
25
>>__no_initdoublel_var;
26
>>__no_initdoublei_var;
27
>>
28
>>voidmain(void)
29
>>{
30
>>f_var=13.4;
31
>>l_var=modf(f_var,&i_var);
32
>>}
33
>>
34
>>Uses:
35
>>994bytesofCODEmemory
36
>>12bytesofDATAmemory
37
>>2bytesofCONSTmemory
Wenn man jetzt einen kleinen MSP430F2xxx mit 1 oder 2kB Flash benutzt,
macht das einen Riesenunterschied!
Noch'n Beispiel
1
intmain(void)
2
>{
3
>// Stop watchdog timer to prevent time out reset
4
>WDTCTL=WDTPW+WDTHOLD;
5
>printf("Hallo World!\n");//*** I am very creative! ***
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
>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:
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
>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):