Цель
задачи:
1) Научиться использовать
8-ми канальный 10-битный АЦП имеющийся среди богатой периферии 40-ка
выводного МК AVR AT90s8535.
Программу
напишем и откомпилируем с помощью компилятора CodeVisionAVR
2) Научимся
отлаживать программу в эмуляторе Visual Micro Lab с отслеживанием
ее движения по исходному тексту на языке Си.
Для выполнения задачи
необходимо:
-
Установленный компилятор CodeVisionAVR
-
Установленный эмулятор Visual Micro
Lab
- Data Sheet на МК AVR AT90s8535
- необходимо изучить
документ Atmel "как начать
работать с компилятором CodeVisionAVR": AN
AVR033 "Getting Started with the CodeVisionAVR C Compiler"
- свободное время и
желание.
Теория. Кратенько
так:
АЦП - аналогово цифровой
преобразователь. Это устройство позволяет преобразовать аналоговый сигнал
- т.е. напряжение которое мы обычно меряем вольтметром, в цифровой вид - в
набор единиц и нулей - который хорошо усваивает МК.
Познакомимся поближе с АЦП МК
AT90s8535.
Откройте стр. 59 Data Sheet "Analog to Digital Converter" -
читаем:
Feature list:
• 10-bit
Resolution - разрешение 10-бит - значит результатом АЦ преобразования
будет 10-ти значное двоичное число, а шаг измерения напряжения составит 1:1024 от полной шкалы.
• ±2 LSB Accuracy -
точность результата ±2 младших разряда
(подробней дальше!) или ±(2 : 1024)
от полной шкалы.
• Полная шкала - это диапазон
измеряемого напряжения. для AVR это напряжение от 0 вольт до напряжения на
ножке AREF (оно должно быть не менее 2 вольт!).
Изменить этот диапазон можно с помощью
делителя на резисторах или внешнего усилителя на
ОУ (Операционный Усилитель).
• 0.5 LSB
Integral Non-Linearity - нелинейность преобразования 1:2048 от полной
шкалы.
• 65 - 260 µs
Conversion Time - преобразование происходит за время от 65 до 260
мкС.
• Up to 15
kSPS - скорость до 15000 измерений в секунду! но только с одного
канала!
• 8 Multiplexed
Input Channels - 8 мультиплексированных входных каналов - т.е. вы можете
подать на МК 8 измеряемых напряжений одновременно, но сможете проводить
преобразование только одного входного сигнала в данный момент
времени!
• Rail-to-Rail
Input Range - диапазон входных, напряжений равен напряжению питания МК.
Это диапазон допустимых!!! напряжений на входе АЦП -
не путайте это с полной шкалой или с диапазоном измеряемого
напряжения.
Обратите
внимание, что некоторые новые МК семйства
AVR, например ATmega16,
имеют входы АЦП с программируемым усилением сигнала до 200
раз! |
• Free Run or Single Conversion Mode - АЦП может автоматически,
постоянно проводить преобразования - без напоминания со стороны программы,
а может проводить отдельные преобразование по указанию программы
МК.
• Interrupt on
ADC Conversion Complete -
по окончании преобразования возникает
прерывание.
• Sleep Mode
Noise Canceler - для снижения влияния цифрового шума на точность
преобразования можно проводить его при "спящем" МК.
На следующей 60-й странице ДШ
можно увидеть структурную схему АЦП: Figure 45. Analog to Digital
Converter Block Schematic
Итак входные напряжения для
измерения нужно подавать на выводы 33-40 МК - это PORTA
(смотрим стр. 1 Data Sheet - рисунок МК с обозначениями
выводов)
Важно: обратите внимание
на следующие выводы:
- 30 AVCC - питание АЦП - напряжение не
должно отличаться от VCC более чем на 0.3 вольта.
- 31 AGND - "аналоговая земля"
- это нижний предел диапазона измерения. На этом выводе должен быть
потенциал: 0 вольт.
- 32 AREF - на этот вывод мы
должны подать напряжение соответствующее максимуму требуемого диапазон
измеряемого напряжения. Код такого или большего напряжения будет равен
1023 или 1111111111. Это напряжение
может находится в
диапазоне от AGND до
AVCC.
НО! использовать AREF менее 2х
вольт не
рекомендуется! |
Итак, если мы подали
на вывод AREF X вольт - то можем измерять напряжения от 0 до 5
вольт с шагом: X /1024 вольт с точностью: ±(X * 2 / 1024) НО!
напряжения Х вольт и выше
будут преобразовываться в код 1023.
Примеры:
1) Мы подали на
вход АЦП напряжение 2.832 вольта - какой результат мы получим, если на
выводе AREF у нас 4 вольта? (Питание МК 5
вольт).
посчитаем: вначале определим шаг
преобразования: 4/1024=3.90625 мв теперь
можно определить какой двоичный код мы получим:
2832/3.90625=725 теперь надо учесть невысокую точность АЦП в
±2 десятичных
единицы.
Итак, в результате АЦ преобразования мы получим число
от 723 до 727.
По
моему все понятно? посчитайте на листочке другие варианты - потренируйтесь
пожалуйста.
2) А если
подать 4.23 или 4.47 или 4.876 или5 вольт?
Результат будет одинаков: 1023
3)
А если подать 4 вольта ровно? т.е.
соединить вход АЦП с AREF ?
Результат, с учетом ошибки будет : 1021, 1022
или 1023.
Теперь мы
знаем, что должны
получить в результате АЦП - но где этот результат должен
появится?
Смотрим стр. 60 ДШ - результат измерения 10 битный
- значит для его хранения требуется более байта - значит 2 байта: это два
регистра ADCH и ADCL . Регистр ADCL
хранит младший байт результата, а 9й и 10й (самый
старший! или MSB - мост сигнифи...) биты результата становятся,
соответственно 0-м и 1-м битами регистра ADCH.
L - ло -
значит младший. H - хай - значит
старший.
Запишем варианты содержимого
этих регистров для приведенного выше примера расчетов результата
преобразования с учетом точности АЦП:
результат |
ADCH |
ADCL |
723 |
----
--10 |
1101
0011 |
724 |
----
--10 |
1101
0100 |
725 |
----
--10 |
1101
0101 |
726 |
----
--10 |
1101
0110 |
727 |
----
--10 |
1101
0111 |
см. "ADC Data Register - ADCL
and ADCH" на стр. 64
для перевода чисел
из одной системы исчисления в другую удобно использовать калькулятор
WINDOWS в "инженерном режиме".
5 результатов на
одно напряжение!?
На самом деле АЦП вполне
нормальный и если проводить серию измерений одного и того же напряжения? в
одних и тех же условиях, мы скорей всего будем получать один и тот же
результат, однако он может быть одним из
ПЯТИ приведенных
выше для разных МК!
Для более точных измерений можно и
НУЖНО! - применить внешний АЦП с требуемыми
параметрами.
Можно использовать
периодическое измерение двух эталонных
напряжений и
затем учитывать полученные значение для
сведения ошибки АЦП только к его
нелинейности
вычислительными средствами.
Источники опорного
напряжения - "ИОН" в таблице
Идем дальше:
Итак - по окончании преобразования можно считать результат
из этих регистров. Причем первым нужно
читать ADCL при этом оба регистра ADCL и ADCH блокируются до
тех пор пока мы не считаем результат из
ADCH. т.е. результат следующего
преобразования может пропасть но не испортит не дочитанного результата!
А чтоб не пропадал нужно читать вовремя!
Компилятор Code Vision
позволяет использовать виртуальный
(не существующий реально! -
не ищите его в ДШ) 2х байтный регистр ADCW в
котором "появляется" результат
АЦП. Это удобно. |
программируем
- конструируем:
пожалуй
начнем с описания схемы подключения МК и
обвески для эмулятора:
1) Создайте и
сохраните текстовый файл - например z5_start.txt
- это будет заготовка для файла проекта для
VMLAB.
Давайте наполним его содержанием: Измеряемое
напряжение мы будем подавать на вход PA0
(ADC0 - вывод 40) МК с движка переменного
резистора. Выводы "переменника"
подсоединим к нулю и к питанию МК.
Таким
образом во время эмуляции мы сможем
менять напряжение на входе ADC0 АЦП от 0 до 5
вольт.
Результат измерения будем
выводить в портB МК на 5
светодиодов эмулятора - горит "1" не
горит "0" - точнее мы будем видеть
только 5 младших битов результата.
; Заголовок:
; ********* www.avr123.by.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 вольт
; Эмулятор v3.7 имеет лишь 5 светодиодов -
; подключаем их к выводам порта B
D1 VDD PB0
D2 VDD PB1
D3 VDD PB2
D4 VDD PB3
D5 VDD PB4
УРА! эмулятор
v3.9 имеет 8 светодиодов!
можно увидеть весь байт!
Попробуйте
сами "подключить" новые 3
светодиода! Логика наверно ясна?
|
; Эмулятор допускает прямое подключение
; светодиодов к +питания и выводам МК -
; в действительности необходим
; токо-ограничительный резистор 430-910 Ом
; последовательно с каждым свето-диодом!
.PLOT V(PA0) ; На экран Осцилографа (окно
; "SCOPE") выведем напряжение
; на движке потенциометра
;
все
Программирование
МК: Теперь
мы знаем схему устройства и что оно
должно делать - значит можно начать
создавать управляющую программу
для МК. 1) В
папке C:\CVAVR (где у вас должен
находится компилятор CodeVisionAVR)
создайте папку A8535 для файлов
проекта.
2) Запустите компилятор. Для
создания файла проекта нажимайте:
Файл - новый - проект - ОК - No
Перейдите в созданную для проекта папку A8535
и введите в поле "имя файла": A8535
нажмите "сохранить" - откроется
окно конфигурации проекта.
Откройте закладку "C Compiler" и
установите все вот так:
Обратите
внимание на форматы выходных файлов: нам
понадобится как обычно .HEX, но теперь еще
и .COF файл - в нем содержится привязка
прошивки для МК к тексту программы на Си
для эмулятора!
Нажмите ОК.
Теперь для создания файла исходного
текста на Си нажимайте:
Файл - Source - ОК появился файл untitled.c
нажимайте:
Файл - Сохранить как
введите в поле "имя файла": A8535.c и
нажмите Сохранить.
Теперь все готово к созданию текст
программы на языке Си.
3) Текст программы черным а комментарии зеленым: /*
ADC пример для МК AT90S8535 Курс
AVR "с нуля" на языке Си - задача 5 avr123.by.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 но
в этом компиляторе вы можете
использовать его - это виртуальный 16
битный регистр, он содержит все 10 бит
результата - удобно, но можно
использовать и регистры из DataSheet, а
именно: ADCL и ADCH
Далее идет операция:
~
- это инверсия: ЕДИНИЦЫ становятся
НУЛЯМИ и наоборот, нам нужно это
сделать, чтобы "1" соответствовал
горящий светодиод - ведь по схеме
подключения он загорается когда на
ножке МК "0"
Еще важный момент:
(unsigned char) -
приведение типа данных - двухбайтную
величину (ADCW -
виртуальный!!! 16
битный регистр существующий только
в "голове" компилятора КодВижн!) мы привели к типу беззнаковый
символьный - это 8 бит - такой тип данных "полезет"
в порт МК */
delay_ms(20); //
задержка 20 мили секунд
ADCSR|=0x40; //
запустили следующее
// АЦ преобразование.
//
почитайте DataSheet о регистре ADCSR !
} //
закрывающая скобка функции-
// обработчика прерывания
////////////////////////////////////////
void main(void) { /*
Главная функция main - она должна быть
в любой программе на Си */
PORTB=0xFF; /* Записали в "защелки"
порта "B" МК единички - но на
выводах МК они появятся только когда мы
сделаем эти ножки ВЫХОДАМИ ! */
DDRB=0xFF; /* Регистр
направления работы выводов порта
"B" МК - мы записали восемь "1" - значит
теперь все ножки стали ВЫХОДАМИ и на них
появились сигналы находящиеся в
защелках PORTB, а предыдущей строкой
программы мы туда закинули единички -
теперь они на ножках PB0_PB7 МК. */
А
высокие уровни это почти напряжение
питания МК - значит ток через светодиоды
не протекает и они погашены.
Помните?
Светодиоды другими своими выводами
подключены через резисторы именно к
питанию! Значит пропала разность
потенциалов и нет тока - вот так просто... |
ADCSR=0x8E; /*
почитайте стр.63 DataSheet о регистре ADCSR и
вам станет ясно, что делает эта строчка.
Поясню (все же КУРС! а не хухры мухры...):
мы записали в 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" только бит с номером
изменяемого бита.
(Сам то
понял, что сказал? ась...) |
Проделайте
такие операции на бумажке с разными
двоичными числами, подумайте как
сделать "0" определенный бит?
*/
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);
}
Совет:
(бесплатно! халява! FREE!)
Учите Английский - еще не раз
пригодится! |
Сохраните
файл с исходным тестом программы -
нажмите на "дискетку".
4)
Попробуем откомпилировать нашу
программу - нажмите клавиши Shift+F9
Опочки! О'б'шибка! мол нет исходника то в
вашем проекте! Мы
исходник на Си создали и написали и
сохранили, а его еще нужно включить в
состав проекта!
Но на ошибках учимся,
друзья!
вот так это делаем: нажмите на кнопочку:
"молоток-ключ-отвертка" - в
открывшемся окне конфигурации проекта
нажмите - Add - выбирете A8535.c - и "Открыть" Теперь
файл A8535.c в составе проекта - нажмем "ОК".
Сделайте: Файл - сохранить все.
Вторая попытка
компиляции - опять нажмите клавиши Shift+F9
Откомпилилось
УРА! - выскочило окошко:
Почитайте и Нажмите "ОК"
Компилятор можно закрыть.
Посмотрите
теперь содержимое папки проекта C:\CVAVR\A8535
- вместо двух файлов там теперь целая
куча!
В куче есть файл .asm с текстом нашей
программы на ассемблере для любителей
оного!
поЭмулируем
чуток:
Для
эмуляции нам понадобятся всего 3 файла
из полученных в процессе компиляции: A8535__.c
A8535.hex A8535.cof 1)
Создайте папку AD_TEST для проекта там где
должен быть установлен эмулятор: C:\VMLAB\AD_TEST Скопируйте
названные выше три файла в эту папку. 2)
Запускаем эмулятор: Нужно
создать новый проект
нажимаем: 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 в двоичном виде!
Продолжая в это духе мы могли бы увидеть
попадание в функцию обработчик
прерывания - но слишком много кликать
мышкой придется.
Есть
решение этой проблемы - называется
""Step into" " или "Breakpoints"
по аглицки.
Щелчком мыши сделаем
вот так:
Мы поставили значок
"СТОП" левей той
строки на которой хотим остановится.
Нажимаем "светофор"
и мгновенно останавливаемся на
интересующей нас строчке! так просто.
В окне Watch видим: Мы находимся в
обработке прерывания 0x0E - это прерывание
от АЦП.
Теперь поднимите движок переменника S1 в
окне "Control Panel" примерно на
второе деление снизу и снова нажмите "светофор"
Видим в окне "Peripherals" что
напряжение на входе АЦП 1.19 вольт а двоичный
код преобразования в регистре ADCL
'11110011'
Но почему же мы не
видим этого результата на светодиодах???
Дело в том что мы
остановились по прерыванию АЦП - т.е.
преобразование уже выполнено, а вот
строчка на которой мы остановились еще
не выполнялась - т.е. результат не
отправлен в PORTB - и светодиоды
отображают предыдущий результат или
начальное состояние - а они у нас
погашены в начале программы!
Нажмите кнопку вторую справа от
светофора - светодиоды загорелись в соответствии
с результатом! Значит результат
отправлен в PORTB и мы его видим.
Давайте выключим
точку останова (щелкните мышкой по
значку stop) и запустив
программу "светофором"
в режим непрерывной работы понаблюдаем
как отображается в Осциллографе наши
манипуляции потенциометром -
одновременно в окне "Peripherals"
можно увидеть десятичное и двоичное значения
входного напряжения АЦП.
Теперь вы можете
самостоятельно попробовать различные
изменения в процессе эмуляции.
Задача
завершена - программа делает то что
мы хотели.
Вы можете скачать
архив с файлами использованными в
задаче. |
Задание для
самостоятельной работы: Измените
текст программы на Си так чтобы АЦП
проводил преобразования со всех входов
последовательно.
А схему устройств измените так: Между
всеми входми АЦП включите резисторы по 10
кОм, кроме того поставьте резистор 10 кОм
от входа PA0 на землю и такой же резистор
от входа PA7 к +5 вольт питания МК.
Теперь напряжения на всех входах АЦП
различны - вы можете посчитать их а затем
результат проверить в эмуляторе!
Пожалуйста выполните это
задание - АЦП очень нужная в хозяйстве
штука - научитесь его применять! и
не стесняйтесь это
делать!
вопросы и
дополнения в конфу! |
|