Страницы курса:

Уроки

Задания


index.htm
01.htm
02.htm
03.htm
04.htm
05.htm
06.htm
07.htm
08.htm
09.htm


z1.htm
z2.htm
z3.htm
z4.htm
z5.htm
z6.htm
z7.htm
z8.htm
z9.htm
z10.htm
z11.htm

New! - ФОРУМ!

Совет - умейте правильно находить информацию!


Задача упражнение  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;
}
Вариант программы для этой версии компилятора есть в архиве файлов к этой задаче!

 
     



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

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

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

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

 

Работаем: 

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

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

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



2) нажмите иконку запуска мастера "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").

 
     

 

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

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

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 и произойдет переполнение таймера и возникнет соответствующее прерывание, если конечно оно разрешено и разрешены прерывания глобально - т.е. бит I в регистре SREG установлен. 

0 это аналог 256 в положительном байте -  Таймер_0 ведь 8-ми битный

 
     

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

вот так:  

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

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

 

 

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

 

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

Кроме того эта программа еще и вызывает обработчик прерывания каждые 20 мС. 

9) Создайте рабочую папку для проекта: z3icc_vmlab и сохраните в ней полученный текст программы в виде файла icc.c 


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

 

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


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

 

 

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

затем: 

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

 

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

 

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

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

  УРА ! 

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

 

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 опять начнет считать  с  нуля.

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

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


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

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

 
     


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

Теперь нужно "подрихтовать" главную функцию: 
     
 

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.

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


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

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

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

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

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

 

     
 

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

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

 
     

 

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

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.

 

 

     
 

Совет !

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

компилятора CodeVisionAVR и симулятора VMLAB и МК ATmega16

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

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

С:\VMLAB\WORK

Теперь откройте проект cv.prj в компиляторе CodeVisionAVR

Вы можете править текст программы (исходник) и перекомпилировать его.

Для эмуляции работы устройства откройте в VMLAB проект vmlab.prj

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

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

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

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

 
     

Задачи  курса

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Rating All.BY Rambler's Top100 МЕТА - Украина. Рейтинг сайтов


2009-2015 123avr.com