Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методическое пособие 51.doc
Скачиваний:
6
Добавлен:
30.04.2022
Размер:
5.89 Mб
Скачать

2. Порядок выполнения работы Контрольные вопросы по допуску к работе

  1. Состав и основные возможности среды AVR Studio.

  1. Состав РСП и назначение его разрядов.

  1. Организация портов МК AVR.

  2. Конфигурирование портов и управление данными.

  3. Организация таймеров МК AVR. Их функции и возможности использования.

  4. Конфигурирование таймеров и управление ими.

2.1. Предварительное задание

Изучите приведенные выше сведения об интегрированной среде разработки AVR Studio. В слу­чае надобности используйте материалы /3/.

Проанализируйте приведенный ниже пример 1, называя вслух каждую из директив и команд согласно приложениям 1 и 2.

/*********************************************************/

/* УПРАВЛЕНИЕ СВЕТОДИОДОМ */

/*********************************************************/

/*Служебная инициализация*/

.include "m162def.inc" //подключение внешних библиотек

.macro outi //определение макроса, необходимого

ldi R16,@1 // для упрощения записи команд

out @0,R16

.endmacro

.cseg // настроить размещение в памяти программ:

.org 0x0000 // в нулевую ячейку - команду перехода на _rst

rjmp _rst // при пуске или для перезапуска

.org 0x003A // установить программный счётчик равным 0x003A,

// чтобы не попасть на область векторов прер.

// данной модели МК (до $44 для m128)

_rst:

outi SPL,low(RAMEND) //инициализация стека,

outi SPH,High(RAMEND) //определение его вершины

//по данным библиотеки

rjmp _start //переход в начало программы

/*Основная программа*/

_start:

ldi r16,0x01 //установка параметров порта B

out ddrb,r16 //(линия 0 работает как выход)

_m0: //установка линии 0 порта В

sbi portb,0 //в лог.1

cbi portb,0 //сброс В.0 в лог.0

rjmp _m0 //переход на метку _m0

На примере строки outi SPL, low(RAMEND) отобразите графически свертывание последовательности команд в макрокоманду outi по схеме:

outi <куда>,<что> // определение макрокоманды,

↓ ↓

@0 @1 // соответствующей паре команд,

ldi R16,@1

out @0,R16 //

опишите назначение этой последовательности.

Составьте структурную схему для примера 1, отобразив только логические связи модулей, начинающихся с каждой из меток (_х, где х – любой набор символов). Оформите схему алгоритма по аналогии с алгоритмами из вашего отчета по /2/.

Повторите сведения о таймерах МК и их регистрах, изложенные в /1/. В случае надобности используйте материалы /4-9/, файлы учебного курса и лекции.

Приведенная в первом примере программа позволяет, например, управлять светодиодом, подключенным через токозадающий резистор к изучаемому разряду порта. Однако результат работы программы будет виден только в режиме пошаговой отладки. В режиме реального времени светодиод будет переключаться с частотой, близкой к тактовой частоте микроконтроллера 1МГц (период повторения определяется длиной петли _m0), поэтому будет казаться, что светодиод горит постоянно. Следовательно, необходимо разместить в коде программы некоторую задержку, которую корректнее всего реализовать с помощью таймера/счетчика. Его использование было рассмотрено в /2/. Проанализируйте пример 2, приведенный ниже. В  данном примере применен 16-разрядный таймер/счетчик Т/С1. При инициализации программы в счетный регистр TCNT1 этого таймера заносится значение (65535 – n), где n – количество тактов, которое нужно «досчитать» до переполнения Т/С1. Как только счетный регистр таймера достигает своего максимального значения, происходит переполнение таймера и возникает соответствующее прерывание. В подпрограмме обработки данного прерывания значение нулевой линии порта В меняется на противоположное, а также происходит запись в счетный регистр TCNT1 первоначального значения. Таким образом достигается необходимая задержка времени. Исходный код программы (пример 2) приведен ниже.

/*********************************************************/

/* УПРАВЛЕНИЕ СВЕТОДИОДОМ v2 */

/*********************************************************/

/*Служебная инициализация*/

.include "m162def.inc" //подключение внешних библиотек

.cseg //размещение программ в памяти

.org 0x0000

rjmp _rst //по адресу 0 – переход на _rst

.org ovf1addr //безусловный переход при переполнении Т/С1:

rjmp _timer1ov //в ячейке ovf1addr (адрес задан в биб-ке)

// указан переход на метку _timer1ov

.org 0x0048

_rst:

.macro outi //определение макроса, необходимого

ldi R16,@1 //для обозначения границ стека

out @0,R16

.endmacro

outi SPL,low(RAMEND) //инициализация стека,

outi SPH,High(RAMEND) //определение его вершины

rjmp _start //переход в начало программы

/*Обработчик прерывания по таймеру*/

_timer1ov:

cli //временный запрет всех прерываний

ldi r16, high(65535-3906)//загрузка в счетный

out tcnt1h,r16 // регистр Т/C1 начального

ldi r16, low(65535-3906) // значения, соответствующего

out tcnt1l,r16 // периоду переполнения Т/С1 1/256 с

sbic portb,0 //пропуск следующей инструкции,

//если portb.0=0

rjmp _m0 //безусловный переход на метку _m0

sbis portb,0 //пропуск следующей инструкции,

//если portb.0=1

sbi portb,0 //установка portb.0

rjmp _end0 //безусловный переход на метку

// _end0

_m0: cbi portb,0 //сброс portb.0

_end0:

sei //разрешение всех прерываний

reti //выход из процедуры обработки

//прерывания

/*Основная программа*/

_start:

ldi r16,0x01 //установка параметров порта B

out ddrb,r16 //(мл. бит работает как выход)

ldi r16, 1<<toie1 //разреш. прер. по перепол. Т/С11

out timsk,r16 //(установка маски прерываний)

sei //разрешение всех прерываний

ldi r16,high(65535-3906) //загрузка в 16-ти битный

out tcnt1h,r16 //регистр Т/C1 начального

ldi r16,low(65535-3906) //значения, соотв. периоду

out tcnt1l,r16 //переполнения Т/С1 1/256 с

ldi r16,0x01 //запуск Т/С1 и установка

out tccr1b,r16 //предделителя частоты

_w0: rjmp _w0 //ожидание переполнения Т/С1

Составьте структурную схему этой программы, отобразив только логические связи модулей, начинающихся с каждой из меток. Оформите схему алгоритма по аналогии с алгоритмами из вашего отчета по лабораторной работе № 15 /2/ (бегущая единица по разрядам порта B).

Изучите рабочее задание и подготовьтесь к его выполнению.