Forum: Mikrocontroller und Digitale Elektronik OR Verknüpfung


von Dani (Gast)


Lesenswert?

Hallo

- Die Software hab ich für den 89C51RD2 im uVision geschrieben.
- An P0 (8-Bit Ausgang) hab ich 8 Dioden die bei einem log.Low brennen.
- Falls das Programm so durchläuft leuchten die Dioden 8,7,6, was meiner 
Meinung nach richtig ist, wenn ich nun aber das CtrlByte auf 0xA0 ändere 
leuchtet nur die 8., wieso nicht auch die 6. ??
Es läuft darauf hinaus dass wenn immer die if-Bedinung nicht zutrifft, 
die restlichen Abfragen "ignoriert" werden, d.h. immer dann wenn im 
CtrlByte das erste 0 kommt werden die 1 dahinter nicht mehr ausgewertet, 
wieso ???

char mask=0x80, CtrlByte=0xF0, test=0x00, i;
void main ()
{
  while (1)
  {
    if (mask == (mask & CtrlByte))
      test = (mask | test);
    mask = (mask >> 1);

    if (mask == (mask & CtrlByte))
      test = (mask | test);
    mask = (mask >> 1);

    if (mask == (mask & CtrlByte))
      test = (mask | test);

    mask = 0x80;
    P0 = ~test;
    test = 0x00;
     }
}

Vielen Dank
Dani

von Dani (Gast)


Lesenswert?

Ich glaub es nicht, ich hab jetzt sicher 4h mit Versuchen, ihr glaubt es 
nicht, aller Art probiert.

Jetzt funktionierts !!!!

--->>>  anstatt "char",  "unsigned char"

von Peter D. (peda)


Lesenswert?

Bei logischen Operationen wie SHIFT, AND und OR usw. sollte man immer 
unsigned nehmen.

Sonst ergeben sich z.B. mask = 0x80; für jedes mask >>= 1; folgende 
Werte:

0x80
0xC0
0xE0
0xF0
0xF8
0xFC
0xFE
0xFF

Vermute mal, daß war so nicht geplant.

0x80 wird nämlich als negative Zahl interpretiert und dann wird das 
Vorzeichenbit beibehalten.


Peter

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.