Курс AVR123.nm.ru


Electronic Banner Exchange (ElBE)
 


Краткий курс - Самоучитель - AVR - быстрый старт с нуля

 

 

Задача упражнение  6

 

Цель задачи :  

1) Продолжаем учиться генерировать (создавать) начальный код программы на Си, или текст программы инициализации периферии МК с помощью специального инструмента - программы мастера  "Application Builder" - которая входит в состав отличного компилятора ICC  -  ImageCraft   

2) Сконфигурировать таймер_0  в  ATmega16 и создать программу прерывающуюся 50 раз в секунду от переполнения таймера и отправляющую при этом пару символов с помощью USART например через адаптер  rs232 на COM порт ПК.  

3) проверить работу созданойй в задаче программы на бесплатном симуляторе -
эмуляторе МК  AVR    Visual Micro Lab  -  VMLAB


Для выполнения задачи необходимо:

- Установленный компилятор ImageCraft 

 

     
 

По странной прихоти разработчиков компилятора 
начиная примерно с версии 7.04 компилятора ICC для использования функции 
putchar()   её нужно писать в тексте программы:

int putchar(char ch) {

/* дождаться освобождения буфера передачи USART */
while ( !(UCSRA & (1<<UDRE)) );

// поместить символ в буфер USART для передачи
UDR = ch;

return ch;
}

Вариант программы для этой версии компилятора 
есть в архиве файлов к этой задаче!

 
     



- Установленный программный эмулятор VMLAB

- Data Sheet - ДШ на МК AVR ATmega16 

- прочитать курс не оставив непонятностей.

- свободное время и желание.

 

 

Напомню: Самая подробная и полная информация 
по МК содержится КОНЕЧНО в ДШ (в паспорте) на МК !

Вот даташит AVR на русском языке  в низу той странички.

 

 

Книги и учебники по электронике
скачайте бесплатно  в  библиотеках !

 

 

поиск   GOOGLE   по 
Краткому Курсу AVR

Подставте СЛОВА
и получите ОТВЕТ !

 

 

Язык Си для МК - самое нужное  там

Страницы курса :   заглавная    1   2   3   4   5   6   7   8   9

Задачи-упражнения курса по AVR  -   там
 
Скачать весь курс по AVR одним архивом


     
 

Вы можете использовать более мощный, удобный и универсальный

Симулятор  электронных  устройств содержащих несколько разных МК
 
PROTEUS

 

Читайте - Как использовать PROTEUS

 
     

 

 

 

 

Работаем: 

 

Результаты будут выводится в окно "терминал" контрольной панели 
(Control Panel) эмулятора VMLAB - старший байт (HB), затем младший (LB). 

Окно "терминал" симулирует прием данных через COM порта ПК.

Результат каждого измерения будет выводиться в новой строке.

Сохраните файлы задачи 01 из папки work - затем очистите ее.

 

1) Запускаем компилятор ICC



2) нажмите иконку запуска мастера "Application Builder" 

Это очень удобный инструмент! 

Он позволяет создать Си код для конфигурирования МК под вашу задачу даже не зная досконально ДШ и МК.

 

Прочитайте Help ICC 
раздел по "Application Builder"

 


3) в секции CPU установите: 

- используемый МК -> М16 (значит ATmega16)

- частоту кварца 3,6864 МГц 

Такие "не круглые" частоты используют для точного задания стандартных скоростей COM портов ПК. В разделе USART ДШ есть таблица где их можно найти.

- комментарий можете добавить по своему усмотрению.

 

     
 

Обратите внимание! Здесь же вы можете 

- включить прерывания по завершению записи в EEPROM и по внешнему сигналу - по фронту, по спаду или по уровню. 

- включить сторожевой таймер - WatchDog Timer  - это устройство перезапускает программу МК при его "зависании".

 
     

 

4) в секции Potrs (порты МК) настроим направление работы (вход или выход) отдельных ножек МК. 

По умолчанию  - т.е. после включения питания МК или после сброса по  уровню "0" на "Reset" - все ножки МК являются входами с высоким сопротивлением (порядка 10 мегаОм и более). 

Поэтому в мастере, в поле "Direction" (направление) изначально находятся буквы "I" от слова "Input" = Вход.  Это соответствует нулям в соответствующих битах регистра DDRx для порта X. Запись в соответствующий бит числа "1" (установка бита) делают ножку МК Выходом. И на этой ножке будет уровень определяемый значением бита в регистре PORTx - эти значения отражаются в поле Value.  


     
 

Важно !

В поле бит_0 стоит стрелочка вверх - так обозначается подтяжка входа (pull-up) виртуальным резистором около 40 кОм к + питания МК. 

Это происходит если ножка назначена входом в регистре DDR
и  соответствующий бит в регистре PORTx установлен 
(значит равен "1").

См. Устройство МК AVR

 
     

 

Значения в клеточках меняйте кликая мышкой.

На рисунке выше сделана такая настройка ножек МК: 

PA0 - вход с подтяжкой (pull-up) 

PA1 - вЫход и "0" на ножке. 

PA2 - вЫход и "1" на ножке. 

 

     
 

Важно !

Ножки станут выходами и на них может появиться подтяжка или логические единицы лишь после выполнения соответствующих строк программы ! 

т.е. не мгновенно после включения МК. 

По ходу программы вы можете менять все эти настройки так как вам нужно.

 
     

 

Вы можете присвоить свои названия ножкам МК - кликните правой кнопкой мыши на бит_2 и на меню кликните левой кнопкой:

В открывшимся окне введите название - желательно связанное 
с функциональным назначением ножки. 

 

Реклама недорогих радиодеталей почтой:

 

Я планирую использовать PA2 для выдачи диагностического 
сигнала поэтому назову:

И клик "Ок"

 

 

5) в секции Timer0 настроим таймер: 



- поставим галочку "Использовать таймер" 

- частоту переполнения - 50 Гц (50 раз в секунду) 

- выбираем коэф. пред-делителя частоты кварца на 1024

Теперь таймер_0 будет "тикать" - т.е. добавлять  к числу в регистре 
TCNT0
единицу каждые 1024 периода колебаний кварца.

- поставим галочку "по переполнению прерывание"

 

     
 

Внимание !    Мастер вычислил значение в регистре TCNT0 
с которого должен считать
Таймер_0 для переполнения 50 раз в секунду - это 0xB8 ( или 184 в "нормальном" == десятичном виде.)

Давайте посчитаем, проверим вручную:

3686400 Гц / 1024 / (256-184) = 50 Гц       ровненько !  

(256-184)   означает что таймер будет считать от 184 до 255 и после следующего добавления 1 к  255 в регистре возникнет  0 и произойдет переполнение таймера (Таймер_0  8-ми битный) и возникнет соответствующее прерывание, если конечно оно разрешено и разрешены прерывания глобально - т.е. бит I в регистре SREG установлен. 

 

 
     

 

6) в секции UART настроим USART МК на передачу данных в обычном формате COM порта ПК   8N1  и  выберем довольно высокую скорость -  115200 бод в сек. 

вот так:  

 

 

7) под кнопочкой Options выбираем и кликаем: 

добавить функцию main() в текст программы.

 

 

8) Нажимаем кнопку "ОК" - сгенерированный текст программы на языке Си появился в рабочем окне компилятора.

 

Мы получили программу на языке Си , конфигурирующую МК под нашу задачу, даже не глядя в ДШ - великолепно! 

Эта программа вызывает обработчик прерывания по переполнению Таймер_0 каждые 20 мС. 

 

9) Создайте рабочую папку для проекта: z3icc_vmlab 

и сохраните в ней полученный текст программы в виде файла icc.c 


Смотрите - текст программы стал
разноцветным
Компилятор понял по расширению .c
  что это именно программа на Си. 

 

10) Теперь нужно создать проект: 


Сохраните его например под именем
icc702.prj

 

 

11) Включим в созданный проект файл .c исходным текстом программы: 

затем: 

добавить файл: 

 

 

 

12) Настроим проект:

 

правда из настроек всего то выбрать нужный тип МК:

Так как больше изменений не требуется - жмем "ОК"

 

 

 

 

- записывайте возникающие вопросы ! 
    и лучше на бумагу - моторная память !

- найдите в DataSheet (ДШ) регистры и устройства МК о которых шла речь, прочитайте о  них подробней.

- если вопросы остались перечитайте снова !

- если вопросы не разрешены, ищите ответ:

1) в help и документации компилятора, симулятора, других используемых программ!

2) поиском Windows в папках и help компилятора и симулятора.

3) поиском Windows в папке где сохранен у вас курс. 

4) в моем не структурированном AVRFAQ - это сборник ответов на часто задаваемые мне по курсу вопросы и советы по применению МК от знающих людей.

Если все же не найдете ответа - задавайте вопрос в конференцию 

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

 

 



 

 

 

            

УРА ! 

у нас все готово для компиляции 
нашей программы! 

 

13) Кликаем по пиктограмме "построить проект":

 

Компилятор подумает чуток и выдаст 
сообщение о результате компиляции:

C:\ICCV7AVR\BIN\imakew -f icc702.mak
iccavr -c -e -D__ICC_VERSION="7.02" -DATMEGA -DATMega16 -l -g -Mavr_enhanced C:\VMLAB\z3icc_vmlab\icc.c
iccavr -o icc702 -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @icc702.lk -lcatmega
Device 1% full.
Done.


 

 

Настроим компилятор ICC на 
отображение русских букв.
  

Так будет удобней писать комментарии к программе.

Откройте диалог настройки "красивости" интерфейса компилятора:

 

Вот он:

 

Выбираем русский язык:

и "ОК"

 

 

Давайте посмотрим повнимательней 
текст программы созданной мастером.

#include <iom16v.h> 
/
* строка добавляет файл с именами регистров и 
битов МК ATmega16 по ДШ и их реальными адресами в МК 
*/

#include <macros.h>
/*
строка добавляет файл с очень полезными определениями битовых операций (см. задачу 1) и функциями для анализа использования стека если программа совершает вложенные прерывания - посмотрите внимательно текст этого файла в папке  iccv7avr\include   */


Ага... а после строчек "#include" идут сразу функции, а не их прототипы. Значит компилятор их не требует - учтем на будущее.


Я считаю что лучше перечислять прототипы функций
Программа становится более читаемой.



Вот это интересно: 


TCCR0 = 0x00; //stop timer
TCNT0 = 0xB8;
//
записать в регистр таймера число 184
TCCR0 = 0x05;
//start timer  - clock/1024


О !  теперь мы знаем на будущее как остановить и как запустить 
таймер_0, как установить с какого числа начинать ему счет...

 

     
 

Значит ! 

Чтоб остановить Timer_0 нужно обнулить биты 2, 1 и 0 
регистра TCCR0.

а чтоб запустить Timer_0 нужно в биты 2, 1 и 0 регистра 
TCCR0
вписать необходимый коэф. деления - его значения 
берем из таблицы в ДШ на МК.


подробней по регистру TCNT0 см. ДШ.

 
     

 

 

 

 


Дополним программу.

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

Давайте дополним эту функцию изменением уровня на ножке PA2 МК - это позволит узнать о вызове функции обработки прерывания и измерить реальный период прерывания в VMLAB. 

И добавим вывод некоторых символов на ПК.

добавляемый текст красным :

 
     
  #pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0xB8; //reload counter value
//
загрузить число с которого вести новый отсчет

PORTA ^= BIT(TEST_OUT); 
/* изменить уровень на ножке PA2 */

putchar('R');
putchar('x');
/* вывести через USART на ПК символы 
"R" и затем "x" */

}

 
     


Как меняет уровень на ножке строчка 

PORTA ^= BIT(TEST_OUT);

Вы должны знать из Си для МК и задачи 01 курса. 

Если не понятно - ПЕРЕЧИТАЙТЕ !

 

 

 

Внимание ! Не всегда удается получить нужный интервал переполнения таймера точно.

Боле "тонко" можно подогнать время между прерываниями добавив в самом начале функции обработчика прерывания по переполнению таймера_0 нужное количество ассемблерных инструкций NOP.

NOP делает паузу в 1 период тактирующего микроконтроллер сигнала .  

В рассматриваемой программе это могло бы выглядеть так:

     
  #pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{

asm("nop");
asm("nop");
asm("nop");
asm("nop");


TCNT0 = 0xB8; //reload counter value
//
загрузить число с которого вести новый отсчет

 
     


После такой добавки время между переполнениями таймера увеличится на 4 периода тактирующего сигнала.

Таким способом можно очень точно подгонять различные временные интервалы, а проверять результат подгонки можно в симуляторе VMLAB или PROTEUS или в реальном устройстве.

 

     
 

Timer_0   имеет и другие режимы счета.

Например в режиме CTC (сброс при совпадении) Таймер_0 будет считать  от 0 до числа записанного в регистр OCR0 (стр. 71 ДШ ATmega16) и при достижение этого числа, на следующем такте будет установлен флаг OCF0 и может быть сгенерировано соответствующее прерывание.

Таймер_0 опять начнет считать  с  нуля.  Пример в задаче 13

Другие таймеры МК тоже имеют несколько режимов работы

В таком режиме работы таймера вам  не потребуется каждый раз в прерывании перезагружать нужное число в регистр OCR0, хотя при необходимости вы можете загружать разные числа меняя время cчета от нуля до совпадения.

В режиме таймера CTC тоже можно выполнить точную подгонку времени NOP-ами - так же как и в примере выше, но только после NOP-ов нужно вписать в регистр таймера НОЛЬ чтобы обновить счет.


Изучите Таймеры !

... и вы будете виртуозно распределять время между задачами выполняемыми МК.

 
     


 

 

 

Теперь нужно подправить главную функцию - main() 
     
  void main(void)
{
init_devices();
//insert your functional code here...

while(1); /* делать постоянно пока есть питание, на Reset "1" и нет какого либо сброса либо прерывания */

}

 
     

 

 

Все !   Компилируйте ... 

 

 

Device 1% full.
Done.

Результат "ОК"

 

 

 

Давайте проверим как работает программа спомощью симулятора Visual Micro Lab

 

Создайте в папке z3icc_vmlab текстовый файл проекта vm.prj
такого содержания:

     
  ; ***************************************
; Micro + software running
; ---------------------------------------


.MICRO "ATmega16"
.TOOLCHAIN "GENERIC"
.TARGET "icc702.hex" 
.COFF "icc702.cof" 
.SOURCE "icc.c" 

.CLOCK 3.6864meg

.POWER VDD = 5 VSS = 0

; =======================================
; Windows Terminal окошко в CONTROL Panal


X1 TTY(115200 8) PD0 PD1 ; RxD TxD


; ===================================
; Сигналы вывести на осцилограф SCOPE


.plot V(PD1) V(PA2) V(PA1)

 

 
     

 

 

Я очень подробно и с картинками рассмотрел симуляцию программы в VMLAB в задаче 3.

 

Я проверил программу в симуляторе - Все работает!   Вот скриншот.


Совет:
Отметьте галочку "принимать в файл" в окне терминала VMLAB в "Control Panel" и данные отправленные через USART будут сохранятся в текстовом файле 1.RX 

 

С помощью вертикальных меток - курсоров я измерил период возникновения прерываний таймера, он равен времени между изменениями напряжения на ножке PA2 

-
получилось ровно 20 мС 

Как и было задано в задаче !

 

 

Обратите особое внимание на начало графиков сигналов в окне SCOPE - они точно отображают процесс настройки ножек МК и появление сигналов на них. Объясните себе эти графики !

 

     
 

Знайте !

Данные графиков симуляции в VMLAB между вертикальными метками вы можете сохранить в цифровом виде в файл, кнопкой "Export". 

Т.е. вы можете в другой программе (например в Excel) сделать детальный анализ данных симуляции или построить графики в нужном масштабе.

 
     

 

Файлы к этой задаче 
в одном архиве: 

z6icc_vmlab.rar

 

 

Дальше самостоятельно продумайте что делает, 
зачем нужна каждая строчка программы. 

Не должно остаться вопросов 
без ответа! 

 

Последнюю компиляция я делал на  ICC 7.05

C:\ICCV7AVR\BIN\imakew -f icc702.mak
iccavr -c -e -D__ICC_VERSION="7.05" -DATMEGA -DATMega16 -l -g -Mavr_enhanced C:\ICCv7avr\_z3icc_vmlab\icc.c
iccavr -o icc702 -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:0.512 -fihx_coff -S2 @icc702.lk -lcatmega
Device 1% full.
Done.

Тоже успешно.

 

 

     
 

Совет - быстрый запуск проекта !

Скачайте мою заготовку (Шаблон, "РЫБА") для быстрого старта в совместном использовании -  компилятора WinAVR CodeVisionAVR и симулятора  VMLAB и МК ATmega8 ATmega16

Скрин симуляции программы в VMLAB посмотрите здесь: http://proavr.narod.ru/vmlab.png

Распакуйте файлы из архива например в пустую папку:


С:\VMLAB\WORK

Теперь откройте проект cv.prj в компиляторе CodeVisionAVR.  И запустите компиляцию, если она успешна, то откройте в VMLAB проект vmlab.prj  и убедитесь что симуляция работает правильно (устойчивая симуляция начинается после нескольких нажатий светофора !).  Теперь вы убедились что свзка Компилятор-симулятор у вас функционирует правильно - значит  

Вы можете править исходник под вашу задачу.

Вы можете проверить работу программы на Си для МК ATmega16 мигающей светодиодами и посылающей сообщение через USART на монитор-терминал VMLAB.

Если добавить адаптер MK- rs232 (описан в задаче 4 курса, там же и рекомендации) то сообщения можно будет увидеть на экране ПК. 

В общем качайте ! - это нужно ВАМ !

 

Такая же заготовка - но для компилятора ICC - это файлы к  задаче 6

 
     

 

 

 

 

Все  Задачи  курса

 

 

 

 



ЛЮ-Ю-Ю-ДИ-И-И... Согласуйте-ж наконец ваши CВЧ устройства !!!

вот здесь краткий курс КАК !

Согласование ВЧ устройств.

 

 

 



 

          

 

 

Сайт управляется системой uCoz