Forum: Mikrocontroller und Digitale Elektronik Microchip C18 Frage


von Kent (Gast)


Lesenswert?

Hallo

ich möchte gerne Fehlercodes durch Blinkmuster einer LED ausgeben. Das
Muster wird in einem 8-Bit Wort "status" definiert.

Mein erster Ansatz war, einfach durch das Wort zu shiften und so die
einzelnen Bits nacheinander auf die LSB-Position zu bringen, die
anscheinend(???) ausschlaggebend ist, wenn man einem IO-Port ein 8-Bit
Wort zuweist:

while(1)
{
  tmp=status;
  for(i=0;i<8;i++)
  {
    PORTCbits.RC0 = tmp;
    tmp>>=1;
  }
}

Verrückterweise funktioniert das aber nicht; irgendwie werden zuviele
Einsen ausgegeben. Das Blinkmuster 10100000 zum Beispiel sieht aus wie
ganz normales gleichmäßiges Blinken.

Mein zweiter Anlauf funktioniert zwar, aber irgendwie kann das nicht
die wahre Lösung sein:

while(1)
{
  for(i=0;i<8;i++)
  {
    PORTCbits.RC0 = (status&(1<<i))>>i;;
  }
}

Zwei Bitshift-Operationen sind in meinen Augen zuviel Aufwand für so
eine simple Sache. Wieso funktioniert mein erster Ansatz nicht?

Vielen Dank schonmal

Kent

von Geri (Gast)


Lesenswert?

Hallo Kent

Ich kann mir vorstellen, dass im ersten Fall die Variable tmp bis zur
letzen Shiftoperation immer > 0 ist. Deshalb wird auf dem IO-Pin eine 1
ausgegeben.

Lösung 2 sieht meiner Meinung nach nicht schlecht aus.
Funktionieren könnte auch

 for(i=0;i<8;i++)
 {
    PORTCbits.RC0 = Status & 0x01;
    Status >>1;
 }

Das ist eine Shiftoperation weniger.

Beste Grüsse
Geri

von Kent (Gast)


Lesenswert?

Werde ich mal probieren; danke für den Vorschlag!

Herzliche Grüße

Kent

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.