/* 
Пример перемещающегося светодиода
Чип: ATtiny2313
*/
// Определения регистров ввода/вывода для ATtiny2313
#include <90s2313.h>
// частота кварца [Hz]
#define xtal 4000000
// частота перемещения светодиода [Hz]
#define fmove 2
// Программа обслуживания прерывания по переполнению Таймера/Счетчика1,
// которое происходит каждые 8 секунд
interrupt [TIM1_OVF] void timer1_overflow(void)
{
// снова инициализируем Таймер/Счетчик 1
TCNT1=0x10000-(xtal/1024/fmove);
// проверяем зажигание последнего светодиода
if(PORTB != 0xDf)
{   
PORTB=(PORTB<<1)|1;  // переместим и включим светодиод
}
}
void main(void)
{
// установим порты ввода/вывода
// все выводы PORTB - выходы
DDRB=0x3f;
// включим первый светодиод
PORTB=0xfe;
// инициализируем Таймер/Счетчик 1
// Таймер/Счетчик 1 отсоединим от вывода OC1
// ШИМ нет
TCCR1A=0;
// тактовая частота Таймера/Счетчика 1 - xtal/1024
TCCR1B=5;
// инициализируем Таймер/Счетчик 1
TCNT1=0x10000-(xtal/1024/fmove);
// очистим флаги прерываний Таймера/Счетчика 1
TIFR=0;
// разрешим прерывание по переполнению Таймера/Счетчика 1
TIMSK=0x80;
// запретим все другие источники прерываний
GIMSK=0;
// глобальное разрешение прерываний
#asm
sei
#endasm
// остальное делается посредством прерываний 
// по переполнению Таймера/Счетчика 1
while(PORTB != 0xDf);
}




