Результаты
будут выводится в окно "терминал"
контрольной панели (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 кОм к
+ питания МК.
Это
происходит если ножка назначена
входом в решистре DDRx
и соответствующий бит в регистре 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" и нет какого либо сброса либо
прерывания */
} |
|
|
|
|
Все
! Компилируйте
...
Результат
"ОК"
Давайте
проверим как работает программа с помощью симулятора 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
|
|
|
|
|
Задачи
курса