
Лабораторные работы готовые / Лабораторная работа 4 Стек. Прерывания. Таймерысчетчики
.docx
Задание 1
Разработать программу на языке Assembler для устройства, реализующего бегущий огонь на 8 светодиодах. Время переключения светодиодов задается программной задержкой в виде подпрограммы. Частота работы микроконтроллера равна 2 МГц. Время задержки должно быть приблизительно равно в соответствии с вариантом (табл. 4.4).
include "m32def.inc" ; подключение библиотеки Atmega32
.def temp = r16
.def sregsave = r17
.def count1 = r18
.def count2 = r19
.cseg ; начало сегмента кода
.org 0
ldi temp,low(RAMEND) ; размещение вершины стека по адресу
out spl,temp ; последней ячейки ОЗУ
ldi temp,high(RAMEND)
out sph,temp
ldi temp,0xFF ; инициализация портов ввода/вывода
out DDRB,temp ; PORTB - на вывод
ldi temp,0x01 ; стартовая позиция
main:
out PORTB,temp ; вывод на PORTB (включение светодиода)
in sregsave,SREG ; сохранение состояния регистра SREG
rcall delay1 ; вызов подпрограммы задержки delay1
out SREG,sregsave ; восстановление SREG после возврата из delay1
rol temp ; цикличный сдвиг temp вправо
rjmp main ; возврат в начало
delay1:
clr count1 ; обнуление счетчика count1
met1:
inc count1 ;
cpi count1,0xE1 ;
brne met1 ; если count2!=0xFF, то переход на met2
ret
Расчеты константы:
,
,
;
;
.
Задание 2
Разработать программу на языке C для устройства, последовательно выводящего цифры по возрастанию на 7-сегментный индикатор. Время переключения цифр задается аппаратной задержкой. Частота работы микроконтроллера равна 2 МГц. Время задержки должно быть приблизительно равно в соответствии с вариантом (табл. 4.5). Привести расчеты константы
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char i;
void segcharCC (unsigned char seg)
{
switch(seg)
{
case 1: PORTD = 0b00000110;break;
case 2: PORTD = 0b01011011; break;
case 3: PORTD = 0b01001111; break;
case 4: PORTD = 0b01100110; break;
case 5: PORTD = 0b01101101; break;
case 6: PORTD = 0b01111101; break;
case 7: PORTD = 0b00000111; break;
case 8: PORTD = 0b01111111; break;
case 9: PORTD = 0b01100111; break;
case 0: PORTD = 0b00111111; break;
}
}
void timer_ini(void)
{
TCCR1B |= (1<<WGM12);
TIMSK |= (1<<OCIE1A);
OCR1AH = 0b00001001;
OCR1AL = 0b10001001;
TCCR1B |= (1<<CS12) | (1<<CS10);
}
ISR (TIMER1_COMPA_vect)
{
if( i > 9 ) i = 0;
segcharCC(i);
i++;
}
int main(void)
{
timer_ini();
DDRD = 0xFF;
PORTD = 0b11111111;
i = 0;
sei();
while(1)
{ }
}
Расчеты константы: