ISR (TIMER1_COMPA_vect)

ISR это управляющее слово указывает транслятору на то, что данная функция является процедурой обработки прерываний. Вид прерывания , которое будет вызывать данную функцию указывается в скобках, это TIMER1_COMPA_vect, означает, что данная функция является процедурой обработки прерывания по совпадению таймера Т1. Функция обработки прерываний занимается сдвигом содержимого переменной temp на один шаг вправо или влево, в зависимости от положения переключателя S1.

 

ISR (TIMER1_COMPA_vect)

{

if ((PINC&(1 << PC0)) == 0) // Проверка состояния переключателя

{

temp = temp >> 1; // Сдвиг вправо

if (temp == 0) // если temp = 0

{

temp = 0b10000000;

}

}

else

{

temp = temp << 1; // Сдвиг влево

if (temp == 0)

{

temp = 0b00000001;

}

 

}

PORTB = temp; // Запись в порт PB

}

 

Для проверки состояния переключателя служит команда if. Эта команда проверяет значение младшего разряда порта C. Если значение разряда равно нулю, то выполняется процедура сдвига на один бит вправо, если равно единице выполняется сдвиг влево. Так же еще один оператор if проверяет, не дошла ли сдвигаемая единица до конца байта. Признаком того, сто единица уже дошла до конца , является равенство переменной temp нулю. Если условие выполняется, то переменной temp будет присвоено значение 0b00000000. То есть дойдя до правого края, единица появляется слева. Таким образом реализуется эффект кругового движения единичного бита. Процедура сдвига влево построена таким же образом. После выполнения одной из процедур сдвига производится запись содержимого переменной temp в порт B.

Теперь необходимо настроить порты, таймер и разрешить прерывания.

Пишем главную функцию int main(void){}

 

Настраиваем порты ввода-вывода:

DDRC = 0x00; //на вход

PORTC |= (1 << PC0); // Подключаем внутренний резистор

DDRB = 0xFF; //на выход

PORTB = 0x00; //обнуляем все значения порта

 

Далее настраиваем таймер.

В микроконтроллере Atmega8 имеются 3 таймера: 2 восьмиразрядных и 1 шестнадцатиразрядный. Для формирования временных интервалов таймер просто подсчитывает тактовые импульсы от системного генератора.В нашем случае частота равна 4 MHz, а период импульсов 1/4MHz=0,25мкс. Для того чтобы получить на выходе 200мс, необходимо иметь коэффициент деления равный 200мс/0,25мкс= 800000. Восьмиразрядный таймер имеет максимальный коэффициент пересчета 28=256, а шестнадцатиразрядный 216=65536. То есть даже шестнадцатиразрядного таймера нам не хватит для формирования требуемой задержки. Тогда воспользуемся предварительным делителем. Этот делитель производит предварительное деление тактового сигнала перед тем как он поступит на вход таймера.

Выберем самый большой коэффициент предделителя 1024.Тогда на его выходе получим сигнал с частотой 4MHz/1024=3906Hz . Период тактового сигнала будет равен 1/3906Hz=0,256мс. Посчитаем коэффициент деления, который наш таймер должен нам обеспечить: 200мс/0,256мс=780. Такой коэффициент пересчета нам может обеспечить только шестнадцатиразрядный таймер Т1.

 

Настройка таймера заключается в правильной установке битов в специальном регистре.

Для TCCR1B из даташита на микроконтроллер Atmega8 выбираем коэффициент предделителя 1024, и устанавливаем нужные биты CS в единицу.

TCCR1A = 0x00;

TCCR1B = (1 << CS12)|(0 << CS11)|(1 << CS10)|(1 << WGM12); //предделитель clk/1024, режим таймера СТС

TCNT1 = 0x00;

OCR1A = 780; // выбор коэффициента деления

TIMSK |= (1 << OCIE1A); // разрешение прерывания по совпадению

 

Присваиваем начальное значение temp:

temp = 0b00000000;

 

Разрешаем прерывания:

 

sei();

 

И добавляем бесконечный цикл:

 

while (1)

{

};

 

Полный текст программы будет выглядеть так:

 

 

Компилируем в .hex файл, с помощью Build/Build Solution .

 

 

2.2.Открываем Proteus и создаём новый проект.

К каждой ножке порта B присоединяем по светодиоду и токоограничивающему резистору и зажаем на землю. к ножке PC0 присоединяем кнопку Button, а другой конец так же присоединяем к земле(GND). Кнопку Button можно найти в том же Pick Devices, где и остальные компоненты, только нужно прописать в строке поиска(Keywords) “Button” и выбрать, щёлкнув дважды.

В конечном счёте получится такая схема:

 

Наши расчёты верны тольно при частоте 4 МГц, так что ставим в настройках нашего МК частоту 4МГц от внутреннего генератора.

И в этом же окне указываем путь к прошивке.