//Используется таймер-счётчик T1 // некоторые светодиоды бегают туда-сюда // при этом - один светодиод меняет своё состояние чараз определённый //промежуток времени (1 Гц) задающийся функцией прерывания по переполнению Т1 //---------------------------------------------------------------------- #include #include interrupt [TIM1_OVF] void timer1_ovf_isr(void) // функция прерывания { TCNT1=0x10000-0x1E85; //для частоты тактирования 8Мгц и делителя 1024 получаем, //что в одну секунду в TCNT1 регистр прибавится (8*10^6)/1024=7813, //следовательно, необходимо выставить "таймер", что бы переполнение произошло через //это колличество тактов PORTB.3=~PORTB.3; } void main(void) { unsigned char a=200; #pragma optsize- CLKPR=0x80; CLKPR=0x00; #ifdef_OPTIMIZE_SIZE_ #pragma optsize+ #endif PORTB=0x00; DDRB=0xFF; TCCR1A=0x00; TCCR1B=0x05; // выбор входных импульсов с тактового генератора через предделитель на 1024 TCNT1=0x10000-0x1E85; //для частоты тактирования 8Мгц и делителя 1024 получаем, //что в одну секунду в TCNT1 регистр прибавится (8*10^6)/1024=7813, //следовательно, необходимо выставить "таймер", что бы переполнение произошло через //это колличество тактов TIMSK=0x80; // разрешаем прерывания по переполнению Т1 (для T0 = 0x02) #asm ("sei") //глобальное включение прерываний (выключить можно по сбросу I бита -> "cli") while(1) { PORTB.0=1; delay_ms(a); PORTB.1=1; delay_ms(a); PORTB.2=1; delay_ms(a); PORTB.4=1; delay_ms(a); PORTB.7=1; delay_ms(a); PORTB.5=1; delay_ms(a); PORTB.5=0; delay_ms(a); PORTB.7=0; delay_ms(a); PORTB.4=0; delay_ms(a); PORTB.2=0; delay_ms(a); PORTB.1=0; delay_ms(a); PORTB.0=0; delay_ms(a); }; }