Forum: Mikrocontroller und Digitale Elektronik Dezimal to binär


von Slotti (Gast)


Lesenswert?

Hi Leute,

ich habe mir das STM32 Nucleo Borad zugelegt und möchte nun an einem 
Port (d0 - d15) jeweils 8 pins verwenden und an denen eine Binärzahl 
ausgeben. Üblicherweise liest man ja im internet, dass man mit dem 
Modulo operator oder durch 2 Faktor eine Dezimal zahl in eine binährzahl 
umwandeln kann.

Ich habe das in der Hinsicht noch nicht ganz verstanden und zwar, möchte 
ich  die Pins D8 - D15 verwenden, um meine in der Software vorher 
definierte Dezimalzahl, als binärzahl auszugeben.

WIe mache ich das ß?

von Peter D. (peda)


Lesenswert?

Slotti schrieb:
> in der Software vorher
> definierte Dezimalzahl, als binärzahl auszugeben.

Intern sind alles Binärzahlen, da kann man nichts umwandeln.
Wenn Du im Quelltext 99 hinschreibst, macht der Compiler 0x63 draus.
Das entspricht dann 0b1100011.

: Bearbeitet durch User
von D. S. (datasheet)


Lesenswert?

Hilft nix, wenn du auf einem µC programmieren willst, musst du dich mit 
binärer Logik auseinandersetzen.
Arbeite das durch
http://de.wikipedia.org/wiki/Logische_Verkn%C3%BCpfung

und such mal nach der passenden Umsetzung in deiner Sprache. Weiß nicht, 
wie man bei dem Controller was setzt. Also nur Pseudo C.

bspw.
if ((zahl & 0x01) == 0x01) PIN8_ON;

oder

pin = ((zahl >> stelle) & 1);

Data

von Sean G. (atmega318)


Lesenswert?

uint8_t zahl = 129; //0b0000000010000001
zahl = zahl << 8; //0b1000000100000000
zahl = zahl & 0xff00 //0b10000001xxxxxxxx
GPIOD -> ODR = zahl;


x = ausmaskiert -> lsbs werden nicht beeinflusst

von D. S. (datasheet)


Lesenswert?

Sean Goff schrieb:
> uint8_t zahl = 129; //0b0000000010000001
> zahl = zahl << 8; //0b1000000100000000
> zahl = zahl & 0xff00 //0b10000001xxxxxxxx
> GPIOD -> ODR = zahl;
>
>
> x = ausmaskiert -> lsbs werden nicht beeinflusst

Doch, sie werden auf null gesetzt.

GPIOD -> ODR &= ~(0xFF00);
GPIOD -> ODR |= zahl;


Data

von Sean G. (atmega318)


Lesenswert?

D. S. schrieb:
> Sean Goff schrieb:
>> uint8_t zahl = 129; //0b0000000010000001
>> zahl = zahl << 8; //0b1000000100000000
>> zahl = zahl & 0xff00 //0b10000001xxxxxxxx
>> GPIOD -> ODR = zahl;
>>
>>
>> x = ausmaskiert -> lsbs werden nicht beeinflusst
>
> Doch, sie werden auf null gesetzt.
>
> GPIOD -> ODR &= ~(0xFF00);
> GPIOD -> ODR |= zahl;
>
>
> Data

Ja, das war mir schon klar, hab mich falsch ausgedrückt. Besser noch 
währe dann aber:

GPIOD -> BSRR = zahl;
GPIOD -> BRR = ~zahl;

Der STM hat ja schliesslich extra Register für das.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Slotti schrieb:
> meine in der Software vorher definierte Dezimalzahl, als binärzahl
> auszugeben.
Überleg mal, wie der Controller deine Dezimalzahl intern darstellt. Das 
musst du dir selber erarbeiten. Das ist wichtig!

Als kleiner Denkanstoss: der Controller rechnet immer binär. Nur damit 
du die Zahl einfacher lesen kannst, kannst du sie im Editor und Debugger 
auch in anderen Zahlensystemen darstellen lassen. Das geläufigste ist 
hier dann das Zehnersystem. Es gibt aber auch noch das 
Hexadezimalsystem, das für uC nicht weniger wichtig ist...

von D. S. (datasheet)


Lesenswert?

Sean Goff schrieb:
> GPIOD -> BSRR = zahl;
> GPIOD -> BRR = ~zahl;
>
> Der STM hat ja schliesslich extra Register für das.

Ah cool, kenn den Controller nicht weiter.
Is aber schick!


Data

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.