
Примеры решения лабораторных работ / Программирование 8535 на СИ
.pdf
|
|
Рис. 5. Окно выбора платформы и устройства |
|
|
|||
В |
пункте |
«Debug platform» выбираем «AVR Simulator», |
в пункте «Device» - |
||||
тип контроллера, |
который используется |
в |
стенде |
(Atmega8535). Нажать |
на кнопку |
||
«Finish». |
|
|
|
|
|
|
|
После этого появится окно отладки |
программы (рис. |
6), содержащее три |
|||||
рабочих области: |
|
|
|
|
|
|
|
- |
в левой |
части экрана откроется |
окно «I/O |
View» для |
просмотра |
регистров |
ввода/вывода;
Рис. 6. Окно отладки программы

-в правой части экрана окно «Disassembler», в котором представлена
дизассемблированная программа - |
исходная программа, представленная |
в виде |
|
команд ассемблера; |
|
|
|
- |
в нижней части экрана |
будет представлено окно сообщений |
«Message», |
комментирующих выполняемые действия.
Рассмотрим более подробно два первых окна. В окне дизассемблера (рис. 7) содержится информация о программе:
Рис. 7. Окно дизассемблера
-в каждой строке содержится одна инструкция, исполняемая контроллером;
- в первой колонке содержится шестнадцатеричное значение счетчика команд, под которым записана команда;
-во второй колонке шестнадцатеричный код команды;
-в третьей и четвертой колонках символическое имя команды и операнды;
-в последней пятой колонке краткий комментарий по выполняемой команде. В тех строчках, в которых записан код команды FFFF, команда отсутствует.
В левом верхнем углу окна размещается желтая стрелка текущей
исполняемой команды.
Окно регистров ввода/вывода
Окно регистров содержит дерево всех устройств. Напротив каждого устройства стоит знак «+». Раскрывая устройство, мы увидим все его регистры: управляющие регистры, регистры данных и т.д. Так, например, регистр ввода/вывода порта А содержит три регистра: регистр данных PORTA, регистр направления DDRA и выводы порта PINA (рис. 8). Справа от обозначения порта выведено его текущее состояние в виде шестнадцатеричного числа и битовое

изображение. Мышкой можно задавать значения битов «0» или |
«1». Этим |
эмулируется воздействие внешних сигналов. |
|
Запуск эмулятора |
|
Программа «AVR Studio» позволяет запустить программу |
в реальном |
времени и в пошаговом режиме. В меню отладки «Debug» находятся все варианты запуска программы, например:
- Run, запуск программы в реальном времени, результат будет виден только после остановки программы;
- Break, останов программы, после просмотра исполнение программы можно продолжить;
Рис. 8. Окно регистров ввода/вывода
- Reset, сброс программы установка счетчика команд на начало программы;
- Step Over, пошаговое исполнение, при этом программа останавливается после каждой команды, стрелка указывает на текущую команду;
|
- AutoStep, запуск программы на непрерывное исполнение с |
|
|
||||
возможностью просмотра текущих шагов исполнения. |
|
|
|
|
|||
В пошаговом режиме можно наблюдать |
за |
состоянием |
регистров после |
||||
исполнения каждой команды, проверяя при этом правильность операций. Запустив |
|
||||||
программу |
кнопкой |
AutoStep», |
получим |
ее |
непрерывное |
исполнение |
и |
индикацию |
регистров |
во времени. |
Желтая |
стрелка в окне дизассемблера |
показывает текущую исполняемую команду. Приостановив исполнение программы
кнопкой |
«Break», |
можно |
изменить значения регистров ввода/вывода, |
т.е. |
задать |
разные |
значения |
входных |
сигналов. И далее, снова запустив программу |
кнопкой |
|
«AutoStep», просмотреть реакцию микроконтроллера на эти воздействия (рис. 9). |
|
|

Рис. 9. Запуск эмулятора на исполнение
Запись программы в микроконтроллер
После проверки программы на симуляторе ее необходимо записать непосредственно в микроконтроллер. Для записи программы в микроконтроллер в лабораторном стенде также используется программное обеспечение AVR Studio. Программа позволяет программировать микроконтроллер, считывать программу из микроконтроллера, записывать и читать внутреннее перепрограммируемое ПЗУ
микроконтроллера, |
программировать |
биты |
защиты, |
менять |
режимы |
работы |
|||
генератора тактовых импульсов и режимы |
старта |
микроконтроллера. |
Входным |
||||||
форматом |
данных |
для |
программатора |
является hex-файл |
стандарта фирмы Intel |
||||
(Intel Standard или Intel Extended). |
|
|
|
|
|
|
|||
В |
строке меню |
программы AVR |
Studio |
необходимо |
выбрать |
пункт |
«Tools ^ |
Program AVR ^ Auto Connect». Если модуль «Микроконтроллер» подключен к
персональному |
компьютеру |
и |
установлены |
соответствующие |
драйверы, |
то |
|||
происходит вызов окна программатора (рис. 10). |
|
|
|
|
|
|
|||
В этом окне необходимо выбрать во |
вкладке |
Main |
программируемое |
||||||
устройство - Atmega8535, проверить, что оно |
соответствует |
выбранному |
нажатием |
||||||
кнопки «Read Signature». |
|
|
|
|
|
|
|
|
|
После этого можно переходить на вкладку |
«Program» (рис. 11). |
В |
этой |
||||||
вкладке можно |
стереть |
содержимое Flash |
микроконтроллера |
(кнопка |
|
«Erase |
|||
Device»), а также запрограммировать Flash и EEPROM память микроконтроллера. |
|
|

Рис. 10. Программатор AVR Studio. Вкладка «Main»
Рис. 11. Программатор AVR Studio. Вкладка «Program»
Запись .hex файла, полученного при написании и компиляции программы,
необходимо |
осуществлять |
во |
Flash |
память |
микроконтроллера. |
Для |
этого |
|||||||
необходимо |
выбрать записываемый |
файл |
с расширением |
*.hex |
и |
нажать |
|
на |
кнопку |
|||||
«Program» в окне по работе с Flash. Информация о ходе |
программирования |
|||||||||||||
отображается |
в |
нижней |
части |
окна. |
При программировании |
микроконтроллера |
||||||||
должен |
мигать |
светодиод |
«Прог», |
расположенный |
на |
лицевой панели |
модуля |
|||||||
«Микроконтроллер». |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
Запуск и тестирование программы |
|
|
|
|
|
||||||
После программирования микроконтроллера можно приступить к |
отладке |
|||||||||||||
программы непосредственно на микроконтроллере. |
|
|
|
|
|
|
|
|||||||
Вначале необходимо собрать схему: задать внешние воздействия и вывести |
||||||||||||||
результат |
на |
требуемые |
элементы индикации - соединить проводами |
клеммы |
||||||||||
тумблеров, кнопок, светодиодов и т.д. с необходимыми клеммами контроллера. |
|
|
|
|||||||||||
Далее |
необходимо |
проверить работоспособность программы. Для |
этого |
|||||||||||
подаются |
|
необходимые |
входные |
воздействия |
(включаются |
соответствующие |
||||||||
тумблеры, |
нажимаются кнопки и |
т.д.) |
и |
наблюдается реакция |
элементов |
индикации |
и исполнительных устройств. Нажатие кнопки «Сброс» перезапускает программу.
Если в работе обнаружены отклонения от данной последовательности, то необходимо ввести коррективы в свою программу и вновь повторить процедуры
компиляции |
и |
записи |
программы |
в |
микроконтроллер. |
Работа |
считается |
выполненной, если программа выполняет все заданные функции. |
|
|
Примеры
Пример 1. Рассмотрим простейшую программу для микроконтроллера AVR, которая изменяет состояние всех битов порта D при изменении состояния 2 бита
порта A. Введите ее и проверьте работоспособность.
//------------------------------------------------------------------------------------------------------------------- |
|
|
|
|
|
|
|
#include <iom8 53 5v.h> |
// |
включение файлов для контроллера ATmega8 53 5 |
|||||
#include <macros.h> |
|
|
|
|
|
|
|
void port_init(void) // определение функции инициализации портов вв/выв |
|||||||
{ |
|
|
|
|
|
|
|
PORTA = |
0xFF; |
// |
включение подтягивающих резисторов |
порта А |
|||
DDRA = |
0x00; |
// |
порт А |
работает |
на вход (DDRA=0000 |
0000) |
|
PORTD = |
0x00; |
// |
запись |
в порт D |
нулевого значения |
|
|
DDRD = |
0xFF; |
// |
порт D |
работает |
на выход (DDRD=1111 1111) |
||
} |
|
|
|
|
|
|
|
void init_devices(void)// инициализация всех периферийных устройств |
|
||||||
{ |
|
|
|
|
|
|
|
CLI(); |
|
// |
запрет действия прерываний |
|
|
||
port_init(); |
// |
вызов функции инициализации |
портов |
|
|||
MCUCR = |
0x00; |
|
|
|
|
|
|
GICR = |
0x00; |
|
|
|
|
|
|
TIMSK = |
0x00; |
// нет прерываний от таймера |
|
|
|||
SEI(); |
|
// разрешение действия прерываний |
|
|
|||
} |
|
|
|
|
|
|
|
void main(void) |
// определение главной функции |
|
|
{ |
|
|
|
init_devices(); |
// |
вызов функции инициализации |
периферийных устройств |
while (1) |
// |
создание бесконечного цикла |
работы контроллера |
{ |
|
|
|
if ( (PINA&4)!=0) |
// |
если 2 бит на входе порта A |
отличен от нуля, |
PORTD=0xF0; |
// |
то на выходе PORTD=1111 0000 |
|
else |
|
|
|
PORTD=0x0F; |
// иначе PORTD=0000 1111 |
|
|
} |
|
|
|
} |
|
|
|
//------------------------------------------------------------------------------------------------------------------- |
|
|
|
Пример 2. Рассмотрим программу «бегущий огонь», в которой простейшими |
|||
средствами реализуется |
задержка времени (ввод в |
программу цикла с пустым |
|
оператором). |
|
|
|
//------------------------------------------------------------------------------------------------------------------- |
|
|
|
#include <iom8535v.h> |
|
|
|
#include <macros.h> |
|
|
|
void port_init(void) |
|
|
|
{ |
|
|
|
PORTD = 0x01; |
|
// Включить 0 бит порта D: PORTD=0000 0001 |
|
DDRD = 0xFF; |
|
|
|
} |
|
|
|
void init_devices(void)
{
CLI (); port_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00;
SEI () ;
}
void main(void)
{
unsigned |
int |
i; |
|
//Объявить переменную i. |
|
|
|
|
|
||
init_devices(); |
|
|
|||
while(1) |
|
|
|
|
|
{ |
|
|
|
|
|
for |
(i=1;i;i++) |
{;} |
//Пустой цикл. |
||
PORTD=PORTD<<1; |
|||||
|
//Задание нового значения порта D. |
||||
|
|
|
|
||
if (PORTD==0) PORTD=1; //Если значение равно 0, присвоить единичное |
|||||
|
|
|
|
//значение |
|
} |
|
|
|
|
|
} |
|
|
|
|
|
// |
|
|
|
|
|
|
|
|
|
Задание на выполнение |
|
1. |
Наберите программу «Пример 1» и выполните все этапы составления |
||||
программы. Проверьте правильность исполнения программы на контроллере. |
|||||
2. |
Измените эту |
программу следующим образом: входной сигнал - 0 бит |
|||
порта В, выход - порт С. В исходном состоянии при PB0=0 на выходе порта С |
|||||
включены |
два |
младших |
светодиода, при включении бита PB0=1 включаются два |
||
старших разряда. |
|
|
17
3. |
Согласно указанному преподавателем варианту напишите |
программу, |
|||||||
которая |
реализует |
следующую зависимость между |
входными и |
выходными |
|||||
сигналами: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вариант |
|
Выход |
|
|
Состояние входов PD2:PD1 |
|
|||
|
|
00 |
01 |
|
10 |
|
11 |
||
|
|
|
|
|
|
||||
1 |
|
порт А |
|
00000011 |
00001100 |
|
00110000 |
|
11000000 |
2 |
|
порт В |
|
11111111 |
11110000 |
|
00001111 |
|
00000000 |
3 |
|
порт С |
|
0х05 |
0x0A |
|
0x50 |
|
0xA0 |
4 |
|
порт D |
|
00010000 |
00100000 |
|
01000000 |
|
10000000 |
5 |
|
порт А |
|
11000011 |
00111100 |
|
11000011 |
|
00111100 |
6 |
|
порт В |
|
0х55 |
0x55 |
|
0xAA |
|
0xAA |
7 |
|
порт С |
|
10000001 |
01000010 |
|
00100100 |
|
00011000 |
8 |
|
порт D |
|
00011000 |
00110000 |
|
01100000 |
|
11000000 |
9 |
|
порт А |
|
10 |
20 |
|
30 |
|
40 |
10 |
|
порт D |
|
10000000 |
11000000 |
|
11100000 |
|
11110000 |
Примечание: обратите внимание - в вариантах 4, 8 и 10 порт D используется
ина вход, и на выход.
4.Реализуйте следующие простейшие логические элементы (входы/выходы выберите самостоятельно):
а) 3И-НЕ (трехвходовый элемент И-НЕ); б) 4ИЛИ-НЕ;
в) 3И;
г) 4ИЛИ; д) «Исключающее ИЛИ»;
е) «Эквивалентность» (равнозначность); ж) четыре отдельных независимых элемента НЕ; з) два независимых элемента 2И-НЕ; и) три независимых элемента 2ИЛИ-НЕ;
к) четыре независимых элемента «Исключающее ИЛИ».
5.Реализуйте следующие последовательностные элементы (входы/выходы выберите самостоятельно):
а) RS-триггер;
б) RS-триггер с инверсными входами; в) D-триггер;
г) JK-триггер;
д) два независимых RS-триггера;
е) два независимых D-триггера с общим тактируемым входом; ж) два независимых JK-триггера.
6.Составьте программу, которая выводит двоичное число, набранное на порту A (кнопками и тумблерами S1-S8), в порт D.
7.Составьте программу, которая преобразует число, набранное в порту А, и выводит его в порт С:
а) увеличивает число в два раза; б) уменьшает его в четыре раза; в) выводит инверсное число;
г) выводит число в дополнительном коде (старший разряд вводимого числа знаковый).
8. Составьте программу, которая вводит два двоичных четырехразрядных числа, задаваемых битами PA0-PA3 и PB0-PB3, и выводит результат в порт D:
а) арифметическую сумму чисел; б) произведение чисел;
в) поразрядное логическое сложение; г) поразрядное логическое умножение;
9.Наберите программу «Пример 2» и выполните все этапы составления программы. Используя программу “AVR-studio” рассчитайте время между переключениями разрядов.
10.Используя программу «Пример 2», напишите программу:
а) с уменьшенным в 2 раза временем задержки; |
|
|||||
б) с увеличенным в 4 раза временем задержки; |
|
|
||||
11. |
Используя |
программу «Пример 2» |
и |
«AVR-studio», напишите программу, |
||
в которой время переключения между разрядами равно: |
|
|||||
а) 0,1с |
б) 0,2с |
в) 0,4с |
г) 0,5с |
д) 0,8с |
||
е) 1 с |
|
ж) 2с |
з) 4с |
и) 5с |
|
к) 10с |
12. |
Реализуйте |
программу |
«Светофор»: |
выход PD1 (красный свет) включен |
3с, выход PD2 (желтый свет) включен 1 с, выход PD3 (зеленый свет) горит 3 с.
13.Реализуйте «бегущий огонь с накоплением», а именно: вначале загорается бит PD0, затем к нему добавляется PD1 и т.д. до тех пор, пока не загорятся все светодиоды порта D, далее цикл повторяется.
14.Составьте и введите программу «Инверсный бегущий огонь», которая включает светодиоды в обратном порядке - от старшего разряда к младшему.
Работа №2. Изучение восьмиразрядных таймеров ТО и Т2 микроконтроллера Atmega 8535
Цель работы
Познакомиться |
с |
таймерами |
микроконтроллера |
ATmega8535. |
Работа |
с |
таймером Т0. Составить программы с использованием 8-ми разрядного |
таймера |
в |
||||
счетном режиме и режиме широтно-импульсной модуляции сигнала. |
|
|
||||
|
|
Пояснения к работе |
|
|
|
|
Микроконтроллер |
|
ATmega8535 содержит три таймера общего |
назначения: |
|||
два восьмиразрядных |
таймера Т0 и |
Т2, один шестнадцатиразрядный |
таймер |
Т1. |
||
Все таймеры имеют возможность работы в разных режимах: |
|
|
|
-измерение промежутков времени;
-счет внешних событий (кроме Т2);
-преобразование выходного сигнала контроллера в сигнал с широтноимпульсной модуляцией (ТТТИМ);
- |
возможность работы в качестве часов реального времени |
(асинхронный |
|||||||
режим работы таймера Т2). |
|
|
|
|
|
|
|
||
|
|
Альтернативные функции портов |
|
|
|||||
Для |
подключения |
входов/выходов |
таймеров |
к |
выводам |
микросхемы |
|||
контроллера |
(т.е. |
соединения |
таймеров |
с |
внешним |
миром) |
используются |
||
альтернативные функции портов ввода/вывода. После включения |
альтернативной |
||||||||
функции данный бит |
порта |
используется только |
для |
ввода |
или вывода информации |
втаймер, использовать этот бит для цифрового ввода/вывода невозможно.
Альтернативные функции |
портов для |
работы с |
таймерами приведены в табл. 1. |
|||
При этом для реализации режима |
счета внешних событий вход таймеров |
|||||
необходимо подключить |
к |
выводам |
микросхемы |
- к |
конкретному биту |
порта |
ввода/вывода. При работе |
таймера |
в режиме |
ШИМ |
выход таймеров |
также |
|
подключается к конкретному биту порта. |
|
|
|
|
Табл 1. Альтернативные функции портов, используемые таймерами
Таймер |
Обозначение |
|
|
Описание |
Вывод порта |
||
Т0 |
Т0 |
Внешний вход таймера Т0 |
|
PB0 |
|||
0C0 |
Внешний выход таймера Т0 |
PB3 |
|||||
|
|||||||
|
Т1 |
Внешний вход таймера Т1 |
|
PB1 |
|||
Т1 |
0C1A |
Внешний выход A таймера Т1 |
PD5 |
||||
|
0C1B |
Внешний выход B таймера Т1 |
PD4 |
||||
|
T0SC1 |
Внешний |
вывод |
1 |
для подключения резонатора |
PC6 |
|
|
|
||||||
|
таймера Т2 |
|
|
|
|
||
|
|
|
|
|
|
||
Т2 |
T0SC2 |
Внешний |
вывод |
2 для |
подключения резонатора для |
PC7 |
|
|
таймера Т2 |
|
|
|
|
||
|
|
|
|
|
|
||
|
0C2 |
Внешний выход таймера Т2 |
PD7 |
||||
|
|
|
|
|
|
|