Hallo
kann man nicht die LEDs einzeln ansteuern und schnell hintereinander an und ausmachen?
Genau so funktioniert das. Bei meinen Beispielvideos (und all den anderen Videos bei Youtube zu dem Thema) wir das so gemacht.
Es werden dabei alle drei Zustände der AVR-Pins verwendet: High, Low und Eingang (ohne PullUp, auch Z-State genannt). Lies dich mal ein, das ist ein interessantes Thema ;)
Zur Ansicht hier mein Arbeitscode für 12 LEDs an den LEDs der RP6-Base ohne ISR (sollte auch mit der RP6-Lib funktionieren). Es wird ein statisches Bitmuster ausgegeben:
Code:
// Lauflicht mit 12 LEDs an 4 Pins mit Charlieplexing 1.3.2008 mic
#include "rblib.h"
#include "rblib.c"
volatile uint16_t bitmuster;
uint8_t p=0, bit=0;
int main(void)
{
rblib_init();
DDRC&=~SL1; PORTC&=~SL1; //SL1 off
DDRC&=~SL2; PORTC&=~SL2; //SL2 off
DDRB&=~SL4; PORTB&=~SL4; //SL4 off
DDRB&=~SL5; PORTB&=~SL5; //SL5 off
bitmuster=0b110011001100;
//bitmuster=0b111111111111;
while(1)
{
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<12) bit++; else bit=0;
}
return 0;
}
Mit ISR (und minimaler Lib) und Lauflicht. Das ist der Nightrider-Code aus den Videos:
Code:
// Lauflicht mit 12 LEDs an 4 Pins mit Charlieplexing 1.3.2008 mic
#include "rblib.h"
#include "rblib.c"
uint16_t bitmuster;
uint16_t demo1[]={
0b100000000001, 0b010000000010, 0b001000000100, 0b000100001000, 0b000010010000,
0b000001100000, 0b000010010000, 0b000100001000, 0b001000000100, 0b010000000010 };
uint16_t demo2[]={
0b110000000011, 0b011000000110, 0b001100001100, 0b000110011000, 0b000011110000,
0b000001100000, 0b000011110000, 0b000110011000, 0b001100001100, 0b011000000110,
0b110000000011, 0b100000000001 };
uint16_t demo3[]={
0b100000000000, 0b110000000000, 0b011100000000, 0b001110000000, 0b000111000000,
0b000011100000, 0b000001110000, 0b000000111000, 0b000000011100, 0b000000001110,
0b000000000111, 0b000000000011, 0b000000000001 };
uint8_t repeat, i;
int main(void)
{
rblib_init();
DDRC&=~SL1; PORTC&=~SL1; //SL1 off
DDRC&=~SL2; PORTC&=~SL2; //SL2 off
DDRB&=~SL4; PORTB&=~SL4; //SL4 off
DDRB&=~SL5; PORTB&=~SL5; //SL5 off
cli();
TCCR0 = (0 << WGM00) | (1 << WGM01); // CTC-Mode
TCCR0 |= (0 << COM00) | (0 << COM01); // ohne OCR-Pin
TCCR0 |= (0 << CS02) | (1 << CS01) | (0 << CS00); // prescaler /8
TIMSK = (1 << OCIE0); // Interrupt ein
OCR0 = 199;
sei();
while(1)
{
repeat=5;
while(repeat--) for(i=0; i<10; bitmuster=demo1[i++]){ delay(255); delay(255); }
repeat=5;
while(repeat--) for(i=0; i<10; bitmuster=~demo1[i++]){ delay(255); delay(255); }
repeat=5;
while(repeat--) for(i=0; i<12; bitmuster=demo2[i++]){ delay(255); }
repeat=5;
while(repeat--) for(i=0; i<12; bitmuster=~demo2[i++]){ delay(255); }
repeat=5;
while(repeat--) for(i=0; i<13; bitmuster=demo3[i++]){ delay(255); delay(255); }
repeat=5;
while(repeat--) for(i=0; i<13; bitmuster=~demo3[i++]){ delay(255); delay(255); }
}
return 0;
}
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;
}
Gruß
mic
Lesezeichen