//***************************************************************************** //* //* Fading LED //* für den Einsatz auf Modelleisenbahnen als Lichtsignal für //* Flugsicherungs - Lichter //* ATmega8 @ 8 MHz //* //* //***************************************************************************** #define F_CPU 8000000L #include #include #include #include // Globale Variablen uint16_t pwmtable_10[64] PROGMEM = {0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 15, 17, 19, 21, 23, 26, 29, 32, 36, 40, 44, 49, 55, 61, 68, 76, 85, 94, 105, 117, 131, 146, 162, 181, 202, 225, 250, 279, 311, 346, 386, 430, 479, 534, 595, 663, 739, 824, 918, 1023}; // Delay-Funktion, damit Variablen den delays mitgegeben werden können void my_delay(uint16_t milliseconds) { for(; milliseconds>0; milliseconds--) _delay_ms(1); } // PWM Funktion: 10bit mit 64 logarithmischen Werten void pwm_10_64(uint16_t delay1, uint16_t delay2, uint16_t delay3, uint16_t delay4){ int16_t tmp; //Zählveriable für die 64 Schleifendurchläufe TCCR1A = 0x83; // non-inverted PWM on OC1A, 10 Bit Fast PWM TCCR1B = 0x08; TCCR1B &= ~0x7; // clear clk setting TCCR1B |= 3; // precaler 64 -> ~122 Hz PWM frequency for(tmp=30; tmp<=63; tmp++){ //original for(tmp=0; tmp<=63; tmp++){ OCR1A = pgm_read_word(pwmtable_10+tmp); my_delay(delay2); } my_delay(delay1); for(tmp=63; tmp>=30; tmp--){ //original for(tmp=63; tmp>=0; tmp--){ OCR1A = pgm_read_word(pwmtable_10+tmp); my_delay(delay3); } my_delay(delay4); } int main(void) { int16_t on_time=1700; //1050 110 110 0 für Mileniumstower (1050 180 180 0 bei verängerter anfangslichtstärke) int16_t rise_time=190; //10 15 400 0 für abklingendes Licht oder ( 1500 200 200 100 bei verlängerter) int16_t fall_time=300; //1 200 350 0 für Blinklicht ( 1500 180 250 120 auch gut bei verlängerter) int16_t stop_time=120; //50 1 1 2000 für Flashlight DDRB = 0xFF; // LED verwendet OC1A daher PortB als Ausgang definieren // test all fading routines PORTD = 0xFF; while(1) { pwm_10_64(on_time,rise_time/16,fall_time/16,stop_time); // immer wieder die PWM Funktion aufrufen }; return 0; }