вроде всё просто, герлянда (RGB лента) и attyni 13 простой программный ШИМ на 3 канала Код (C++): #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> #include <util/delay.h> //макросы для включения, выключения светодиодов //низкий уровень - на ножке 0 вольт, высокий уровень - на ножке 5 вольт #define LED1_OFF PORTB &= ~(1<<PB0); //Низкий уровень ножки PB0 (синий) #define LED2_OFF PORTB &= ~(1<<PB1); //Низкий уровень ножки PB1 (зеленый) #define LED3_OFF PORTB &= ~(1<<PB2); //Низкий уровень ножки PB2 (красный) #define LED1_ON PORTB |= (1<<PB0); //Высокий уровень ножки PB0 #define LED2_ON PORTB |= (1<<PB1); //Высокий уровень ножки PB1 #define LED3_ON PORTB |= (1<<PB2); //Высокий уровень ножки PB2 uint8_t counter=0, chenal=0, i=0, j=0, ci=0; uint8_t lev_ch[3]; uint8_t ch[3]; uint8_t buf_lev_ch[3]; ISR(TIM0_OVF_vect){ if (++counter==0) //счетчик перехода таймера через ноль { buf_lev_ch[0]=lev_ch[0]; //значения длительности ШИМ buf_lev_ch[1]=lev_ch[1]; buf_lev_ch[2]=lev_ch[2]; LED1_ON; LED2_ON; LED3_ON; // PORTB |=(1<<PB0)|(1<<PB1)|(1<<PB2); //подаем 1 на все каналы BGR (0=B 1=G 2=R) } if (counter==buf_lev_ch[0]) LED1_OFF; //подаем 0 на канал if (counter==buf_lev_ch[1]) LED2_OFF; //по достижении if (counter==buf_lev_ch[2]) LED3_OFF; //заданной длительности. } int main(void) { DDRB=0b00000111; // установка PortB пины 0,1,2 выходы TCCR0B = _BV(CS00); // таймер работает без предделителя TIMSK0 = _BV(TOIE0);// прерывания по переполнению таймера разрешены sei();// глобально прерывания так же разрешены lev_ch[0]=0; //Синий цвет lev_ch[1]=0; //Зеленый цвет lev_ch[2]=0; //Красный цвет if (lev_ch[0]==0 && lev_ch[1]==0 && lev_ch[2]==0 ) chenal=0; while (1) //бесконечная шарманка { /* //формирование значений со сдвигом на 64 (0-64-127) ch[0]=i%256; ch[1]=(i+64)%256; ch[2]=(i+127)%256; i++; if( ch[0] < 128) {lev_ch[0] = ch[0]; } else {lev_ch[0] = 256-ch[0]; }; if( ch[1] < 128) {lev_ch[1] = ch[1]; } else {lev_ch[1] = 256-ch[1]; }; if( ch[2] < 128) {lev_ch[2] = ch[2]; } else {lev_ch[2] = 256-ch[2]; }; */ //формирование с полными переходами j==i%127; if( ci==0) { lev_ch[0]=j; lev_ch[1]=0; lev_ch[2]=127; if (j==127){ci=1;} } if( ci==1) { lev_ch[0]=127; lev_ch[1]=0; lev_ch[2]=127-j; if (j==127){ci=2;} } if( ci==2) { lev_ch[0]=127; lev_ch[1]=j; lev_ch[2]=0; if (j==127){ci=3;} } if( ci==3) { lev_ch[0]=127-j; lev_ch[1]=127; lev_ch[2]=0; if (j==127){ci=4;} } if( ci==4) { lev_ch[0]=0; lev_ch[1]=127; lev_ch[2]=j; if (j==127){ci=5;} } if( ci==5) { lev_ch[0]=0; lev_ch[1]=127-j; lev_ch[2]=127; if (j==127){ci=0;} } i++; _delay_us(5000); //Пауза 5мс } } не пойму где я ошибся, горит только 1 цвет lev_ch[2]=127.... явно очень тупая и банальная ошибка, но уже 2 часа не пойму где....
удивительно, уже 4й день, а комментов типа "говнокод" "работать не будет" до сих пор нет.... куда делись "профи".....