Запустите VMLAB и откройте созданный проект: Project -> Open Project File
Перейдите в папку задачи 1 C:\CVAVR\z1\ и наберите имя файла z1_vm.prj проекта для VMLAB. После появления фразы, что такой файл не существует, VMLAB предложит создать его, с чем вы соглашайтесь. В появившемся окне запишите без комментариев приведенный ниже в таблице текстовый файл.
; Файл-проект z1_vm.prj для симуляции по задаче 1. ; Комментарии пишутся в VMLAB только в одну строчку ; после точки с запятой ; МК как бы "прошит" файлом - z1.hex. После включения МК ; горящие светодиоды показывают в двоичном виде числа от 0 ; до 255 и далее опять с нуля и так по кругу... ; светодиоды подключены к порту_А МК .MICRO "ATmega16" ; симулируемый МК .TOOLCHAIN "GENERIC" .TARGET "z1.hex" ; что "прошито" в МК .COFF "z1.cof" .SOURCE "z1__.c" .POWER VDD=5 VSS=0 ; Питание +5 вольт ; VSS это GND МК - "общий" провод схемы ; Относительно него измеряются напряжения .CLOCK 4meg ; частота кварца 4 МГц ; Точнее это частота тактирования МК ; Ввод схемы устройства по задаче 1 ; 8 светодиодов подключаются катодами через резисторы : номиналом 560 Ом к ножкам МК с 33 до 40 ; резистор R1 подключить к узлу D1_NODE и к выводу PA0 МК ; анод светодиода к цепи +5 В. Остальные 7 светодиодов ; подключаются аналогично D1 VDD D1_NODE R1 D1_NODE PA0 560 D2 VDD D2_NODE R2 D2_NODE PA1 560 D3 VDD D3_NODE R3 D3_NODE PA2 560 D4 VDD D4_NODE R4 D4_NODE PA3 560 D5 VDD D5_NODE R5 D5_NODE PA4 560 D6 VDD D6_NODE R6 D6_NODE PA5 560 D7 VDD D7_NODE R7 D7_NODE PA6 560 D8 VDD D8_NODE R8 D8_NODE PA7 560 ; Сигналы на ножках PA0 PA1 PA2 ; будем наблюдать в окне виртуального осциллографа - "Scope" .PLOT V(PA0) V(PA1) V(PA2); Рисовать графики напряжения в перечисленных узлах схемы |
В меню Project запустите Re-Build all ...
Через меню View откройте два компонента: SCOPE – это виртуальный запоминающий осциллограф симулятора и Control Panel – это панель, на которой содержатся нужные нам светодиоды и многое другое, пока нам не нужное.
Через меню Window откройте (обычно оно открывается сразу при открытии проекта) окно Code – в этом окне вы увидите текст симулируемой программы.
Обратите внимание на окно Messages – в нем появляются служебные сообщения симулятора по ходу работы. В окне Messages должно появиться сообщение об успехе и что все готово к запуску (Success! All ready to run). Кроме того, на панели инструментов загорится зеленый светофор – это кнопка, которой можно запускать симуляцию.
Нажатие зеленого светофора эквивалентно подаче "1" на вывод RESET МК при включенном питании, но еще не выполнявшем программу.
В окне Scope появились три графика для сигналов, которые мы будем наблюдать. Установите масштаб по вертикали 2 вольта на деление, а по горизонтали 50 мс.
В окне Сode появилось серое поле слева и зеленые квадратики напротив исполняемых строк кода программы на Си – кликнув по такому квадратику мы можем поставить точку останова программы.
Разместите три окна и Control Panel на экране компьютера так, чтобы видеть их все.
Нажмите "светофор" для запуска симуляции программы.
Программа запустится и остановится – в окне Messages появится сообщение. Опять нажимаем на "светофор". Симулятор опять останавливается и сообщает, что произошел сброс от "сторожевого таймера МК" - мы не указали симулятору, что не используем его. Опять нажимаем на "светофор" – теперь программа будет работать непрерывно, пока мы ее не остановим.
Пусть программа симулирует, а вы понаблюдайте за тем, что происходит в указанных выше окнах. Что отображается в окне Control Panel кроме светодиодов?
Понаблюдайте за окнами SCOPE и Codeи за светодиодами. В окне Code при симуляции возникают и растут желтые полосы, подсвечивающие строки исполняемой программы. Длины этих подсветок пропорциональны времени, в течение которого программа выполняет код этих строк.
Какой ток потребляется микроконтроллером от источника питания? Остановите симуляцию, нажав красный восьмиугольник «Стоп» и измерьте длительность периода импульсов на ножке РА2 МК. Насколько соответствует она расчетной величине? Для измерения временного промежутка в окне SCOPE симулятора VMLAB нужно установить вертикальные курсоры 1 и 2 на границах измеряемого интервала и в поле Cursor delta time появится значение времени между двумя курсорами.
При измерении коротких повторяющихся интервалов можно мерить время сразу нескольких, а результат поделить затем на число таких интервалов между измерительными курсорами.
Перезапустите МК, кликнув по кнопке с круговой темно-синей стрелкой. Вы как бы отключаете и затем снова подаете питание на МК, но создаете "0" на ножке RESET МК – вследствие чего программа не стартует!
Какую функцию выполняет команда PORTA=~(per++); ?
Приведите в отчете схему подключения светодиодов к МК.
3. Модифицируйте программу. Переключите светодиоды к порту С. Время паузы между переключениями светодиодов уменьшить в 2 раза.
Для изменения Си кода программы просто запустите компилятор CodeVisionAVR (VMLAB выключать не нужно!) и внесите нужные изменения, затем откомпилируйте проект. Далее перейдите в VMLAB, сделайте глубокий рестарт и затем Re-buid all.Все! Изменения внесены и все опять готово к симуляции. Таким образом, компилятор и симулятор работают одновременно в одной папке проекта и не мешают, а помогают друг другу. В отчет включите файлы z1.c и z1_vm.prj модифицированного проекта.
4.В следующем проекте будем выводить данные на символьный LCD дисплей (жидко-кристаллический индикатор). Схема его подключения к порту А микроконтроллера приведена на рис. 9.1 (там же указан источник информации, в котором вы можете более подробно ознакомиться с решаемой задачей).
Запустите компилятор CodeVisionAVR, затем генератор начального кода "CodeWizardAVR" - кликнув серую шестеренку слева от красного жучка... Выберите ATmega16 и частоту кварца 4 МГц. Перейдите к закладке LCD и укажите PORTA и 16 символов.
Выполнив Файл -> Generate, Save and Exit, создайте в директории C:\CVAVR папку z2 (задача 2) для файлов нового проекта. Сохраните, нажимая три раза z2, файлы z2.c, z2.prj и z2.cwp. Посмотрите сгенерированный мастером файл начального кода программы z2.c. Какими командами проводится инициализация LCD дисплея? Можно ли удалить из программы команды, реализующие инициализацию периферийных устройств, не используемых в данной задаче?
Рис. 9.1 – Типовая схема включения LCD дисплея
После команды
lcd_init(16); // LCD 16 символов на строку
добавьте две строчки:
lcd_gotoxy(5,0); // вывод символов с 6-й позиции в первой строке
lcd_putsf("Hello!"); //счет строк и символов начинается с нуля!
Сохраните (File -> Save All) и откомпилируйте программу.
Не закрывая компилятор, откройте VMLAB. В окне Open Project File впишите имя файла z2_vm и откройте файл проекта для симулятора z2_vm.prj. Впишите в него приведенный ниже в рамке текст и запустите Re-build all ... Загоревшийся светофор говорит о том, что программа готова к симуляции. Откройте окно Control Panel и, трижды нажав светофор, добейтесь непрерывной симуляции. Долгожданная надпись на экране LCD появится не сразу (процесс инициализации LCD продолжается достаточно долго). Почему через некоторое время загорается светофор?
; файл z2_vm.prj .MICRO "ATmega16" .TOOLCHAIN "GENERIC" .TARGET "z2.hex" .COFF "z2.cof" .CLOCK 4meg Xdisp LCD(16 2 250K) PA0 PA1 PA2 PA7 PA6 PA5 PA4 nc3 nc2 nc1 nc0 |
Не закрывая VMLABвернитесь в компилятор CVAVR.После команды #include <mega16.h>добавьте команду
#include <delay.h>// функции организации задержек
После команды lcd_putsf("Hello!"); добавьте команды:
delay_ms(200);
lcd_clear();// очистка экрана LCD
delay_ms(200);
lcd_gotoxy(5,1);
lcd_putsf("FINISH!");
В последнем цикле программы перед комментарием // Place your code hereдобавьте команду#asm("wdr")и перекомпилируйте проект.
Вернитесь в VMLAB. Сделайте глубокий рестарт и запустите Re-build all ... Как теперь выводится информация на табло дисплея? Почему не загорается светофор после запуска непрерывной симуляции?
5.Проведите исследование работы АЦП. В папке C:\CVAVR \z3 с помощью компилятора создайте файлы проекта задачи 3 на базе программы z3.c, текст которой приведен ниже в рамке (он подробно прокомментирован в разделе 7).
//файл z3.c #include <mega16.h> #include <delay.h> interrupt [ADC_INT] void adc_isr(void) { PORTB=(char)~(ADCW>>2); delay_ms(20); ADCSRA|=0x40; } void main(void) { PORTB=0xFF; DDRB=0xFF; ADCSRA=0x8E; asm("sei") ADMUX=0; ADCSRA|=0x40; while (1); } |
Затем с помощью симулятора запишите файл Z3_vm.prj.
; файл Z3_vm.prj .MICRO "ATmega16" .TOOLCHAIN "GENERIC" .TARGET "z3.hex" ; эмулируемая прошивка МК .COFF "z3.cof" ; файл содержит привязку ; содержимого [.hex] к коду в [__.c] .SOURCE "z3__.c" ; исходник на Си, на который сориентирован файл [.cof]. ; это CodeVision добавляет '__' при компиляции .TRACE ; выводить отладочную информацию в окне ; SCOPE - розовым (см. HELP эмулятора) .CLOCK 4meg ; частота используемого кварца ; Обозначения точек МК, к которым можно ;"подключить" эмулятор: RESET, AREF, PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7, ACO, TIM1OVF ; Для использования АЦП МК нужно подать опорное напряжение на вывод AREF - мы подадим 5 вольт питания МК. Но в VMLAB ; нельзя соединить два узла напрямую. Берем резистор на 1 Ом. R1 VDD AREF 1 ; резистор R1 подключен к ; узлам VDD и AREF через сопротивление 1 Ом ; опорное напряжение Vref у нас 5 вольт - ; значит при подаче 5 вольт на вход АЦП ; мы получим результат: 1111111111 (АЦП 10-ти разрядный) ; Вход0 АЦП (это вывод PA0 МК) мы подключим к ; подвижному контакту переменного резистора ; (Slider 1 в окне "Control Panel") - ; чтобы при эмуляции менять напряжение на входе АЦП. V1 PA0 VSS SLIDER_1(0 5) ; на концах переменного резистора 0 и 5 вольт ; Эмулятор имеет 8 светодиодов - ; подключаем их к выводам порта B D1 VDD PB0 D2 VDD PB1 D3 VDD PB2 D4 VDD PB3 D5 VDD PB4 D6 VDD PB5 D7 VDD PB6 D8 VDD PB7 ; Эмулятор допускает прямое подключение светодиодов к ; плюсу питания и выводам МК - в действительности необходим ; токоограничительный резистор 430-910 Ом ; последовательно с каждым светодиодом! .PLOT V(PA0) ; на экран осциллографа (окно "SCOPE") ; выведем напряжение на движке потенциометра |
Запустив проект на симуляцию, понаблюдайте за светодиодами и осциллографом, изменяя положение движка потенциометра. Какое напряжение соответствует единице младшего разряда АЦП? Раскройте окно Peripherals и понаблюдайте за регистрами АЦП при изменении положения движка потенциометра S1. Сравните показания светодиодов и содержимое регистров ADCH и ADCL.
Просмотрите содержимое памяти программ и текст программы на ассемблере. Сколько ячеек занимает программа? По какому адресу расположен вектор прерывания по завершению процесса аналого-цифрового преобразования?
6.Запустите на симуляцию проект, подготовленный в папке z4(задача 4). Проект реализован на МК ATmega16.
В окне SCOPE (это виртуальный осциллограф) можно увидеть изменения напряжений на ножках МК, указанных в файле проекта - vmlab.prj. Верхняя осциллограмма – это сигнал на ножке TXD (PD1) последовательного порта USART, по которой МК передает данные на COM порт ПК через интерфейс RS232- что передает МК мы видим в виртуальном терминале TTY панели Control Panel. Там выводится значение ШИМ (PWM) сигнала, создаваемого на ножке PD5. Сам сигнал виден в окне SCOPE – посмотрите, как он меняется в соответствии с сообщаемыми числовыми значениями. На ножкеPD4формируются импульсы той же частоты с неизменной длительностью.
В файле проекта vmlab.prj к ножке PD5 подключен простейший фильтр нижних частот (ФНЧ) из резистора и конденсатора – он преобразует ШИМ-сигнал в постоянное напряжение, которое можно увидеть в окне SCOPE (сигнал DAC).
Формат передачи данных в примере – 8N1 (это формат по умолчанию для ПК). В таком формате передача байта начинается со "старт-бита" – это лог. "0" на ножке TXD для USART МК и +5...+15 В для COM порта ПК. Затем на ножку TXD выводятся все 8 бит передаваемого байта, начиная с нулевого. За время передачи бита приемник должен определить и запомнить этот уровень. Далее идет "стоп-бит" – это лог. "1" на ножке TXD для USART МК и -5...-15 В для COM порта ПК. Для согласования уровней между МК и ПК включают адаптер MAX232.
7. Протестируйте работу программы, текст которой приведен ниже. Разработайте программу, реализующую световой эффект бегущего огонька без использования ассемблерных вставок.
#include <mega16.h>
#include <delay.h>
void main(void){
DDRB=0xFF;
#asm ("ldi r20,1")
while(1){
delay_ms(10);
#asm ("lsl r20")
#asm ("out 0x18,r20")
if (PORTB==0){
PORTB++;
#asm ("ldi r20,1")}; Контрольные вопросы
};}
· Назовите нагрузочную способность линий портов AVR.
· Какими ассемблерными вставками можно разрешать и запрещать глобально прерывания в программе для AVR на языке Си?
· Запишите результат выполнения арифметических операций: 245/37 и 245%37.
· Какими командами можно организовать задержку в одну секунду в программе для AVR на языке Си?
· Дать комментарий к команде PORTA=~(per++);
· Объявите переменную mnogo, если она может принимать значения от нуля до миллиона.
· Прокомментировать результат выполнения команды ADCSRA|=0x40;
Содержание отчета
Отчет должен содержать тексты отлаживаемых программ с конкретной датой их компиляции, комментарии по ходу выполнения пунктов программы работы и рисунки, вставляемые в текст формата WORD, отображающие окна SCOPE , Control Panel и т.д. с результатами моделирования, а также ответы на контрольные вопросы.
Дата добавления: 2016-01-09; просмотров: 1310;