Hallo

Wenn man mehrere LEDs ansteuern will...
"Mehrere" ist relativ, ich spiele zur Zeit mit 12 LEDs an 4 AVR-Ports. Die "Technik" dazu wird hier ganz gut beschrieben:
http://www.josepino.com/pic_projects...ntrol_leds.jpc

Es wird dabei die Tri-State-Fähigkeit der AVR-Ausgänge genutzt. Da immer nur eine LED eingeschaltet wird ist der Strom unkritisch:
http://www.youtube.com/watch?v=ZPYhrQl-d4M
http://www.youtube.com/watch?v=r54xOzr0VDA

Das Programm dazu gibt per Interrupt ein Bitmuster aus, die ISR sieht so aus:
Code:
ISR (TIMER0_COMP_vect)
{
		static uint8_t  bit=0;
		if((bitmuster & (1<<bit))==1){
			DDRC|=SL1; PORTC|=SL1; //SL1 high
	   	DDRC|=SL2; PORTC&=~SL2; //SL2 low
	   	DDRB&=~SL4; PORTB&=~SL4; //SL4 off
		   DDRB&=~SL5; PORTB&=~SL5; //SL5 off
		}
		if((bitmuster & (1<<bit))==2){
			DDRC|=SL1; PORTC|=SL1; //SL1 high
	   	DDRB|=SL4; PORTB&=~SL4; //SL4 low
	   	DDRC&=~SL2; PORTC&=~SL2; //SL2 off
		   DDRB&=~SL5; PORTB&=~SL5; //SL5 off
		}
		if((bitmuster & (1<<bit))==4){
			DDRC|=SL1; PORTC|=SL1; //SL1 high
	   	DDRB|=SL5; PORTB&=~SL5; //SL5 low
	   	DDRC&=~SL2; PORTC&=~SL2; //SL2 off
	   	DDRB&=~SL4; PORTB&=~SL4; //SL4 off
		}
		if((bitmuster & (1<<bit))==8){
			DDRC|=SL2; PORTC|=SL2; //SL2 high
	   	DDRC|=SL1; PORTC&=~SL1; //SL1 low
	   	DDRB&=~SL4; PORTB&=~SL4; //SL4 off
	   	DDRB&=~SL5; PORTB&=~SL5; //SL5 off
  		}
		if((bitmuster & (1<<bit))==16){
			DDRC|=SL2; PORTC|=SL2; //SL2 high
	   	DDRB|=SL4; PORTB&=~SL4; //SL4 low
	   	DDRC&=~SL1; PORTC&=~SL1; //SL1 off
	   	DDRB&=~SL5; PORTB&=~SL5; //SL5 off
		}
		if((bitmuster & (1<<bit))==32){
			DDRC|=SL2; PORTC|=SL2; //SL2 high
	   	DDRB|=SL5; PORTB&=~SL5; //SL5 low
	   	DDRC&=~SL1; PORTC&=~SL1; //SL1 off
	   	DDRB&=~SL4; PORTB&=~SL4; //SL4 off
		}
		if((bitmuster & (1<<bit))==64){
	   	DDRB|=SL4; PORTB|=SL4; //SL4 high
	   	DDRC|=SL1; PORTC&=~SL1; //SL1 low
	   	DDRC&=~SL2; PORTC&=~SL2; //SL2 off
	   	DDRB&=~SL5; PORTB&=~SL5; //SL5 off
  		}
		if((bitmuster & (1<<bit))==128){
	   	DDRB|=SL4; PORTB|=SL4; //SL4 high
	   	DDRC|=SL2; PORTC&=~SL2; //SL2 low
	   	DDRC&=~SL1; PORTC&=~SL1; //SL1 off
	   	DDRB&=~SL5; PORTB&=~SL5; //SL5 off
		}
		if((bitmuster & (1<<bit))==256){
	   	DDRB|=SL4; PORTB|=SL4; //SL4 high
	   	DDRB|=SL5; PORTB&=~SL5; //SL5 low
	   	DDRC&=~SL2; PORTC&=~SL2; //SL2 off
	   	DDRC&=~SL1; PORTC&=~SL1; //SL1 off
		}
		if((bitmuster & (1<<bit))==512){
	   	DDRB|=SL5; PORTB|=SL5; //SL5 high
	   	DDRC|=SL1; PORTC&=~SL1; //SL1 low
	   	DDRC&=~SL2; PORTC&=~SL2; //SL2 off
	   	DDRB&=~SL4; PORTB&=~SL4; //SL4 off
  		}
		if((bitmuster & (1<<bit))==1024){
	   	DDRB|=SL5; PORTB|=SL5; //SL5 high
	   	DDRC|=SL2; PORTC&=~SL2; //SL2 low
	   	DDRC&=~SL1; PORTC&=~SL1; //SL1 off
	   	DDRB&=~SL4; PORTB&=~SL4; //SL4 off
		}
		if((bitmuster & (1<<bit))==2048){
	   	DDRB|=SL5; PORTB|=SL5; //SL5 high
	   	DDRB|=SL4; PORTB&=~SL4; //SL4 low
	   	DDRC&=~SL1; PORTC&=~SL1; //SL1 off
	   	DDRC&=~SL2; PORTC&=~SL2; //SL2 off
		}
    	if(bit<11) bit++; else bit=0;
}
Nicht wirklich elegant, funktioniert aber zufriedenstellend.

Gruß

mic