Port Maskieren

Gast #1155747
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
Gast #1155822
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)
  {};
}
#1156198
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...
Gast #1156232
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.