
- •6.050702 «Електромеханвка»,
- •Создание нового проекта
- •Организация памяти
- •Сведения о портах ввода/вывода
- •Команды языка Assembler, необходимые для выполнения заданий
- •Контрольные вопросы
- •Описание stk500
- •Порядок выполнения работы
- •Индивидуальные задания
- •Контрольные вопросы
- •Организация памяти мк AtMega16
- •Введение
- •Команды работы с памятью
- •Индивидуальные задания
- •Контрольные вопросы:
- •Система прерываний AtMega16. Таймер/счетчик
- •Введение
- •Индивидуальные задания
- •Индивидуальные задания
- •Контрольные вопросы
- •Управление скоростью «бега» огонька по светодиодной панели микроконтроллера AtMega16
- •Порядок выполнения работы
- •Варианты заданий для студентов
- •Контрольные вопросы
- •Основы работы в среде разработки CodeVisionAvr. Широтно-импульсная модуляция (шим) микроконтроллера AtMega16
- •Введение
- •Среда разработки CodeVisionAvr. Пример генерации начального кода программы
- •Пример программы с комментариями
- •Индивидуальные задания
- •Usart: универсальный синхронный и асинхронный последовательный приемопередатчик микроконтроллера AtMega16
- •1. Введение
- •Генерация внутренней синхронизации – генератор скорости связи
- •Работа с удвоением скорости связи (u2x)
- •Режим синхронной связи
- •Форматы посылки
- •1.1.5 Бит паритета
- •1.1.6. Инициализация усапп
- •1.1.9. Передача данных
- •1.1.10. Передача посылок с 5…8 битами данных
- •1.2. Конфигурирование Atmega16
- •1.2.1. Конфигурирование порта d
- •1.2.2. Описание регистров усапп
- •1.3. Генерация начального кода программы в среде разработки CodeVisionAvr
- •1.4. Работа с терминалом
- •1.5. Описание и листинг программы
- •Контрольные вопросы:
1.3. Генерация начального кода программы в среде разработки CodeVisionAvr
В данной работе для генерации начального программного кода нам необходимо заполнить следующие закладки:
Закладка Chip. На закладке Chip указываем использующийся МК (в нашем случае ATmega16) и задаем частоту, на которой он работает (в нашем случае 3.68 МГц, см. рис. 2(1)).
Закладка USART. Выбираем режим работы в качестве передатчика. Задаем скорость 9600 бод, режим передачи данных (8 бит данных, 1 стоповый, без битов паритета), асинхронный режим передачи. Значение всех полей на данной закладке можно посмотреть по нажатию Help.
1 2
Рис. 2. Генерация начального программного кода в CodeVisionAVR.
1 – закладка Chip, 2 – закладка USART
Остальные закладки оставляем без изменения. При генерации начального кода программы все значения, которые не заполнены, заполнятся значениями по умолчанию.
Для того чтобы просмотреть начальный код программы, заходим в File / Program Preview. Открывшийся код копируем и вставляем в файл проекта AVR-Studio, далее работаем с ним как обычно.
1.4. Работа с терминалом
Для того чтобы увидеть, какие данные пересылаются через UART в процессе работы программы, необходимо произвести следующие действия:
Откомпилировать программу и записать данные файла с расширением *.НЕХ в микроконтроллер.
Выключить STK500.
Рис. 3. Описание STK500
Переключить кабель с порта RS-232 для программирования (рис. 3, 16 – порт RS-232 для программирования.) на порт RS-232 для связи (рис. 3, 13 – порт RS-232 для связи).
Соединить разъем RS232 интерфейса RXD, TXD (рис. 3, 3) с ножками PD0, PD1 порта D.
На ПК открыть и настроить программу HyperTerminal (Пуск\ Программы\ Стандартные\ Связь\ HyperTerminal):
ввести название подключения и нажать ОК;
в поле «Подключаться через» выбрать COM1 и нажать ОК;
«Параметры порта» установить в соответствии с заданием.
Включить STK500.
1.5. Описание и листинг программы
На панели светодиодов (панель светодиодов подключена к порту В) реализуется обратный счет с максимального значения (255). Уменьшение числа на 1 происходит при нажатии на кнопку SW0, расположенную на стенде (панель кнопок подключена к порту D). Каждое новое число выводится на панели светодиодов и пересылается через UART (в асинхронном режиме, 8 бит данных, 1 стоповый, без паритета) со скоростью 9600 бод.
#include <util/delay.h>
#include <avr/io.h>
//подключаем необходимые библиотеки
int main(void) {
char temp = 0xFF;
char i;
//Задаем скорость передачи
//UBRR = 3.68МГц / (16*9600бод) - 1 = 23
UBRRH=0x00; //0000 0000
UBRRL=0x17; //0001 0111
//задаем режим работы
UCSRA=0x00; //0000 0000 Без удвоения скорости передачи
UCSRB=0x08; //0000 1000 Разрешение работы передатчика
UCSRC=0x86; //1000 0110 Асинхронный режим, отключен режим паритета
// 1 стоповый бит, 8 бит данных в посылке
DDRB = 0xFF; //конфигурируем порт B на вывод
PORTB = 0xFF; //записываем в порт В начальное значение (255)
while (1) {
while (PIND & 0x01); //Ожидание нажатия кнопки (низкого уровня сигнала)
_delay_ms(100); // пауза 0,1 секунда
temp--;
PORTB = temp; //Уменьшение значения на светодиодах на 1
for (i = 0; i<8; i++) {
while (!( UCSRA & (1<<UDRE))); // Ожидание освобождения буфера передатчика
// Помещение данных в буфер, отправка данных в бинарном виде
UDR = 48 + (temp & (1<<(7-i))); //ascii код 48 - для 0, 49 – код для 1
}
while (!( UCSRA & (1<<UDRE))); // Ожидание освобождения буфера передатчика
UDR = 10; //Передача символа перевода строки
while (!( UCSRA & (1<<UDRE))); // Ожидание освобождения буфера передатчика
UDR = 13; //Передача символа возврата каретки
};
return 1;
}
Для работы вам понадобится подключить следующие библиотеки:
avr/io.h – содержит определения и подключает нужный заголовочный файл (для ATmega16 - avr/iom16.h);
util/delay.h – содержит функции формирования задержки. Например, функция _delay_ms(100) позволяет получить задержку в 100 мс.
Индивидуальные задания
Вариант |
Текст задания |
1 |
На панели светодиодов реализовать обратный счет с максимального значения 255. Уменьшение числа на 1 происходит по нажатии на кнопку SW0, расположенную на стенде. Каждое новое число выводится на панели светодиодов и пересылается через UART (в асинхронном режиме, 8 бит данных, 1 стоповый, без паритета) со скоростью 9600 бод. |
2 |
На панели светодиодов реализовать прямой счет с минимального значения 0. Увеличение числа на 1 происходит по нажатии на кнопку SW0, расположенную на стенде. Каждое новое число выводится на панели светодиодов и пересылается через UART (в асинхронном режиме, 8 бит данных, 2 стоповых, без паритета) со скоростью 9600 бод, с удвоением. |
3 |
Выбрать двоичное число, определить его в программе, отобразить на светодиодах. При нажатии кнопки SW0 побитно инвертировать его и вывести на панели светодиодов. Отправить его по UART (в асинхронном режиме, 7 бит данных, 2 стоповых, без паритета) со скоростью 4800 бод. |
4 |
Реализовать «бегущий огонек» на светодиодах. Перемещение «огонька» вправо при нажатии кнопки SW0. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 7 бит данных, 1 стоповый, режим паритета четный) со скоростью 9600 бод. |
5 |
Реализовать «бегущий огонек» на светодиодах. Перемещение «огонька» вправо через 1 при нажатии кнопки SW0. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 8 бит данных, 1 стоповый, режим паритета: нечетный) со скоростью 9600 бод. |
6 |
Реализовать «бегущий огонек» на светодиодах. Перемещение «огонька» влево при нажатии кнопки SW0. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 7 бит данных, 1 стоповый, без паритета) со скоростью 4800 бод, с удвоением. |
7 |
Реализовать «бегущий огонек» на светодиодах. Перемещение «огонька» влево через 1 при нажатии кнопки SW0. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 8 бит данных, 2 стоповых, без паритета) со скоростью 9600 бод. |
8 |
Реализовать мигание на светодиодах. Переключение между вкл/выкл по нажатии кнопки SW0. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 8 бит данных, 1 стоповый, режим паритета нечетный) со скоростью 2400 бод, с удвоением. |
9 |
Реализовать «змейку» на светодиодах: три подряд включенных светодиода (0, 1 и 2) по нажатии на кнопку SW0 перемещаются влево. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 8 бит данных, 1 стоповый, режим паритета: четный) со скоростью 2400 бод. |
10 |
Реализовать «змейку» на светодиодах: три подряд включенных светодиода (7, 6 и 5) по нажатии на кнопку SW0 перемещаются вправо. Пересылать через UART двоичное число, отображаемое на светодиодах при каждом нажатии кнопки (в асинхронном режиме, 7 бит данных, 1 стоповый, режим паритета: четный) со скоростью 4800 бод. |