AVR раз, два, три... бай-ру   это просто!

Курс  Начинающим:   МикроКонтроллеры 
AVR "с нуля" на языке Си

- задача 05 -

Цель задачи:  

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 вольт питания МК.  

Теперь напряжения на всех входах АЦП различны - вы можете посчитать их а затем результат проверить в эмуляторе! 

Пожалуйста выполните это задание - АЦП очень нужная в хозяйстве штука - научитесь его применять! и не стесняйтесь это делать!


вопросы и дополнения в конфу!