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
Lesezeichen