Методические указания к выполнению лабораторной работы №2 «Организация динамической индикации» по дисциплине «Электроника и микропроцессорная техника»




Методические указания к выполнению лабораторной работы №1 «Изучение структуры ядра микроконтроллера AVR ATmega16 и работы его портов ввода-вывода» по дисциплине «Электроника и микропроцессорная техника»

Цель работы: ознакомление со структурой ядра микроконтроллера ATmega16 и получение навыков управления его портами ввода-вывода.

Краткие теоретические сведения. Ядро микроконтроллеров AVR выполнено по усовершенствованной RISC-архитектуре (enhanced RISC). Арифметико-логическое устройство (АЛУ), выполняющее все вычисления, подключено непосредственно к 32 рабочим регистрам, объединенным в регистровый файл. Благодаря этому АЛУ выполняет одну операцию (чтение содержимого регистров, выполнение операции и запись результата обратно в регистровый файл) за один машинный цикл. Практически каждая из команд (за исключением команд, у которых одним из операндов является 16-разрядный адрес) занимает одну ячейку памяти программ.

В микроконтроллерах AVR реализована Гарвардская архитектура, которая характеризуется раздельной памятью программ и данных, каждая из которых имеет собственные шины доступа к ним. Такая организация позволяет одновременно работать как с памятью программ, так и с памятью данных. Разделение шин доступа позволяет использовать для каждого типа памяти шины различной разрядности, причем способы адресации и доступа к каждому типу памяти также различны.

Еще одним решением, направленным на повышение быстродействия, является использование технологии конвейеризации. Конвейеризация заключается в том, что во время исполнения текущей команды производится выборка из памяти и дешифрация кода следующей команды. Причем длительность машинного цикла микроконтроллеров AVR составляет всего один период тактового генератора.

Структурная схема микроконтроллера ATmega16 представлена на рис 1.

Файл регистров быстрого доступа содержит 32 8-разрядных рабочих регистра общего назначения связанных непосредственно с ALU. За один тактовый цикл из файла регистров выбираются два операнда, выполняется операция и результат вновь возвращается в файл регистров.

Шесть из 32 регистров могут быть использованы как три 16-разрядных регистра указателя косвенной адресации адресного пространства данных, обеспечивающие эффективное вычисление адресов. Один из этих указателей адреса используется, также, как указатель адреса для функции непрерывного просмотра таблиц. Эти 16-разрядные дополнительные регистры обозначаются как X-регистр,
Y-регистр и Z-регистр.

 

Рисунок 1 – Структурная схема микроконтроллера ATmega16

 

В дополнение к операциям с регистрами, регистровый файл может использоваться и для обычной адресации памяти. Это объясняется тем, что файл регистров располагается по 32 младшими адресами пространства данных, и к ним можно обращаться, как к обычным ячейкам памяти.

Пространство памяти I/O содержит 64 адреса периферийных функций CPU таких как: регистры управления, таймеры/счетчики, аналого-цифровые преобразователи и другие I/O функции. К памяти I/O можно обращаться непосредственно или как к ячейкам пространства памяти соответствующим адресам файла регистров $20 – $5F.

В процессе обработки прерываний и вызовов подпрограмм адрес возврата счетчика команд (PC) сохраняется в стеке. Стек размещается в SRAM данных. Все пользовательские программы в подпрограммах возврата (прежде, чем подпрограммы или прерывания будут выполняться) должны инициализировать указатель стека (SP).

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

Гибкий модуль обработки прерываний имеет в пространстве I/O свой управляющий регистр с дополнительным битом разрешения глобального прерывания в регистре статуса. Все прерывания имеют свои векторы прерывания в таблице векторов прерывания, располагаемой в начале памяти программ. Приоритеты прерываний соответствуют положению векторов прерываний - прерывание с наименьшим адресом вектора имеет наивысший приоритет [1].

МК имеет 4 порта ввода-вывода: порт A, порт В, порт С и порт D. Для обслуживания каждого порта отведено три регистра: регистр данных – PORTx, регистр направления данных – DDRx и регистр вывода порта – PINx. Регистры PINx предназначены только для чтения, а регистры PORTx и DDRx для чтения и записи. Каждый вывод (pin) порта работает автономно от других выводов. Внутренние электронные схемы каждого вывода могут управлять подключенными к ним светодиодами.

Перед использованием портов в программе их необходимо настроить, то есть определить направление (ввод или вывод) отдельного бита порта и задать начальное значение. Для того чтобы использовать вывод для ввода данных, необходимо соответствующий бит регистра DDR сбросить и тот же бит регистра PORT установить. Например, нужно настроить шестой вывод порта D на ввод данных. На языке Си фрагмент кода для этого будет выглядеть так:

DDRD&=0b10111111;

PORTD|=0b01000000;

Если нужно настроить на ввод все выводы порта D:

DDRD = 0;

PORTD = 0хFF;

Для настройки порта на вывод данных необходимо соответствующие биты регистра DDR этого порта установить и эти же биты регистра PORT сбросить. Например, настроить все выводы порта B на вывод данных:

DDRB = 0xFF;

PORTB = 0;

После настройки порта на вывод данных, в дальнейшем сам процесс вывода данных осуществляется следующим образом.

PORTD = 0; // сбросить все выводы порта D

PORTD = 0xFF; // установить все выводы порта D (установить на них высокий уровень напряжения 5 V).

Побитовые операции и маскирование данных. Маскирование данных позволяет выполнять операции над отдельными битами регистра при наложении маски на слово данных. При этом используются операции побитового И (&), ИЛИ (|), XOR (^).

Пример 1. Прочитать данные с порта С и, сохранив значения битов 0…2, 4, 5, установить в логический «0» биты 3, 6, 7 и записать результат в регистр PORTD:

PORTD = PINC & 0b00110111; // маска 0b00110111

Пример 2. Прочитать данные с порта С и, не изменяя содержимого других разрядов, установить в разрядах 1, 3 и 5 лог. «1» и записать результат в регистр PORTD:

PORTD = PINC | 0b00101010; // маска 0b00101010

Операторы сдвига >> и << сдвигают биты в переменной вправо и влево соответственно, на указанное число. Общий вид оператора сдвига вправо:

 

переменная >> число сдвигов

 

а общий вид оператора сдвига влево:

 

переменная << число сдвигов

 

При сдвиге биты, сдвигающиеся на один конец, не появляются с другого. Сдвинутые биты теряются, а с другого конца появляются нули. Задание для лабораторной работы. Закрепление навыков работы с портами ввода-вывода удобно производить посредством схемы, представленной на рисунке 2.

Рисунок 2 – Электрическая схема соединения светодиодов и тумблеров с портами ввода-вывода МК

 

К выводам порта C PC0…PC7 подключены тумблеры SW1…SW8 соответственно. К выводам порта D - светодиоды через токоограничивающие резисторы. При включении тумблера на соответствующем выводе порта C устанавливается высокий уровень напряжения 5 V, что соответствует логической «1», в выключенном состоянии тумблера на соответствующем выводе порта С логический «0».

Задание. Написать программу работы МК в соответствии с вариантом (таблица 1).

Вариант Задание
  При включении любого четного тумблера зажигаются только все нечетные светодиоды в линейке светодиодов, включение нечетных тумблеров игнорируется.
  При включении любого нечетного тумблера зажигаются только все четные светодиоды в линейке светодиодов, включение четных тумблеров игнорируется.
  При включении тумблера 0, 1, 2 и т.д. зажигается светодиод позиции, соответственно 7, 6, 5-й и т.д., то есть в обратном порядке.
  Все светодиоды в линейке зажигаются только при одновременном включении 3, 4 и 7-го тумблеров, включение других гасит светодиоды.
  Все светодиоды в линейке зажигаются последовательно с интервалом 0,5 секунд, начиная с 0-го, при одновременном включении тумблера 0 и 7.
  Все светодиоды в линейке зажигаются последовательно с интервалом 0,5 секунд, начиная с 7-го, при одновременном включении тумблера 0 и 3.
  При включении тумблера 3 в линейке светодиодов зажигаются светодиоды 7, 5, 4 и сдвигаются вправо с интервалом времени одного сдвига 0,5 секунд.
  При включении тумблера 0 в линейке светодиодов зажигаются светодиоды 0 и 1 и сдвигаются влево с интервалом времени одного сдвига 0,5 секунд.
  При включении четных тумблеров зажигаются все нечетные и мигают с периодом 0,5 секунд, включение нечетных тумблеров гасит светодиоды.
  При включении нечетных тумблеров зажигаются все четные и мигают с периодом 1 секунду.

 

Пример выполнения. Задание. При включении тумблера 0 и 7 в линейке зажигаются все четные светодиоды и сдвигаются влево с временным интервалом одного сдвига 1 секунда.

Решение. В меню кнопки «Приложения» выбираем пункт «Эмулятор терминала», в появившемся окне терминала вводим команду

 

nano lab.c

 


Тем самым в текущем каталоге (в данном случае это рабочий каталог пользователя, перейти в который можно командой cd ~, а посмотреть содержимое — командой ls) создаем файл с расширением.c, который будет содержать исходный код программы. При этом имя файла может быть любым, например my_prog.c. В открывшемся окне текстового редактора вводим текст программы:

 


Сохраняем изменения в файле и выходим из текстового редактора, нажав комбинацию клавиш «Ctrl+x», затем «y» и далее «Enter». После этого в терминале появится новое приглашение к вводу.

Следующий этап — компиляция написанного кода программы. Для этого необходимо ввести команду:

 

avr-gcc -mmcu=atmega16 -Os lab.c -o lab.o

 

В результате работы, если нет ошибок, в текущем каталоге создается объектный файл lab.o и появляется приглашение к вводу:


Для формирования файла прошивки в формате HEX необходимо выполнить команду:

 

avr-objcopy -j.text -j.data -O ihex lab.o lab.hex

 

Загрузка содержимого HEX-файла в память FLASH микроконтроллера осуществляется программой avrdude командой (программатор ponyprog, загрузка посредством интерфейса RS-232):

 

avrdude -c ponyser -p m16 -U flash:w:lab.hex

 

В результате успешной «прошивки» на экран будут выведены следующие сообщения:

 

 

Литература.

1. https://microchipinf.com/articles/45/142

2. https://ph0en1x.net/80-simple-program-for-avr-microcontroller-c-language.html

 

 

Методические указания к выполнению лабораторной работы №2 «Организация динамической индикации» по дисциплине «Электроника и микропроцессорная техника»

Цель работы: изучение способа сопряжения МК AVR AtMega16 со светодиодным многоразрядным индикатором

К устройствам сопряжения МК относятся семисегментные индикаторы с дополнительным сегментом – точкой (рис. 1), позволяющие выводить цифры, литеры и различные специальные символы.


Рис. 1. Обозначение сегментов индикатора

 

Для одновременного вывода символов на несколько таких индикаторов используется динамическая индикация. При этом цифры отображаются последовательно на каждом разряде, но со скоростью, при которой человеческий глаз не замечает мигания. В этом случае расчет времени свечения одного разряда считается по формуле 1/(N ∙50), где N – количество разрядов индикатора, а число 50 определяет число засвечиваний в секунду. Для отображения цифры одного разряда необходимо погасить ненужные сегменты и зажечь требуемые. Например, цифра 7 изображается так: сегменты a,b,c и f включены, при выключенных d,e,g и h. В результате получается восьмиразрядный код, который ставится в соответствие с двоично-десятичным кодом отображаемой цифры.

Схема подключения светодиодных индикаторов может быть как на рис. 2.


Рис. 2. Схема подключения тумблеров и индикаторов к МК

 

В схеме используется двухразрядный индикатор с общим анодом, например, типа КИПЦ22Б, АЛС324А и др. Для выбора засвечиваемого разряда на базы транзисторов VT1…VT4 подаются управляющие сигналы с выводов портов PB0…PB3. При этом согласно схеме (рис. 2), лог. «1» включает разряд, а лог. «0» выключает. Для зажигания сегмента на соответствующий вывод портов PD0…PD7 необходимо подать лог. «0». В соответствии со схемой (рис. 2) для каждой цифры, отображаемой на индикаторе, представим код в виде таблицы перекодировки (табл. 1).

Таблица 1
Представление десятичных цифр для восьмисегментного индикатора
Вывод Цифра
                   
PD0 (a)                    
PD1 (b)                    
PD2 (c)                    
PD3 (d)                    
PD4 (e)                    
PD5 (f)                    
PD6 (g)                    
PD6 (h)                    

Пример программы на языке Си, осуществляющей считывание комбинации тумблеров S1..S8, представляющей собой двоичный код числа в интервале 0..255, и вывод на первые три восьмисегментных разряда, представлен ниже.

 

#define F_CPU 1000000

#include <avr/io.h>

#include <util/delay.h>

int a,k;

//Массив code8[] содержит коды, соответствующие цифрам от 0 до 9 восьмисегментного индикатора, порядковый номер элемента массива совпадает с цифрой

int code8[10]={0b11000000,0b11111001,0b10100100,0b10110000,0b10011001,0b10010010,0b10000010,0b11011000,0b10000000,0b10010000};

int main(void)

{/*Настраиваем порты на ввод-вывод*/

DDRC=0;

PORTC=0xFF;

DDRD=0xFF;

PORTD=0xFF;

DDRB=0xFF;

PORTB=0;

/*--------------------------------*/

while (1) {

a=PINC; //Читаем состояние регистра PINC - он отображает комбинацию тумблеров - число в двоичном коде

if (a<10) {PORTD=code8[a]; PORTB=1;} //Нуль и число из одной цифры выводим в первый разряд индикатора

else {k=1; //k содержит код зажигаемого разряда индикатора

/*Цикл "разбора" числа на цифры*/

while (a!=0) {

PORTD=code8[a-(a/10)*10]; //Получаем и заносим в порт D единицы числа

a/=10; //Отбрасываем выведенные единицы числа

PORTB=k; _delay_ms (5); //Зажигаем разряд индикатора и выдерживаем паузу

PORTB=0; //Гасим разряд

if (k==1) {k<<=2;} else k<<=1; //Меняем код зажигаемого разряда

}

}

}

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-12-18 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: