Forum: Mikrocontroller und Digitale Elektronik Port ansteuern / Bitmaske über Daten (C18)


von Richard K. (richardk)


Lesenswert?

Hallo zusammen,

Folgende code-Zeilen machen nicht das wass sie sollen:
1
void sendToDataPort(unsigned char DATA){
2
  sLCD_D0 = DATA &(1 << 0);
3
  sLCD_D1 = DATA &(1 << 1);
4
  sLCD_D2 = DATA &(1 << 2);
5
  sLCD_D3 = DATA &(1 << 3);
6
  return;
7
}

Hinter sLCD_Dx steht:
1
#define sLCD_D0 LATBbits.LATB0
2
#define sLCD_D1 LATBbits.LATB3
3
#define sLCD_D2 LATBbits.LATB4
4
#define sLCD_D3 LATBbits.LATB5

Aufgerufen wird diese Funktion z.B. mit:
1
sendToDataPort(0x03);

Die Erste Ausgabe an sLCD_D0,
funktioniert in Abhängigkeit von DATA. Alle andern nicht.
Im Simmulator landen die Bit's ebenfalls nicht im LATB Register.

Getestet habe ich bereits alle Einzelkomponenten des Ausdrucks:
1
sLCD_D1 = 1;  // <- Funktioniert
2
3
unsigned char test;
4
test = DATA &(1 << 1);  // <- Funktioniert ebenfalls
1
sLCD_D1 = DATA &(1 << 1);  // <- Funktioniert nicht

Seht Ihr den Fehler, ich bin ratlos.

Danke,
Gruss Richard

von hmmm (Gast)


Lesenswert?

PIC kenne ich nicht.

Variablennamen in Großbuchstaben sind keine gute Idee (ist normalerweise 
für Makros reserviert).

Frage: Ein Byte hat 8 Bit, LATBbits.LATBx kann aber offensichtlich nur 1 
Bit speichern. Welches wird da genommen?

Ich tippe mal auf LSB, von daher:
1
void sendToDataPort(unsigned char Data){
2
  sLCD_D0 = (Data >> 0 ) & 1;
3
  sLCD_D1 = (Data >> 1 ) & 1;
4
  sLCD_D2 = (Data >> 2 ) & 1;
5
  sLCD_D3 = (Data >> 3 ) & 1;
6
  /* explizites return unnötig */
7
}


oder ähnlich.

von hmmm (Gast)


Lesenswert?

Das & 1 kann man sich wahrscheinlich auch sparen, probiers aus.

von Richard K. (richardk)


Lesenswert?

Hallo hmmm (Gast),

Tja...  In der Zwischenzeit war ich einkaufen und
bin selbst auf die Lösung / Ursächlichkeit des Problems gekommen.

Mein Lösungsansatz:
1
void sendToDataPort(unsigned char DATA){
2
  sLCD_D0 = DATA &(1 << 0);
3
  sLCD_D1 = (DATA &(1 << 1)) >> 1;
4
  sLCD_D2 = (DATA &(1 << 2)) >> 2;
5
  sLCD_D3 = (DATA &(1 << 3)) >> 3;
6
  return;
7
}

So, dein Lösungsansatz, ink. dem & 1; was ich mir bei genau diesem
Procedere wirklich sparen kann, gefällt mir deutlich besser!

Danke,
Gruss Richard

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.