Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные работы готовые / Лабораторная работа 4 Стек. Прерывания. Таймерысчетчики

.docx
Скачиваний:
0
Добавлен:
21.06.2024
Размер:
140.43 Кб
Скачать

Задание 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)

{ }

}

Расчеты константы: