PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LED's über mehrere Ports verteilt



Ampfing
10.09.2006, 10:43
Hallo zusammen,

ich habe folgende Situation:
An einem ATMega8 sind insgesamt 10 LED's angeschlossen. Diese sind über alle drei Ports verteilt (PD2-PD5, PB4-PB5, PC0-PC3).
Jetzt möchte ich über die 10 LED's ein Lauflicht programmieren. Bis jetzt löse ich das Ganze, indem ich mitzähle bei welcher LED ich gerade bin und dann die entsprechend nächste LED per |= einschalte. Das schaut aber ehrlich gesagt nicht so wirklich toll aus


void Lauflicht1(void)
{
//schaltet das Lauflicht eine Position weiter
switch (zaehler)
{
case 0:
//->erste weiße LED ist an
PORTD &= 0xfb;
PORTD |= 0x8;
break;
case 1:
//->zweite weiße LED ist an
PORTD &= 0xf7;
PORTD |= 0x10;
break;
case 2:
//->dritte weiße LED ist an
PORTD &= 0xef;
PORTD |= 0x20;
break;
case 3:
//->vierte weiße LED ist an
PORTD &= 0xc3;
PORTB |= 0x10;
break;
case 4:
//->erste grüne LED ist an
PORTB &= 0xef;
PORTB |= 0x20;
break;
case 5:
//->zweite grüne LED ist an
PORTB &= 0xdf;
PORTC |= 0x1;
break;
case 6:
//->erste der weißen LED's ist an
PORTC &= 0xfe;
PORTC |= 0x2;
break;
case 7:
//->zweite der weißen LED's ist an
PORTC &= 0xfd;
PORTC |= 0x4;
break;
case 8:
//->dritte der weißen LED's ist an
PORTC &= 0xfb;
PORTC |= 0x8;
break;
case 9:
//->letzte der weißen LED's ist an->zurückgehen
PORTC &= 0xf0;
PORTC |= 0x4;
break;
case 10:
//->dritte der weißen LED's ist an
PORTC &= 0xfb;
PORTC |= 0x2;
break;
case 11:
//->zweite der weißen LED's ist an
PORTC &= 0xfd;
PORTC |= 0x1;
break;
case 12:
//->erste der weißen LED's ist an
PORTC &= 0xfe;
PORTB |= 0x20;
break;
case 13:
//->zweite der grünen LED's ist an
PORTB &= 0xdf;
PORTB |= 0x10;
break;
case 14:
//->erste der grünen LED's ist an
PORTB &= 0xef;
PORTD |= 0x20;
break;
case 15:
//->vierte der weißen LED's ist an
PORTD &= 0xdf;
PORTD |= 0x10;
break;
case 16:
//->dritte der weißen LED's ist an
PORTD &= 0xef;
PORTD |= 0x8;
break;
case 17:
//->zweite der weißen LED's ist an
PORTD &= 0xf7;
PORTD |= 0x4;
break;
}
if (zaehler < 17)
{
zaehler++;
}
else
{
zaehler = 0;
}
}

Den Code finde ich nicht besonders toll wenn ich ehrlich sein darf. Gibt es eine Möglichkeit das Ganze eleganter zu machen? Optimal wäre natürlich, wenn ich einfach nur mit links- bzw. rechtsshift arbeiten könnte...

Vielen Dank im voraus schonmal fürs lesen und viele Grüße

PicNick
10.09.2006, 16:51
Ich mach sowas, indem ich zwei Tabellen anlege:


char cPortAddr[17] = { port1, port2,...... port17 };
char cPinMask[17] = { 0x10, 0x20,...... 0xNN };
Portaddr aus dem Datenblatt IO-REG, d.h. meist z.B. PORTD + 0x20

LedAufdrehen( zaehler)
{
uint* Port = cPortAddr[zaehler];
*Port |= cPinMask[zaehler];
}
LedAbdrehen( zaehler)
{
uint* Port = cPortAddr[zaehler];
*Port &= ~cPinMask[zaehler];
}

while (1)
{
sleep (x) // oder sowas ähliches
LedAbdrehen( zaehler);
if (zaehler < 17) zaehler++;
else zaehler = 0;
LedAufdrehen( zaehler);
}


Verständlich ?

Ampfing
10.09.2006, 17:31
Hallo Robert,

ja, dein Code ist verständlich :-)
Danke für den Tipp, das schaut auf jeden Fall schon sehr viel besser aus als mein Versuch.

Viele Grüße