Repository navigation
Лабораторная работа 3
Система прерываний. Изучение режимов работы системы прерываний
- Цель работы: изучить режимы работы системы прерываний.
Задачи:
- Настроить систему прерываний на срабатывание INT0 по переднему фронту;
- Написать код в Atmel, который при нажатии на кнопку активирует прерывание, выводя случайную цифру на семисегментный индикатор;
- Построить схему в Proteus, проверив в нём работоспособность программы.
Код программы в Atmel Studio
#include <avr/io.h>
#include <avr/interrupt.h>
volatile char n=0;
//Создаём массив, индекс элемента которого равен отображаемому на индикаторе числу, а значение элемента равен сигналу на выводе PB (выводы PB0-PB6 соответствуют ABCDEFG индикатора)
uint8_t digit_codes[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
// При срабатывании прерывания (передний фронт на PD2) port B выдаёт сигнал на индикатор
ISR(INT0_vect)
{
PORTB=digit_codes[n];
}
int main(void)
{
DDRB=0xff; // Порты B будут работать на выводы индикатора
EICRA|=(1<<ISC00) | (1<<ISC01); //прерывание INT0 будет происходить по переднему фронту
EIMSK|=(1<<INT0); //разрешение прерывания INT0
unsigned char i;
sei(); //разрешение прерываний
while(1)
{
for(i=0;i<10;i++)
{
n = i;
}
}
}
Демонстрация работы схемы в Proteus
В схеме при срабатывании прерывания по переднему фронту INT0 port B подаёт сигналы на семисегментный индикатор.
Исходя из того, что в коде мы задали подачу сигнала высокого уровня на нужные светодиоды индикатора, целесообразно использовать катодный семисегментный индикатор.
