Hallo, ich lese 16 Bit über die Ports C und F ein. Nur leider ist das MSB an der Stelle PC0 und das LSB an der Stelle PF7. Was nun...?? (Platine ist schon fertig) PC0 (MSB) PC1 (MSB-1) ... PC7 (MSB-7) PF0 (MSB-8) ... PF7 (LSB) Wie kann ich die 16Bit trotzdem richtig einlesen?? Danke für HILFE!!!
Hi einfach einlesen und in Software dann die Bits entsprechend drehen? Das Drehen geht dann alternativ über eine große Look-Up Tabelle, zwei kleine und ein swap oder über eine Menge Schieboperationen. Matthias
Bsp. (als Ergänzung zu dem was Mathias gesagt hat): 1 PORTC und PORTF in Software tauschen. 2 Dann für beide Bytes (C und F) 21 CALL GetNibble 22 Ergebnis zwischenspeichern 23 Obere 4 Bit nach unten schieben 24 CALL GetNibble 25 Ergebnis 4 Bit nach oben schieben 26 Zwischenergebnis einmaskieren (ODER mit zwischenErgebnis) SUB GetNibble G1 Untere 4 Bit ausmaskieren (UND mit 0x0F) G2 Aus Look Up Tabelle mit 16 Einträgen das geswapte Nibble auslesen Die Tabelle sieht dann so aus uint8_t nibbleTab[] = { 0b00001111, 0b00001110, ... 0b00000001, 0b00000000 };
Danke...hat vielleicht einer nen Tipp, wie das schnell und schmerzlos in C geht?
Man, die angebotenen Ideen in C zu übersetzen sollte dir doch wirklich möglich sein...
Sorry...wenn ich es geschafft hätte, hätte ich nicht nochmal gepostet!
hi, bei einem verdrehten Port kann man doch so einlesen.. wert = 256 - PORT, oder geht das jetzt nicht? ts
Also, sorry, aber wenn Du den ausführlichen Vorschlag von Ingo nicht umsetzen kannst, dann kann Dir echt keiner weiterhelfen.
Sehr primitiv - aber es geht (in Codevision): if (PINC.0 == 0) ..... = 1 ; else.... = 0; . . . . . SG Kurt
Matthias und Ingo..... viel geschrieben und wieder einmal nichts gesagt. Kuschelt ihr miteinnander ? SG Potzenplotz
x = PINF; y = 0xFF; for(i=0;i<8;i++) { if (x & (1<<i))) y &= ~(1<<(7-i)); } nicht schön, könnte aber gehen, wobei in y gedrehte Varinte des PINF steht... (stehen müsste) Die Methode ist relativ langsam. Wenn man 8 Vergleiche hintereinander schreibt, müsste schneller gehen... Etwa so: if (x & (1<<0)) y &= (1<<7); if (x & (1<<1)) y &= (1<<6); if (x & (1<<2)) y &= (1<<5); if (x & (1<<3)) y &= (1<<4); if (x & (1<<4)) y &= (1<<3); if (x & (1<<5)) y &= (1<<2); if (x & (1<<6)) y &= (1<<1); if (x & (1<<7)) y &= (1<<0); Dabei ersetzt der Compiler die (1<<n) durch Konstanten...
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.