КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Подготовка файлов для VMLAB
1. Создайте текстовый файл, например z5_start.txt, который будет файлом проекта для VMLAB. 2. Измеряемое напряжение мы будем подавать на вход PA0 (ADC0 - вывод 40) МК с движка переменного резистора. Выводы переменного резистора подсоединим к нулю и к питанию МК. Таким образом, во время эмуляции мы сможем менять напряжение на входе ADC0 АЦП от 0 до 5 вольт. 3. Результат измерения будем выводить в порт B на 5 светодиодов эмулятора - горит "1" не горит "0" - точнее мы будем видеть только 5 младших битов результата.
Обратите внимание, VMLAB допускает прямое подключение светодиодов к + питания и выводам МК. В действительности необходим токоограничивающий резистор 430 - 910 Ом, включенный последовательно с каждым светодиодом! Создание программы для МК: 1. В папке D:\CVAVR (где у вас должен находится компилятор CodeVisionAVR) создайте папку Atmega16 для файлов проекта. 2. Запустите компилятор. 3. Для создания файла проекта выберите Файл -> новый -> проект -> ОК -> No 4. Перейдите в созданную для проекта папку Atmega16 и введите в поле "имя файла": Atmega16. 5. Нажмите "сохранить" - откроется окно конфигурации проекта. 6. Откройте закладку "C Compiler" и установите все вот так:
Обратите внимание на форматы выходных файлов: Нам понадобится как обычно.HEX, но теперь еще и.COF файл - в нем содержится привязка прошивки для МК к тексту программы на Си для симуляторов!
7. Нажмите ОК. 8. Для создания файла исходного текста на Си нажимайте Файл -> Source -> ОК появился файл untitled.c. 9. Теперь нажимайте Файл -> Сохранить как, введите в поле "имя файла": A8535.c и нажмите Сохранить. Теперь все готово к созданию текста программы на языке Си. Текст программы выделен черным цветом, а комментарии зеленым: /* заголовок программы ADC пример для МК AT90S8535 Курс AVR "с нуля" на языке Си - задача 5 avr123.nm.ru CodeVisionAVR C Compiler Напряжение на выводе AREF = 5.0V #include <90s8535.h> /* файл с описанием "железа" МК AT90S8535. Текст этого файла просто будет вставлен вместо этой строки препроцессором компилятора перед компиляцией */ #include <delay.h> // готовые функции задержек #define ADC_VREF_TYPE 0x00 /* теперь препроцессор везде в тексте программы заменит "ADC_VREF_TYPE" на "0x00" */ /* Мы будем прерываться по завершении АЦ преобразования и выводить результат. Нужно написать функцию обработчик этого interrupt [ADC_INT] void adc_isr(void) { PORTB=(unsigned char) ~ADCW; Проанализируем эту строку программы...
Далее идет операция: ~ - это инверсия: ЕДИНИЦЫ становятся НУЛЯМИ и наоборот, нам нужно это сделать, чтобы "1" соответствовал горящий светодиод - ведь по схеме подключения он загорается когда на ножке МК "0" Еще важный момент: (unsigned char) - приведение типа данных - двухбайтную величину (ADCW - виртуальный!!! 16 битный регистр существующий только в "голове" компилятора КодВижн!) мы привели к типу беззнаковый символьный - это 8 бит - такой тип данных "полезет" в порт МК */ delay_ms(20); /* задержка 20 милисекунд Внимание! Не рекомендуется использовать паузы в обработчике прерывания, если вы не контролируете момент возникновения событий, вызывающих прерывание, и более одного прерывания а программе. Подробнее о прерываниях в Лекции № 9. */ ADCSR|=0x40; // запустили следующее } // закрывающая скобка функции-
PORTB=0xFF; /* Записали в "защелки" порта "B" МК единички - но на выводах МК они появятся только когда мы сделаем эти ножки ВЫХОДАМИ! */ DDRB=0xFF; /* Регистр направления работы выводов порта "B" МК - мы записали восемь "1" - значит теперь все ножки стали ВЫХОДАМИ и на них появились сигналы находящиеся в защелках PORTB, а предыдущей строкой программы мы туда закинули единички - теперь они на ножках PB0_PB7 МК. */
ADCSR=0x8E; /* мы записали в ADCSR число 0x8E или 1000 1110 Bit 7 - ADEN: записали ‘1’ - включили АЦП (догадались? да, да... '0' - выключить АЦП) Bit 6 - ADSC: ‘1’ - запускает АЦ преобразование, а у нас '0' значит преобразование пока не начнется. Bit 5 - ADFR: ‘1’ - переводит АЦП в автоматическую непрерывную работу - в "автономку". У нас Bit 5 = '0' - значит АЦП будет делать каждое, отдельное преобразование по нашей команде. Bit 4 -ADIF: Флаг прерывания - по окончании АЦП становится ‘1’ и сбрасывается либо выполнением обработки прерывания, либо записью в этот бит единицы! Bit 3 - ADIE: ‘1’ - разрешили прерывание по окончании АЦП. Bits 2..0 - ADPS2..ADPS0: Установка частоты работы АЦП - у нас 110 - значит коэф. деления 64 - частота работы АЦП 57,65625 кГц. */ #asm("sei") // разрешили глобальные прерывания ADMUX=0; // Выбрали вход АЦП, напряжение на котором будет оцифровываться. ADCSR |=0x40; /* Запустили первое преобразование сделав '1' бит_6 в регистре ADCSR
*/ } // скобка закрывающая для main Вот текст программы на Си без комментариев:
Также его нужно включить в состав проекта: нажмите на "молоток-ключ-отвертка" - в открывшемся окне конфигурации проекта нажмите - Add - выбирете Atmega16.c - и "Открыть" – теперь файл A8535.c в составе проекта, нажмем "ОК". Сделайте: Файл - сохранить все. Симулируем: Нам понадобятся всего 3 файла из полученных в процессе компиляции: Запустите VMLAB. Нужно создать новый проект нажимаем: Project - New project появилось окно "Create new project" посмотрите внимательно - оно содержит несколько шагов конфигурирования проекта - нужно просто заполнить их аккуратно. step 1 - дадим имя нашему проекту ad_test.prj убедитесь что он расположен в созданной нами папке! step 2 - выбор МК: AT90S8535 step 3 - отмечаем третий пункт - файл A8535.cof step 4 - пишем в верхнем поле название файла исходного текста на Си A8535__.c cи нажимаем кнопку справа: "добавить этот". Жмем "ОК" Разверните окно файла проекта ad_test.prj - скелет проекта готов! Теперь нужно открыть текстовый файл z5_start.txt который мы создавали в начале задачи. Мы описали в нем на языке Эмулятора схему устройства на МК - теперь нужно добавить в него несколько строчек из сгенерированного эмулятором файла проекта: Вставьте перед строчкой "; Для исполь..." следующее: .MICRO "AT90S8535" .TOOLCHAIN "GENERIC" .TARGET "a8535.hex"; эмулируемая прошивка МК .COFF "a8535.cof"; файл содержит привязку .SOURCE "a8535__.c"; исходник на Си на который
.CLOCK 3.69meg; частота используемого кварца ;---------------------------------------------
Теперь: Файл - сохранить все. Можно от'Билдить проект - нажмите F9 Вот такая надпись должна вас порадовать: Все готово к прогону программы в эмуляторе. Но перед запуском нужно еще сконфигурировать окна на экране ПК чтобы удобно было наблюдать процесс эмуляции. Нам понадобятся окна: · Control panel - на этой панели переменник для изменения напряжения на входе АЦП и светодиоды · Messages - всякие месаги кидает по ходу эмуляции - разместите его внизу и сделайте низким и широким. · Code - в этом окне мы увидим наш исходник на Си и движение программы по нему в процессе работы. В меню View можно посмотреть какие еще окна доступны - а для чего они почитать в Help.
3) Эмуляция: Нажимаем светофор. Эмулятор умничает и ругается: мол Сторожевой Таймер (собака в просторечии) батенька должна быть сброшена! до включения! Любит он поругаться - но у нас ЦВЕ не используется - посмотрите файл с ассемблерным листингом программы (он в папке проекта в компиляторе) - там вот такой пунктик есть:
Эмулятор заругался на строчку 3 не учитывая, что написано в строках 4 и 5! иронично:...и эта фича эмулятора называется проверка правильности кода! во как... Пожалуйста откройте DataSheet стр. 44 раздел: "Watchdog Timer" - это очень полезное устройство и нужное! Давайте разберемся с нашим ASM кодом: LDI R31,0x18; загрузили в регистр R31 число 00011000 OUT WDTCR,R31; это число записали в регистр WDTCR LDI R31,0x10; загрузили число 00010000 OUT WDTCR,R31; записали в регистр WDTCR если вы прочитали стр. 44 и хотя бы начало стр.45 - вам стало ясно, что смутило эмулятор в 3 строчке: это запись в бит_3 значения "1". НО! механизм отключения Собаки имеет защиту от случайного отключения! Отключается Собака переводом бит_3 из "1" в "0" - но при условии что бит_4 у нас "1"!!! Так что компилятор сделал все правильно!
Эмулируем дальше: Пойдем по программе шагая по инструкциям - для этого есть 2-я кнопка (правее светофора) "Step into". Нажимаем ее. В окне "код" - видим подсветилась первая строка в функции main { } - все верно, программа на Си и должна выполнятся отсюда. Откройте View -> Watch - в этом окне появляются названия функций, в которых мы находимся в данный момент. Нажимаем опять "Step into" - перешли на следующую строчку кода Си - хотя МК выполнил две ASM инструкции! Еще два раза нажимаем и видим что в регистр АЦП ADCSR записано число 10001110 - это есть 0x8E в двоичном виде! Продолжая в это духе мы могли бы увидеть попадание в функцию обработчик прерывания - но слишком много кликать мышкой придется. Есть решение этой проблемы - называется "Точка останова" или "Breakpoints". Щелчком мыши сделаем вот так: Мы поставили значок "СТОП" левей той строки на которой хотим остановится. Нажимаем "светофор" и мгновенно останавливаемся на интересующей нас строчке! так просто. В окне Watch видим: Мы находимся в обработке прерывания 0x0E - это прерывание от АЦП. Теперь поднимите движок переменника S1 в окне "Control Panel" примерно на второе деление снизу и снова нажмите "светофор" Видим в окне "Peripherals" что напряжение на входе АЦП 1.19 вольт а двоичный код преобразования в регистре ADCL '11110011' Но почему же мы не видим этого результата на светодиодах??? Дело в том что мы остановились по прерыванию АЦП - т.е. преобразование уже выполнено, а вот строчка на которой мы остановились еще не выполнялась - т.е. результат не отправлен в PORTB - и светодиоды отображают предыдущий результат или начальное состояние - а они у нас погашены в начале программы! Нажмите кнопку вторую справа от светофора - светодиоды загорелись в соответствии с результатом! Значит результат отправлен в PORTB и мы его видим. Давайте выключим точку останова (щелкните мышкой по значку stop) и запустив программу "светофором" в режим непрерывной работы понаблюдаем как отображается в Осциллографе наши манипуляции потенциометром - одновременно в окне "Peripherals" можно увидеть десятичное и двоичное значения входного напряжения АЦП. Теперь вы можете самостоятельно попробовать различные изменения в процессе эмуляции. Задача завершена - программа работает в соответствии с поставленной задачей. Измените текст программы на Си так чтобы АЦП проводил преобразования со всех входов последовательно. А схему устройств измените так: Между всеми входми АЦП включите резисторы по 10 кОм, кроме того поставьте резистор 10 кОм от входа PA0 на землю и такой же резистор от входа PA7 к +5 вольт питания МК. Теперь напряжения на всех входах АЦП различны - вы можете посчитать их а затем результат проверить в VMLAB!
Лабораторная работа №6 – Изучение структуры типовой программы микроконтроллера, реализация меню
Дата добавления: 2014-12-23; Просмотров: 1980; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |