mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Port Maskieren


Autor: Seraphim (Gast)
Datum:

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

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei ganzen Ports:

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

Autor: Bascomfehler (Gast)
Datum:

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

Autor: Seraphim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
  {};
}

Autor: Justus Skorps (jussa)
Datum:

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

Autor: Seraphim (Gast)
Datum:

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

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.