Forum: Mikrocontroller und Digitale Elektronik Port Maskieren


von Seraphim (Gast)


Lesenswert?

Guten Tag,

ich habe mal eine Frage bezüglich zum maskieren von Ports in C.
Ich habe eine 16Bit Zahl in einer Variablen, welche ich auf 2 
verschiedene Ports als "Bitmuster" ausgeben möchte. Bei einer 8Bit 
Variablen kann man schreiben

PORTx=tmp;

dann wird der Port auf das Bitmuster der Variablen tmp gesetzt. Sowas 
müsste doch auch gehen, wenn man eine 16 Bit Variable hat und zwei Ports 
nimmt. Also irgendwie

PortA=tmp.highbyte;
PortB=tmp.lowbyte;

oder? Nur wir komme ich an das High und das Lowbyte meiner Variablen in 
C dran? So und um das ganze jetzt noch zu verschärfen soll zum Beispiel 
von PortA nur die unteren 6 Pins benutzt werden und von PortB die oberen 
sechs. Das müsste dann ja gehen, indem man den Port noch mit dem 
passenden Byte der Variablen maskiert?

Grüße Stefan

von Justus S. (jussa)


Lesenswert?

bei ganzen Ports:

PORTB = tmp & 0xFF;
PORTA = tmp >> 8;

von Bascomfehler (Gast)


Lesenswert?

#include <avr/io.h>

int main(void)
{

  uint16_t tmp = 12345;

  PortA = tmp;       // untere 8Bit
  PORTB = (tmp >>8); // obere  8Bit


  while(1)
  {};
}


Sollte so funktionieren, wenn es ein AVR ist.

von Seraphim (Gast)


Lesenswert?

Ok,

der Teil von Bascomfehler ist leicht zu verstehen, da PortA nur 8 Bit 
hat werden halt auch nur die unteren 8 Bit meiner tmp Variablen 
genommen, anschliessend mache ich ein Bitshift um 8 Stellen nach rechts, 
somit stehen die oberen 8 Bit nun in den unteren 8 Bit und dann erfolgt 
die selbe Zuweiseung.

Bei Justus bin ich mir nicht ganz sicher, was die erste Anweisung macht. 
Du maskierst die unteren 8 Bit mit Einsen und ner Und-Verknüpfung, dann 
müssten die oberen 8 Bit alle 0 sein oder? Wobei das nach dem Quellcode 
von Bascomfehler ja eigentlich egal ist, da das Highbyte sowieso nicht 
abgefragt wird.

Mit der Bitshiftnummer könnte ich dann auch sowas erreiche, wie die 
unteren sechs Byte der Highbyte auf die oberen 6 Pins eines Ports zu 
legen, oder?

ist der code dann so richtig? Ich schifte die unteren 6 Byte des 
Highbyte in Lowbyte und maskiere die ersten beiden Bytes raus.

int main(void)
{

  uint16_t tmp = 12345;

  PortA = tmp;       // untere 8Bit
  PORTB = (tmp >>6)&0xFC; // untere 6Bit des Highbyte auf obere 6 Ports


  while(1)
  {};
}

von Justus S. (jussa)


Lesenswert?

Seraphim wrote:
> Ok,
>
>
> Bei Justus bin ich mir nicht ganz sicher, was die erste Anweisung macht.
> Du maskierst die unteren 8 Bit mit Einsen und ner Und-Verknüpfung, dann
> müssten die oberen 8 Bit alle 0 sein oder? Wobei das nach dem Quellcode
> von Bascomfehler ja eigentlich egal ist, da das Highbyte sowieso nicht
> abgefragt wird.

ja, im Prinzip sollten beide Varianten zum gleichen Ergebnis 
führen...bei meiner sieht man halt direkt, dass da eben eine Zahl 
abgeschnitten word...ist imo hilfreich, wenn man sich seinen Code nach 
längerer Zeit wieder anschaut...

> Mit der Bitshiftnummer könnte ich dann auch sowas erreiche, wie die
> unteren sechs Byte der Highbyte auf die oberen 6 Pins eines Ports zu
> legen, oder?
>
> ist der code dann so richtig? Ich schifte die unteren 6 Byte des
> Highbyte in Lowbyte und maskiere die ersten beiden Bytes raus.

das Problem dabei: die beiden nicht benutzten Pins von B werden auf 0 
gesetzt...wenn da also was anderes dranhängt, kann das Probleme geben...

von Seraphim (Gast)


Lesenswert?

Hmm verstehe,

wenn ich die anderen Pins vom Port nicht ändern will müsste ich dann 
quasi jeden einzeln zuweisen ala

PORTB |= (1<<PB1) | (1<<PB3);

nur wie kann man in sowas eine variable einbauen?

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.