#define OC0A PB7
#define OC1A PB5
#define OC2A PB4
//int val = 0xFF;
volatile unsigned long int val = 0xFFFF00;
// val это байты по цветам RRGGBB
volatile bool flag_a, flag_b, flag_c;
int main(void)
{
Serial.begin(115200); //инициализация монитора последовательного интерфейса
pinMode(LED_BUILTIN, OUTPUT); //инициализация встроенного светодиода
DDRB |=(1<<OC0A)|(1<<OC1A)|(1<<OC2A);//
/*
====================================================
*******************TIMER0, PWM, 256*****************
====================================================
*/
TCCR0A = (1<<COM0A1)| //Clear OC0A on Compare Match, set OC0A at BOTTOM (non-inverting mode)
(1<<WGM00)|(1<<WGM01); //режим PWM, 256
TCCR0B |= (1 << CS02) |(0 << CS01) | (1 << CS00); // предделитель на 1024
TIMSK0 = (1 << OCIE0A)|(1 << TOIE0);//); // Разрешить прерывание по сравнению с OCR2A и по переполнению
OCR0A=10;
/*
====================================================
*******************TIMER1, PWM, 256*****************
====================================================
*/
TCCR1A = (1<<COM1A1)| //Clear OC1A on Compare Match, set OC1A at BOTTOM (non-inverting mode)
(1<<WGM10); //режим PWM, 256
TCCR1B |= (1 << CS12) |(0 << CS11) | (1 << CS10)| // предделитель на 1024
(1<<WGM12); //режим PWM, 256
TIMSK1 = (1 << OCIE1A)|(1 << TOIE1);//); // Разрешить прерывание по сравнению с OCR2A и по переполнению
OCR1A=10;
/*
====================================================
*******************TIMER1, PWM, 256*****************
====================================================
*/
TCCR2A = (1<<COM2A1)| //Clear OC2A on Compare Match, set OC2A at BOTTOM (non-inverting mode)
(1<<WGM00)|(1<<WGM01); //режим PWM, 256
TCCR2B |= (1 << CS22) |(1 << CS21) | (1 << CS20); // предделитель на 1024
TIMSK2 = (1 << OCIE2A)|(1 << TOIE2);//); // Разрешить прерывание по сравнению с OCR2A и по переполнению
OCR2A=10;
sei();//разрещаем глобальные прерывания
while(1)//основной код программы
{
// _delay_ms(100);
//Serial.println(TCNT1);
val=((val>>1)|(val << (24 - 1))&0xFFFFFF);
_delay_ms(500);
/*
FF0000 - RED
00FF00 - GREEN
0000FF - BLUE
FFFF00 - Yellow
00FFFF - Cyan
0000FF - Magenta
*/
/*
//Serial.println(valghalla, BIN);
String valStr = String(OCR1A, BIN); // Преобразование числа в строку в бинарном формате
while (valStr.length() < 1) { // Добавление ведущих нулей, если строка короче 32 символов
valStr = "0" + valStr;
}
Serial.println(valStr);
//Serial.println(OCR1A);
*/
//val = (((val >> 1) | (val << (24 - 1)))&0xFFFFFF);
/*
String valStr = String(val, BIN); // Преобразование числа в строку в бинарном формате
while (valStr.length() < 24) { // Добавление ведущих нулей, если строка короче 6 символов
valStr = "0" + valStr;
}
Serial.println(valStr);
*/
Serial.print("TIM=");
String valStr = String(OCR0A, BIN); // Преобразование числа в строку в бинарном формате
while (valStr.length() < 8) { // Добавление ведущих нулей, если строка короче 6 символов
valStr = "0" + valStr;
}
Serial.print(" ");
Serial.print(valStr);
valStr = String(OCR1A, BIN); // Преобразование числа в строку в бинарном формате
while (valStr.length() < 8) { // Добавление ведущих нулей, если строка короче 6 символов
valStr = "0" + valStr;
}
Serial.print(" ");
Serial.print(valStr);
valStr = String(OCR2A, BIN); // Преобразование числа в строку в бинарном формате
while (valStr.length() < 8) { // Добавление ведущих нулей, если строка короче 6 символов
valStr = "0" + valStr;
}
Serial.print(" ");
Serial.print(valStr);
Serial.println(" ");
valStr = String(val, BIN); // Преобразование числа в строку в бинарном формате
while (valStr.length() < 24) { // Добавление ведущих нулей, если строка короче 6 символов
valStr = "0" + valStr;
}
//Serial.print("val=");
//Serial.println(valStr);
}
}
ISR(TIMER0_COMPA_vect)
{
}
ISR(TIMER0_OVF_vect)
{
if (flag_a==0)
{OCR0A=((val >> 16) & 0xFF);
if (OCR0A==0)
{OCR0A=1;
flag_a=1;
}
}
else
{
OCR0A=((val >> 16) & 0xFF);
OCR0A = ((OCR0A >> 4) & 15) | ((OCR0A & 15) << 4);
OCR0A = ((OCR0A >> 2) & 51) | ((OCR0A & 51) << 2);
OCR0A = ((OCR0A >> 1) & 85) | ((OCR0A & 85) << 1);
if (OCR0A==0)
OCR0A=1;
//больной ублюдок
if (OCR0A==0b11111111)
{//OCR0A=1;
flag_a=0;
}
}
}
ISR(TIMER1_COMPA_vect)
{
}
ISR(TIMER1_OVF_vect)
{
if (flag_b==0)
{OCR1A=((val >> 8) & 0xFF);
if (OCR1A==0)
{OCR1A=1;
flag_b=1;
}
}
else
{
OCR1A=((val >> 8) & 0xFF);
OCR1A = ((OCR1A >> 4) & 15) | ((OCR1A & 15) << 4);
OCR1A = ((OCR1A >> 2) & 51) | ((OCR1A & 51) << 2);
OCR1A = ((OCR1A >> 1) & 85) | ((OCR1A & 85) << 1);
if (OCR1A==0)
OCR1A=1;
//больной ублюдок
if (OCR1A==0b11111111)
{//OCR1A=1;
flag_b=0;
}
}
}
ISR(TIMER2_COMPA_vect)
{
}
ISR(TIMER2_OVF_vect)
{
if (flag_c==0)
{OCR2A=((val) & 0xFF);
if (OCR2A==0)
{OCR2A=1;
flag_c=1;
}
}
else
{
OCR2A=((val) & 0xFF);
OCR2A = ((OCR2A >> 4) & 15) | ((OCR2A & 15) << 4);
OCR2A = ((OCR2A >> 2) & 51) | ((OCR2A & 51) << 2);
OCR2A = ((OCR2A >> 1) & 85) | ((OCR2A & 85) << 1);
if (OCR2A==0)
OCR2A=1;
//больной ублюдок
if (OCR2A==0b11111111)
{//OCR2A=1;
flag_c=0;
// Serial.print("flag_a=");
// Serial.println(flag_a);
}
}
}