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
#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.
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) {}; }
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.