Студопедия

КАТЕГОРИИ:


Архитектура-(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 младших битов результата.

 

  ; Заголовок:; ********* www.avr123.nm.ru *********;; задача 5. АЦП МК AVR AT90S8535;; компиляция на - CodeVision C compiler demo;; Эмулятору VMLAB нужны файлы.hex.cof __.c; полученые в результате компиляции.;; *********************************; Для использования АЦП МК нужно подать; опорное напряжение на вывод AREF - мы; подадим 5 вольт питания МК. Но! в VMLAB; нельзя соединить два узла напрямую; используем резистор на 1 Ом: R1 VDD AREF 1; резистор R1 подключен к; узлам VDD и AREF. Сопротивление 1 Ом; опорное напряжение Vref у нас 5 вольт -; значит при подаче 5 вольт на вход АЦП; мы получим результат: 11111 11111 (АЦП в; AT90S8535 10-ти разрядный); а шаг преобразования составит; Vref/1024=4.883 милиВольта; Вход0 АЦП (это вывод PA0 МК) мы подключим к; подвижному контакту переменного; резистора (Slider 1 в окне "Control Panel") -; чтобы при эмуляции менять измеряемое; напряжение на входе АЦП. V1 PA0 VSS SLIDER_1(0 5); на концах переменника; 0 и 5 вольт; 5 светодиодов -; подключаем их к выводам порта B D1 VDD PB0 D2 VDD PB1 D3 VDD PB2 D4 VDD PB3 D5 VDD PB4 .PLOT V(PA0); На экран Осцилографа (окно; "SCOPE") выведем напряжение; на движке потенциометра; Все, файл проекта для VMLAB готов.

Обратите внимание, 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
Частота кварца 3.69 МГц
Измеряемое напряжение подается на вывод PA0
Результат (младший байт!) выводится в PORTB
К битам 0_4 PORTB подключены светодиоды.
*/

#include <90s8535.h> /* файл с описанием "железа" МК AT90S8535. Текст этого файла просто будет вставлен вместо этой строки препроцессором компилятора перед компиляцией */

#include <delay.h> // готовые функции задержек

#define ADC_VREF_TYPE 0x00 /* теперь препроцессор везде в тексте программы заменит "ADC_VREF_TYPE" на "0x00"


Директива #define - очень мощная и удобная Изучите и применяйте ее!

*/

/* Мы будем прерываться по завершении АЦ преобразования и выводить результат.

Нужно написать функцию обработчик этого
прерывания - пишем: */

interrupt [ADC_INT] void adc_isr(void) {
/* ОЧЕНЬ ВАЖНО! Открывающую фигурную скобку тела функции нужно писать в одну строчку с ней - если будем отлаживать программу с просмотром движения по тексту на языке Си */

PORTB=(unsigned char) ~ADCW;
/* выводим в PORTB результат АЦП.

Проанализируем эту строку программы...


Регистра ADCW вы не найдете в DataSheet
но в компиляторе CVAVR вы можете использовать его - это виртуальный 16 битный регистр, он содержит все 10 бит результата - удобно, но можно использовать и регистры из DataSheet, а именно: ADCL и ADCH

Далее идет операция:

~ - это инверсия: ЕДИНИЦЫ становятся НУЛЯМИ и наоборот, нам нужно это сделать, чтобы "1" соответствовал горящий светодиод - ведь по схеме подключения он загорается когда на ножке МК "0"

Еще важный момент: (unsigned char) - приведение типа данных - двухбайтную величину (ADCW - виртуальный!!! 16 битный регистр существующий только в "голове" компилятора КодВижн!) мы привели к типу беззнаковый символьный - это 8 бит - такой тип данных "полезет" в порт МК */

delay_ms(20); /* задержка 20 милисекунд

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

Подробнее о прерываниях в Лекции № 9.

*/

ADCSR|=0x40; // запустили следующее
// АЦ преобразование.
// почитайте DataSheet о регистре ADCSR!

} // закрывающая скобка функции-
// обработчика прерывания


////////////////////////////////////////


void main(void) { /* Главная функция main - она должна быть в любой программе на Си */

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; // Выбрали вход АЦП, напряжение на котором будет оцифровываться.
// почитайте DataSheet о регистре ADMUX
// Вы должны понимать как выбрать канал АЦП

ADCSR |=0x40; /* Запустили первое преобразование сделав '1' бит_6 в регистре ADCSR

Что бы сделать какой либо бит регистра "единицей" не изменяя другие биты этого регистра, нужно выполнить побитную операцию "или" (обозначается |) этого регистра с маской. Маска это число, в котором все биты нули, а значение "1" имеют только устанавливаемые биты.

*/
while (1); /* бесконечный цикл - будем сидеть в нем пока есть питание МК, а по завершении АЦП будем выскаиквать в функцию обработки прерывания и возвращаться сюда */

} // скобка закрывающая для main

Вот текст программы на Си без комментариев:

 

#include <90s8535.h> #include <delay.h> #define ADC_VREF_TYPE 0x00 interrupt [ADC_INT] void adc_isr(void) { PORTB=(unsigned char) ~ADCW; delay_ms(20); ADCSR|=0x40; } void main(void) { PORTB=0xFF; DDRB=0xFF; ADCSR=0x8E; #asm("sei") ADMUX=0; ADCSR|=0x40; while (1); }

 


Сохраните файл с исходным тестом программы - нажмите на "дискетку".

Также его нужно включить в состав проекта: нажмите на "молоток-ключ-отвертка" - в открывшемся окне конфигурации проекта нажмите - Add - выбирете Atmega16.c - и "Открыть" – теперь файл A8535.c в составе проекта, нажмем "ОК". Сделайте: Файл - сохранить все.

Симулируем:

Нам понадобятся всего 3 файла из полученных в процессе компиляции:
A8535__.c
A8535.hex
A8535.cof

Запустите VMLAB.

Нужно создать новый проект

нажимаем: Project - New project

появилось окно "Create new project" посмотрите внимательно - оно содержит несколько шагов конфигурирования проекта - нужно просто заполнить их аккуратно.

step 1 - дадим имя нашему проекту ad_test.prj убедитесь что он расположен в созданной нами папке!

step 2 - выбор МК: AT90S8535

step 3 - отмечаем третий пункт - файл A8535.cof

step 4 - пишем в верхнем поле название файла исходного текста на Си A8535__.c cи нажимаем кнопку справа: "добавить этот".
Теперь в поле "Target file [HEX]" впишем: A8535.hex

Жмем "ОК"

Разверните окно файла проекта ad_test.prj - скелет проекта готов! Теперь нужно открыть текстовый файл z5_start.txt который мы создавали в начале задачи.

Мы описали в нем на языке Эмулятора схему устройства на МК - теперь нужно добавить в него несколько строчек из сгенерированного эмулятором файла проекта:

Вставьте перед строчкой "; Для исполь..." следующее:

.MICRO "AT90S8535"

.TOOLCHAIN "GENERIC"

.TARGET "a8535.hex"; эмулируемая прошивка МК

.COFF "a8535.cof"; файл содержит привязку
; содержимого [.hex] к коду в [__.c]

.SOURCE "a8535__.c"; исходник на Си на который
; сорентирован файл [.cof].
; это CodeVision добавил '__' при компиляции


.TRACE; выводить отладочную инфо в окне
; SCOPE - розовым (см. HELP эмулятора)

.CLOCK 3.69meg; частота используемого кварца

;---------------------------------------------
; Обозначения электрических "контактов" -
; узлов МК к которым можно "подключиться"
; эмулятору: RESET, AREF, ACO, TIM1OVF
; PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7,
;
; __ эта информация справочная - для
; каждого МК своя!


Теперь в тестовом файле z5_start.txt у нас полное описание проекта сохраните его. Выделите весь текст, скопируйте и замените вставкой содержание развернутого файла проекта эмулятора ad_test.prj

Теперь: Файл - сохранить все.

Можно от'Билдить проект - нажмите F9

Вот такая надпись должна вас порадовать:

Все готово к прогону программы в эмуляторе.

Но перед запуском нужно еще сконфигурировать окна на экране ПК чтобы удобно было наблюдать процесс эмуляции. Нам понадобятся окна:

· Control panel - на этой панели переменник для изменения напряжения на входе АЦП и светодиоды
Peripherals - нажмите "+" A/D converter - будем смотреть что в регистрах АЦП происходить будет.

· Messages - всякие месаги кидает по ходу эмуляции - разместите его внизу и сделайте низким и широким.
Scope - виртуалный осцилограф - в нем можно увидеть напряжение на входе АЦП - установите вертикальную шкалу 1 вольт на деление.

· Code - в этом окне мы увидим наш исходник на Си и движение программы по нему в процессе работы.

В меню View можно посмотреть какие еще окна доступны - а для чего они почитать в Help.

 

3) Эмуляция:

Нажимаем светофор. Эмулятор умничает и ругается: мол Сторожевой Таймер (собака в просторечии) батенька должна быть сброшена! до включения!

Любит он поругаться - но у нас ЦВЕ не используется - посмотрите файл с ассемблерным листингом программы (он в папке проекта в компиляторе) - там вот такой пунктик есть:

;DISABLE WATCHDOG
  LDI R31,0x18 OUT WDTCR,R31 LDI R31,0x10 OUT WDTCR,R31

Эмулятор заругался на строчку 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"!!!

Так что компилятор сделал все правильно!

     
  Включенный WDT (или Собака) сбрасывает - "ресетит" МК если его самого (Собаку) не сбросить программой то его переполнения. Если программа в МК "завистнет" то Собака не будет сброшена и перезагрузит МК - значит перезапустит программу МК сначала! Собака - сторожевой таймер - тикает от своего внутреннего RC генератора - период срабатывания устанавливается программно.  
     

Эмулируем дальше:

Пойдем по программе шагая по инструкциям - для этого есть 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; Просмотров: 1947; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.