Курс AVR123.nm.ru |
|
||
Консультации по электронике и электронным компонентам по ICQ 397877008 |
Задача - упражнение 5
Цель задачи: 1) Создать программу для микроконтроллера ATmega16 принимающую и передающую данные по интерфейсу rs232 с помощью USART встроенного в AVR ATmega на COM-порт ПК.
Схемы и компоненты для сопряжения МК с COM-портом ПК,
так же программы для управления и лога данных смотрите в
задаче 4 2) Закрепить навыки создания программы в CVAVR с помошью мастера начального кода и продолжить учится использовать язык Си для микроконтроллеров
LCD бывают от 1 до 4
строк длиной до 40-ка символов.
Как
и чем прошить МК AVR
Подробно и с картинками
симуляция
программы
Для выполнения задачи
необходимы : - Знать ХОРОШО теоретический материал курса - до стр. 6 - Выполнить предыдущие задчачи-упражнения
Это нужно не мне - это нужно ВАМ !
Делаем : Для
того чтобы МК мог обмениваться данными с
компьютером (ПК) или другим терминальным устройством - т.е. принимать и
отправлять данные (обычно это байты,
т.е. 8-ми битные числа) 1)
соединить его физически с ПК по схемам и способами 2) настроить == сконфигурировать USART МК -
установить скорость передачи данных в
бодах такую же как на ПК
- включить прием и/или
передачу данных - это можно делать
Стандартные
скорости обмена вашего ПК можно посмотреть
через
Пример настройки и включения USART ATmega16
Обязательно!
Найдите в ДШ все использованные
регистры Вы должны знать значение каждого бита! Не ленитесь !
// Communication Parameters: 8 Data, 1 Stop, No Parity
Я очень советую вам использовать Мастер начального кода компилятора - Он сам сгенерирует вам все в нужном виде и правильно настроит USART.
Главное
- мастер покажет вам допустима ли ошибка
в скорости
От слов к делу ... Запустите компилятор CodeVisionAVR, затем генератор начального, конфигурирующего кода программы для МК - "CodeWizardAVR" - кликнув серую шестеренку слева от красного жучка...
Переходите на закладку USART
Число
100 означает - создать буфер в оперативной
памяти МК на 100 символов.
Советую вам
сделать буфер в 2 раза больше того что вы
считаете
Скорость обмена данными - "БадРэйт" - установили 115200. Скорость
USART может быть только одна в каждый Если вам нужно принимать на скорости отличной от передачи то вы не сможете это делать одновременно и должны будете по необходимости включать либо передатчик либо приемник и устанавливать нужную скорость. Но
я бы
посоветовал вам просто взять МК с двумя
USART
Больше ни чего менять в панели USART не нужно.
Переходим к закладке LCD - мы подключим жидкокристаллический индикатор на 2 строки по 16 символов с встроенным контроллером HD44780 - это очень распространенные индикаторы (см. стр. 1 курса).
Для подключения LCD вам достаточно указать желаемый порт МК и количество символов в строке. Количество строк указывать не нужно. С
лева указаны выводы МК, а в правой
колонке указаны выводы LCD - их нужно
соединить между собой. Кроме того нужно
соединить "земли" и подать питание
на индикатор и подать напряжение
контраста - делать это надо в
соответствии с ДШ
В
закладке PORTA
сделайте PA3 выходом - мы можем
использовать
Всегда предусматривайте простые средства диагностики вашего устройства не требующие дополнительного оборудования ! К выводу МК можно подключить светодиод и разным режимом его горения отображать разную информацию, а можно выводить какую либо информацию на эту ножку в формате rs232.
Теперь В
меню файл "КодВизада" выберите "генерэйт
сэйв энд экзит", и создайте в папке компилятора
специальную папку для файлов задачи : Затем
сохраните в ней созданный начальный
код программы usart.c
Посмотрите
текст программы созданный Вам уже многое должно быть понятно !
Программа.
Рассмотрим
участок программы создающий буфер
Затем с помощью первого блока определений #define компилятору сообщены номера битов по ДШ используемых в программе при работе с USART
Определения
отдельных битов есть в компиляторах ICC,
IAR #include <mega16.h>
//обычный хидер
Теперь
вы сможете использовать примеры
Второй блок определений #define делает программу более понятной и читаемой человеком давая осмысленные названия малопонятным битовым маскам например: понятная человеку фраза DATA_REGISTER_EMPTY в тексте программы на Си будет заменена препроцессором перед компиляцией на битовую маску (1<<UDRE) с помощью которой можно проверить событие "регистр данных пуст" определяя состояние бита UDRE.
"Истина" будет означать что UDRE равен "1" и значит регистр данных пуст.
Дальше ...
Вывод: #define
- это удобно! и снижает вероятность ошибок.
Следующей строкой объявлен символьный массив : char rx_buffer[размер массива в символах]; размером по заказанному нами буферу. Символьный в
нашем случае - потому что char
указывает на типа данных -
В массиве нумерация элементов
начинается с НУЛЯ ! rx_buffer[0] а последний : rx_buffer[99]
СТОП ! Вспомните
и скажите вслух - что такое
глобальная переменная, каковы ее свойства, какие еще
Последняя
строка обсуждаемого куска кода (выше, на голубом фоне) bit rx_buffer_overflow; это
флаг (можно сказать - признак) переполнения буфера - если
Битовые
переменные могут быть только
глобальными !
Дальше функция-обработчик прерывания № 12 :
Т.е.
программа МК перестает делать то что
делала, сохраняет некоторые
Локальные
- значит они объявлены сразу после { далее
остальное
Локальные
переменные
доступны только в той функции в
которой объявлены ! Значит
в разных функциях могут быть локальные переменные с одинаковыми именами
! Но я
не советую вам так делать
- запутаетесь.
Вот программа и присваивает им значения в следующих двух строках: status
= UCSRA; В
status
копируется число из UCSRA
- это регистр В
data
копируется число из UDR
- это регистр для принимаемых данных.
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
};
Если
же при приеме байта возникла любая из
ошибок :
Пусть
ошибок не было, Выполняется
код в скобках {
} после if() Вот
он со скобками :
А
потому что
переменная rx_wr_index
if (++rx_wr_index == RX_BUFFER_SIZE) я бы не советовал писать на Си начинающему так как накрапал мастер - но КодВизад создан профессионалом и потому нам нужно просто разобрать и понять что этот код делает. Во
первых я добавил фигурные скобки {
}; - чтобы четко
было видно
if() while() for() Фигурными скобками
{ };
rx_wr_index = 0; // обнуляет индекс. Как
видите индекс может стать нулем, как был
в начале программы, и в том
Далее еще одна проверка условия и действие по результату: if (++rx_counter == RX_BUFFER_SIZE)
Если равно - значит буфер переполнился и будут выполнены две строки кода rx_counter=0;
Всё - обработка прерывания завершена.
Теперь
программа отправится в то место где она
находилась ГЛАВНОЕ ! Так как мы выполнили функцию обработчик прерывания до конца, опять установится бит I в регистре SREG - это разрешит прерывания в МК глобально и те прерывания которые разрешены индивидуально опять смогут прерывать ход программы.
Далее в тексте программы идет созданная мастером начального кода альтернативная обычно используемой в CodeVisionAVR функция "получить символ" - функция "получить символ из созданного буфера" - getchar() НО ! Будет ли она включена препроцессором компилятора в компилируемый текст программы определяет конструкция из директив препроцессора: #ifndef #define ... #endif Вы уже должны понимать как работает эта конструкция ! Поясню: Если мы делаем программу не для отладки на встроенном в CodeVisionAVR симуляторе терминала, а для реального МК или для внешнего симулятора - то в тексте программы не было определено: #define _DEBUG_TERMINAL_IO_ поэтому будет выполнена строка : #define _ALTERNATE_GETCHAR_ и остальные строки на голубом фоне ниже будут включены в компилируемую программу препроцессором.
Подробно
рассмотрим "тело"
новой функции говорит нам,
что функция возвращает значение
типа char Сразу после скобки { объявлена локальная (существующая и доступная только в этой функции) переменная символьного типа char с названием: data Следующая строка: while (rx_counter == 0); это цикл
ожидания поступления символа в буфер. В
ней программа будет
"сидеть", а точнее "молотить"
- пока нет прерывания и нет символа в
буфере,
ведь rx_counter
это счетчик символов находящихся в
буфере и пока буфер пуст эта переменная содержит
0 - вот цикл и повторяется ...
Если
в буфере были символы или появился
символ, программа перейдет data = rx_buffer[rx_rd_index]; Тут все просто: = означает присвоить переменной слева от = результат выражения справа от = Значит программа возьмет символ из буфера (из массива rx_buffer[]) с порядковым номером rx_rd_index и поместит его в data
if (++rx_rd_index == RX_BUFFER_SIZE)
Так как мы считали символ из буфера нужно уменьшить число символов в нем подлежащих считыванию.
#asm("cli") // запретить
прерывания глобально Обратите внимание что перед декрементом мы запрещаем прерывания, а после прерывания включаем опять. Зачем ? Вот фо ??? воскликнул бы англоязычный читатель ... А затем, что в обработчике прерывания есть инкремент rx_counter - и если на декременте возникнет прерывание мы можем зациклится в этом месте программы и получить ошибку в числе символов в буфере. последняя строчка функции
return data; т.е. если мы напишем такой вызов функции: nechto = getchar(); то после возврата из функции в переменной nechto окажется то, что было помещено в data в функции.
Я
подробно рассмотрел код создающий
Варианты кода для отправки и получения Прочитайте
самостоятельно
раздел "Standard C Input/Output Functions" // Standard Input/Output functions В нашей программе этот хидер уже подключен мастером !
1) отправить один символ типа char можно так: putchar('G'); Любая
из этих трех строк кода выводит на
ножку TXD число 71. На терминале ПК вы
увидите соответствующий этому числу
символ G Запомните форму записи чисел ! Таблица символов и их кодов есть на странице Си для МК Кроме того один символ или число от 0 до 255 можно отправить с МК так: while(!(UCSRA & (1<<UDRE)));
Это
же можно написать в одну строчку:
Не рекомендую !
putsf("Hello, world!"); На ножку TXD будут выведены все символы между кавычками (в примере их 13 посчитайте сами и убедитесь!) и еще символ "перейти в начало следующей строки" - его код 0x0A а называется он LF от англ. "лайн фид" - "новая строка". И следующие данные будут выводится на терминале ПК (или на его симуляторе TTY в VMLAB или в CVAVR) с начала следующей строки.
putsf("\x41\x54\x44\x3e\x53\x4d\x31\x3b\x0D\x41"); На
ножку TXD будут выведены все символы
между кавычками (в примере их 10) ATD>SM1;<CR>A<LF> цветом я отметил что это ОДИН символ ! в терминале VMLAB она будет выведена в две строки так: ATD>SM1;<CR> В терминале ПК не отображающем не печатные символы будет такой результат: ATD>SM1; Символы
(данные) которые МК будет передавать
позже будут
Вначале
нужно описать эти сообщения - они буду
размещаться во FLASH
// Declare your global variables here Теперь вы можете выводить сообщения в нужном вам месте программы так: printf(string_1); На
ножку TXD будут выведены все символы
между кавычками
4) Вывести данные и поясняющий, оформляющий эти данные текст удобно с помощью printf() это мощная функция и полное ее описание почитайте в Help компилятора. Примеры использования printf() в папке C:\CVAVR\Examples\ Например вывод температуры : char
sign='+'; //датчик дал
положительное число
temp = 57.8 C и курсор перейдет в начало новой строки. Происходит
это так: - текст temp = выводится без изменений. Знак = окружают пробелы ! - вместо %c будет вставлен символ из переменной sign - вместо %i будет вставлен результат temp/10 без дробной части - точка так и будет точкой -
вместо %u будет
результат (temp%10)
это дробная часть от деления - затем символ C - он им же и останется -
потом стоит комбинация \r\n -
она
выводит символы CR и LF их коды 0x0D
Чтобы отлаживать в PROTEUS функции printf() и scanf() зайдите в меню CVAVR - "прожект" - "конфига" - "С компилер" и в списках этих функций выберите "Long..." или "Float..." и затем "ОК" конечно ...
Примеры вывода различных чисел и строк и преобразование чисел в строки для вывода на USART и на LCD, в том числе и чисел с плавающей точкой - float, есть в проектах CVAVR и VMLAB к этой задаче курса: z5.rar
Прием
данных поступающих
getchar() // get - взять char - символ
gdvix
= getchar();
if
(getchar() ==
'G'){
while
(getchar()
!=
'F');
if
(rx_counter)
{ if
(rx_counter > (RX_BUFFER_SIZE/2))
{
Что
бы вывести самый старый символ из Если написать так : while(1){
то МК будет отправлять приходящее на ножку RXD на ножку TXD
- так Вы сможете попробовать это в симуляции !
Как
выводить данные на Советую посмотреть АпНоут ANM069 от ATMEL
- указать компилятору к каким ножкам МК он подключен в устройстве. Вот наша (типовая) схема включения:
-
указать компилятору сколько символов в строке имеет
LCD дисплей.
// Alphanumeric LCD Module functions
lcd_init(16); инициализирует именно ЖКИ (LCD) где 16 символов на строку Мы можем указать в какую позицию выводить символ вот так: lcd_gotoxy(4,1); и вывод символов начнется с 5-й позиции во второй строке. Счет строк и символов начинается с НУЛЯ !
Давайте добавим в нашу программу вывод приветствия на LCD
В результате на LCD будет выведен такой текст :
это
скриншот симуляции в VMLAB Внимание ! Я специально разделил вывод ru чтобы показать, что следующий символ u выводится в позицию следующую за последним выведенным символом.
lcd_clear(); lcd_putchar('F'); lcd_putsf(string_1); Объявление и текст этой строки были даны выше !
Архив с проектами CVAVR и VMLAB к задаче 5
Изучите их
внимательно !
Комментарии очень подробны.
При
остановках симуляции
в VMLAB просто нажимайте на
светофор
...
Посмотрите симулируя прогу в VMLAB осциллограммы приема и отправки данных по USART. Проанализируйте то что вы будет получать, при симуляции и убедитесь, что это соответствует тексту программы.
Как выводить на LCD русские буквы смотрите в FAQ по AVR Вот результат:
Так
же вы можете работать с другими
ЗАДАЧА ОКОНЧЕНА !
Если
вам что-то не понятно, пожалуйста
перечитайте
Как устроен микроконтроллер AVR
|
|
|
Проекты на микроконтроллерах AVR и PIC
Электронные устройства на микроконтроллерах, схемы, прошивки, и обычно исходники программ.
Лекции по курсу "Цифровые устройства"
1. Введение.
2. Логические элементы.
3. Арифметические основы цифровой техники.
4. Комбинационные устройства.
5. Генераторы.
6. Последовательностные устройства.
6.1 триггеры.
6.2 регистры.
6.3 Счетчики.
7. Индикаторы.
9. Синтезаторы частоты.
10. Микросхемы цифровой обработки сигналов.
10.1 Основные блоки цифровой обработки сигналов.
11. Примеры реализации цифровых устройств.
11.1 Электронные часы.
МикроКонтроллеры
AVR Начинающим
"с
нуля" |
Цифровая и вычислительная техника
Микропроцессоры и цифровая обработка сигналов
Курс лекций "Микропроцессоры"
1. Введение.
2. Принципы работы микропроцессоров.
3. Микроконтроллеры семейства MCS-51.
4. Написание программ для микроконтроллеров
5. Язык программирования высокого уровня C-51.
8. Проектирование цифровых устройств на микроконтроллерах
МикроКонтроллеры
AVR Начинающим
"с
нуля" |
Что такое микроконтроллеры, микропроцессоры и сигнальные процессоры.
Вся схемотехника разделяется на две большие области: аналоговую и цифровую Преимущества и недостатки этих технологий известны. Аналоговая схемотехника характеризуется максимальным быстродействием, малым потреблением энергии и малой стабильностью параметров. Цифровая схемотехника обладает прекрасной повторяемостью параметров. Это привело к её развитию в последние годы. В курсах электронных приборов рассматривались основные технологии производства цифровых микросхем: ТТЛ, ЭСЛ и КМОП, поэтому здесь особенности этих технологий рассматриваться не будут.
По мере развития цифровых микросхем их быстродействие достигло впечатляющих результатов. Наиболее быстрые из цифровых микросхем обладают скоростью переключения порядка 3..5 нс. (серия микросхем 74ALS), а внутри кристалла микросхемы, где нет больших ёмкостей нагрузки время переключения измеряется пикосекундами. Таким быстродействием обладают программируемые логические схемы и заказные БИС. В этих микросхемах алгоритм решаемой задачи заключён в их принципиальной схеме.
Часто для решаемой задачи не требуется такого быстродействия, каким обладают современные цифровые микросхемы. Однако за быстродействие приходится платить:
Первую задачу решает применение технологии КМОП цифровых микросхем (например микросхемы серий 1564, 74HC, 74AHC). Потребляемый ими ток зависит от скорости переключения логических вентилей. Именно поэтому в настоящее время подавляющее большинство микросхем выпускается именно по этой технологии.
Вторую задачу решают несколькими способами. Для жёсткой логики это разработка специализированных БИС. Использование специализированных БИС позволяет уменьшить габариты устройства, но стоимость его снижается только при крупносерийном производстве. Для среднего и малого объёмов производства такое решение неприемлемо.
Ещё одним решением уменьшения габаритов и стоимости устройства является применение программируемых логических схем (ПЛИС). Это направление активно развивается в настоящее время, но оно не входит в рамки рассмотрения данного курса.
Третий способ решения поставленной задачи заключается в том, что можно заставить одно очень быстродействующее устройство последовательно решать различные задачи, изменяя свою структуру во времени. Это микропроцессоры. В микропроцессорах возможен обмен предельного быстродействия на сложность реализуемого устройства. Именно по этой причине стараются максимально увеличить быстродействие микропроцессоров - это позволяет реализовывать все более сложные устройства в одном и том же объеме. Более того! В одном процессоре можно реализовать несколько устройств одновременно! Именно это решение задачи и рассматривается в данном учебном курсе.
В современном мире трудно найти область техники, где не применялись бы микропроцессоры. Они применяются при вычислениях, они выполняют функции управления, они используются при обработке звука и изображения. В зависимости от области применения микропроцессора меняются требования к нему. Это накладывает отпечаток на внутреннюю структуру микропроцессора. В настоящее время определилось три направления развития микропроцессоров:
Универсальные микропроцессоры используются для построения вычислительных машин. В них используются самые передовые решения по повышению быстродействия, не обращая особого внимания на габариты, стоимость и потребляемую энергию. В технике связи компьютеры используются для управления системами связи или устройствами связи, обладающими большими габаритами и стоимостью. Такие компьютеры называются контроллерами.
Для управления малогабаритными и дешёвыми устройствами связи используются однокристальные микроЭВМ, которые в настоящее время называются микроконтроллерами. В микроконтроллерах наоборот, максимальное внимание уделяется именно габаритам, стоимости и потребляемой энергии.
Еще один класс микропроцессоров решает задачи, которые традиционно решала аналоговая схемотехника. Это сигнальные процессоры. К сигнальным процессорам предъявляются специфические требования. От них требуются максимальное быстродействие, малые габариты, легкая стыковка с аналого-цифровыми и цифро-аналоговыми преобразователями, большая разрядность обрабатываемых данных и небольшой набор математических операций, обязательно включающий операцию умножения-накопления и аппаратную организацию циклов.