#define OC2A PB3
volatile unsigned int counter = 0;
volatile unsigned int MASK = 0b000011111000000;
volatile unsigned int REFER_MASK = 0b000011111000000;
volatile unsigned int REFER_PORTD = 0b000000111100000;
ISR(TIMER2_COMPA_vect)
{
PORTD=PORTD&(MASK>>4);
MASK<<=1;
//Serial.println(MASK);
if (MASK<1)
{MASK |= REFER_MASK;
PORTD|=(REFER_PORTD>>4);
}
}
int main(void)
{
Serial.begin(115200); //инициализация монитора последовательного интерфейса
pinMode(LED_BUILTIN, OUTPUT); //инициализация встроенного светодиода
//DDRB |=(1 << OC2A); // вывод OC2A настраиваем на выход
DDRD |=0b11111100; //
//PORTD|=0b00000000;
TCCR2A = (1<<WGM21); //режим СТС
TCCR2B |= (1 << CS22) |(1 << CS21) | (0 << CS20); // предделитель на 1024
TIMSK2 = (1 << OCIE2A)|(1 << TOIE2);//); // Разрешить прерывание по сравнению с OCR2A и по переполнению
OCR2A=205;
TCCR0A = (1<<WGM01); //режим СТС
TCCR0B |= (1 << CS02) |(0 << CS01) | (1 << CS00); // предделитель на 1024
TIMSK0 = (1 << OCIE0A)|(1 << TOIE0);//); // Разрешить прерывание по сравнению с OCR2A и по переполнению
OCR0A=250;
PCICR =(1 << PCIE2); // Разрешить прерывание по изменения уровня выводов PCINT16...PCINT23
//PCMSK2 =(1<<PD6)|(1<<PD5)|(1<<PD4)|(1<<PD3);//Разрешить прерывание по изменения уровня выводов PD3...PD6
//PORTD|=(1<<PD6)|(1<<PD5)|(1<<PD4)|(1<<PD3);//включаем внутреннюю подтяжку PD3...PD6
sei();//разрещаем глобальные прерывания
while(1)//основной код программы
{
// _delay_ms(100);
Serial.println(TCNT0);
if (((REFER_PORTD>>4) & (0b11111111)) <1)
{
REFER_PORTD =0b00111100;
}
if (((REFER_MASK>>4)& (0b11111111))<1)
{
REFER_MASK = 0b11111000;
}
//Serial.println(TCNT2);
}
}
ISR(TIMER0_COMPA_vect)
{
REFER_PORTD<<=1;
REFER_MASK<<=1;
}
ISR(TIMER2_OVF_vect)
{
}
ISR(TIMER0_OVF_vect)
{
//обработчик прерывания по переполнения таймера 2
}
ISR(PCINT2_vect)//обработчик прерывания по изменения уровня выводов PCINT16...PCINT23
{
}