Port ansteuern / Bitmaske über Daten (C18)

OP #2302245
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
Gast #2302252
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.
OP #2302305
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren