#include #include #include #include #include //configuratie define's #define PORT_AVR A //PORT van de avr ddr register wordt ook automatisch aangepast #define DIM_SNELHEID 250 //Hoe snel moeten de ledjes dimmen (hoger is langzamer dimmen) #define MAXIMUM_LIGHT 60 //0-200 #define MOVING_TIME 2500 //Hoe snel moeten de ledjes heen en weer bewegen (hoger is langzamer bewegen) #define STOP true //moeten de ledjes stoppen tot alles gedimd is (is mooier) #define AANTAL_LED 8 //aantal leds van een poort die gebruikt worden //end configuratie #define CONCAT_PORT(x, y) x ## y #define CONCAT_PORT2(x, y) CONCAT_PORT(x, y) #define PORT_LED CONCAT_PORT2(PORT, PORT_AVR) #define DDR_LED CONCAT_PORT2(DDR, PORT_AVR) unsigned char state; //states #define RIGHT 0 #define LEFT 1 //pwm waarde van 0 tot 200 unsigned char led[AANTAL_LED]; unsigned char pwm_counter; unsigned char leading_led; unsigned int dim_counter; unsigned short moving_counter; //pwm 1 khz //elke 1/200000 seconde ISR(TIMER1_COMPA_vect) { TCNT1 = 0; //pwm waarde van leds aanpassen met een ingestelde snelheid van DIM_SNELHEID dim_counter++; if(dim_counter == DIM_SNELHEID) { dim_counter = 0; for(unsigned char i = 0; i < AANTAL_LED; i++) { if(led[i] > 0) led[i]--; } } //aan de hand van pwm waarde de uigangen van de ingestelde poort aansturen pwm_counter++; if(pwm_counter == 200) pwm_counter = 0; for(unsigned char i = 0; i < AANTAL_LED; i++) { if((led[i] > 0) && (pwm_counter <= led[i])) { PORT_LED |= (1 << i); } else { PORT_LED &= ~(1 << i); } } //leds laten bewegen moving_counter++; if(moving_counter == MOVING_TIME) { moving_counter = 0; switch(state) { case LEFT://1 if(leading_led == 1) { if(STOP) { if(led[1] == 0) { state = RIGHT; leading_led = 0; } } else { state = RIGHT; } } else { leading_led--; led[leading_led-1] = MAXIMUM_LIGHT; } break; case RIGHT://0 if(leading_led == AANTAL_LED) { if(STOP) { if(led[AANTAL_LED - 2] == 0) { state = LEFT; leading_led = AANTAL_LED + 1; } } else { state = LEFT; } } else { leading_led++; led[leading_led-1] = MAXIMUM_LIGHT; } break; } } } int main () { DDR_LED = 0xff; //elke 1/200000 seconde timer compare interrupt TCCR1B = (1 << CS10); TIMSK1 = (1 << OCIE1A); OCR1A = 80; sei(); state = RIGHT; leading_led = 1; while(1) {//interrupt gestuurd } return 0; }