Skip to content

Лабораторная работа 3

Choose a tag to compare

@Strus05 Strus05 released this 10 Dec 15:30
· 3 commits to main since this release
a4a7725

Система прерываний. Изучение режимов работы системы прерываний

  • Цель работы: изучить режимы работы системы прерываний.

Задачи:

  1. Настроить систему прерываний на срабатывание INT0 по переднему фронту;
  2. Написать код в Atmel, который при нажатии на кнопку активирует прерывание, выводя случайную цифру на семисегментный индикатор;
  3. Построить схему в 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

Видео без названия — сделано в Clipchamp

В схеме при срабатывании прерывания по переднему фронту INT0 port B подаёт сигналы на семисегментный индикатор.

Исходя из того, что в коде мы задали подачу сигнала высокого уровня на нужные светодиоды индикатора, целесообразно использовать катодный семисегментный индикатор.