Курс AVR123.nm.ru


Electronic Banner Exchange (ElBE)
 

 

Краткий курс - Самоучитель - AVR - быстрый старт с нуля

 

Задача - упражнение 11

 

поиск   GOOGLE   по 
Краткому Курсу AVR

Подставьте слово
и получите результат

 



Скачать книги и учебники по электронике и микроконтроллерам 

Как и чем прошить МК AVR читайте на странице 7 курса !

 

Цель задачи:  

1) Научиться использовать 8-ми канальный 10-битный АЦП имеющийся среди богатой периферии 40-ка выводного МК AVR AT90s8535 
(эта задача была написана очень давно...)

Программу напишем и откомпилируем с помощью компилятора CodeVisionAVR

2) Отладить программу в эмуляторе Visual Micro Lab с отслеживанием ее движения по исходному тексту на языке Си.

Я очень подробно и с картинками рассмотрел 
симуляцию программы в VMLAB в задаче 3



АЦП  ATmega16 описан в  задаче 9


 

Для выполнения задачи необходимы :

- Установленный компилятор CodeVisionAVR

- Установленный эмулятор Visual Micro Lab

- Data Sheet
  - ДШ на МК AVR AT90s8535

- Знать ХОРОШО теоретический материал курса - до стр. 5 

 

 


Теория - кратко :

АЦП - аналого цифровой преобразователь. Это устройство позволяет преобразовать аналоговый сигнал - т.е. напряжение которое мы обычно меряем вольтметром, в цифровой вид - в число, в набор единиц и нулей - который хорошо усваивает МК. 

Познакомимся поближе с АЦП МК AT90s8535. Откройте стр. 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 серии ATmega (например 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. 

 

     
  Обратите внимание !

Напряжение на AREF может находится в диапазоне от 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 результатов на одно напряжение ?!  


На самом деле АЦП вполне нормальный и если проводить серию измерений одного и того же напряжения? в одних и тех же условиях, мы скорей всего будем получать один и тот же результат, однако он может быть одним из ПЯТИ приведенных выше для разных МК! 

Для более точных измерений можно и НУЖНО! - применить 
внешний АЦП с требуемыми параметрами. 

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



Производитель МК AVR выпустил АпНоут по параметрам АЦП и методам их измерения и калибровки:

AVR120: Characterization and Calibration of the ADC on an AVR
(13 pages, updated 05/04) 

This application note explains various ADC (Analog to Digital Converter) characterization parameters and how they effect ADC measurements. It also describes how to measure these parameters during application testing in production and how to perform run-time compensation.

 

Источники опорного напряжения - "ИОН" 
в таблице



Идем дальше:

Итак - по окончании преобразования можно считать результат из этих регистров. Причем первым нужно читать ADCL при этом оба регистра ADCL и ADCH блокируются до тех пор пока мы не считаем результат из ADCH. т.е. результат следующего преобразования может пропасть но не испортит не дочитанного результата ! А чтоб не пропадал нужно читать вовремя!  


 

     
  Компилятор Code Vision позволяет использовать виртуальный (не существующий реально! - не ищите его в ДШ) 2-х байтный регистр ADCW в котором "появляется" результат АЦП. 

Это удобно. 

В новых AVR есть опция "выравнивание результата в лево" - это удобно для использования АЦП как 8-ми битного - тогда весь результат будет в ADCH - прочитайте ДШ сами, проверьте. 

 
     

 

 


программируем - конструируем:

пожалуй начнем с описания схемы подключения МК и обвески для эмулятора:

1) Создайте и сохраните текстовый файл - например z5_start.txt - это будет заготовка для файла проекта для VMLAB. 


Давайте наполним его содержанием:

Измеряемое напряжение мы будем подавать на вход PA0 (ADC0 - вывод 40) МК с движка переменного резистора. Выводы "переменника" подсоединим к нулю и к питанию МК. 

Таким образом во время эмуляции мы сможем менять напряжение на входе ADC0 АЦП от 0 до 5 вольт. 

Результат измерения будем выводить в портB МК на 5 светодиодов эмулятора VMLAB - горит "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 Ом  последовательно с каждым свето-диодом!

Такое правильное включение сделано в задаче 2


 

 


Программа для МК:

Теперь мы знаем схему устройства и что оно должно делать - значит можно начать создавать управляющую программу для МК.

1) В папке C:\CVAVR (где у вас должен находится компилятор CodeVisionAVR) создайте папку A8535 для файлов проекта.   

2) Запустите компилятор.

Для создания файла проекта нажимайте: 
Файл -> новый -> проект -> ОК -> No 

Перейдите в созданную для проекта папку A8535 и введите в поле "имя файла": A8535  

нажмите "сохранить" - откроется окно конфигурации проекта.

Откройте закладку "C Compiler" и установите все вот так:


Обратите внимание на форматы выходных файлов: 

Нам понадобится как обычно .HEX, но теперь еще и .COF файл - в нем содержится привязка прошивки для МК к тексту программы на Си для симуляторов !

Нажмите ОК.

Теперь для создания файла исходного текста на Си нажимайте: 
Файл -> Source -> ОК   появился файл untitled.c

нажимайте: 
Файл -> Сохранить как 

введите в поле "имя файла": A8535.c 
и нажмите Сохранить. 

Теперь все готово к созданию текст программы на языке Си.


3) Текст программы черным а комментарии зеленым:

/*  заголовок программы

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 мили секунд

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

Подробней о прерываниях на странице 3 курса.

*/

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") // разрешили прерывания вообще
// Ассемблерная вставка!
 стр .5 "Си для МК"

ADMUX=0; // Выбрали вход АЦП, напряжение на 
// котором будет оцифровываться. 

Почитайте DataSheet о регистре ADMUX 
Вы должны понимать как выбрать канал АЦП
 


Кроме того есть некоторые условия которые нужно выполнить, чтобы следующее АЦП произошло по внось выбраному каналу.

Рекомендуется делать паузу 125 мкС после изменения дифференциального канала оцифровки !

 



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

Как мы это сделали? 

 

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

Маска это числом где все биты нули, а "1" только бит с номером изменяемого бита.   

Подробней на стр. 5  Си для МК 

и в задаче 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); 






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

 

4) Попробуем откомпилировать нашу программу - нажмите клавиши Shift+F9 

Опочки! О'б'шибка! мол нет исходника то в вашем проекте !

Мы исходник на Си создали и написали и сохранили, а его еще нужно включить в состав проекта! 

Но на ошибках учимся, друзья !



вот так это делаем: нажмите на кнопочку:  "молоток-ключ-отвертка" - в открывшемся окне конфигурации проекта нажмите - Add - выбирете A8535.c - и "Открыть"

Теперь файл A8535.c в составе проекта - нажмем "ОК". Сделайте: Файл - сохранить все. 


Вторая попытка компиляции - опять нажмите клавиши Shift+F9

 

Откомпилилось  -  УРА!

выскочило окошко:


 
Почитайте и Нажмите "ОК" 

Компилятор можно закрыть.

Посмотрите теперь содержимое папки проекта C:\CVAVR\A8535 - вместо двух файлов там теперь целая куча! 

В куче есть файл .asm с текстом нашей программы на ассемблере для любителей оного!




поСимулируем чуток:

Нам понадобятся всего 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) Эмуляция: 

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


 

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

 

;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" !!! 


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



 

     
  Включенный 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 ! 

 


Пожалуйста выполните это задание !

АЦП очень нужная в хозяйстве штука.

Научитесь его применять! 

И не стесняйтесь это делать!


 

 

Задачи  курса

 

 

 



 

          

 

 

 

 

 

ключевые слова: программирование микроконтроллеров, как написать программу для микроконтроллера, обучение программированию микроконтроллеров, микроконтроллеры atmega128, как запрограммировать микроконтроллер, как прошить микроконтроллер, отладка программы для AVR, моделирование работы электронных схем, электронные проекты, хобби, язык си для микроконтроллеров, язык программирования си
AT76C712 , AT76C713 , AT90CAN128 , AT90CAN128 Automotive , AT90CAN32 , AT90CAN64 , AT90PWM2 , AT90PWM3 , AT90S1200 , AT90S2313 , AT90S2323 , AT90S2343 , AT90S4433 , AT90S8515 , AT90S8535 , ATmega128 , ATmega1280 , ATmega1281 , ATmega16 , ATmega161 , ATmega162 , ATmega163 , ATmega164 , ATmega165 , ATmega168 , ATmega168 Automotive , ATmega169 , ATmega2560 , ATmega2561 , ATmega32 , ATmega323 , ATmega324 , ATmega325 , ATmega3250 , ATmega329 , ATmega3290 , ATmega406 , ATmega48 , ATmega48 Automotive , ATmega64 , ATmega640 , ATmega644 , ATmega645 , ATmega6450 , ATmega649 , ATmega6490 , ATmega8 , ATmega8515 , ATmega8535 , ATmega88 , ATmega88 Automotive , ATtiny11 , ATtiny12 , ATtiny13 , ATtiny15L , ATtiny2313 , ATtiny25 , ATtiny26 , ATtiny28L , ATtiny45 , ATtiny85

 

 

Проекты на микроконтроллерах AVR и PIC

Электронные устройства, Схемы, Прошивки, исходники

 

Новый! Владислав Шаповаловн. Продвинутые радио-часы/будильник с термометрами на графическом LCD.
Новый! Дмитрий Подколзин. Стенд для тестирования компьютерных АТХ блоков питания.
Новый! Одинец Александр Леонидович. Автономное 32-канальное программируемое светодинамическое устройство с последовательным интерфейсом.
Новый! Виталий Петренко, Александр Гаркавец. Цифровой вольтметр постоянного тока 0…..+100В.
Виталий Петренко, Александр Гаркавец. Частотомер - цифровая шкала КВ, УКВ с ЦАПЧ с восьмиразрядным индикатором 0,01 Гц - 1000 МГц.
Мосин Дмитрий. Часы на ATmega8.
Габидуллин Ильдар. Регулятор яркости лампы накаливания на микроконтроллере AT89C2051.
Павельчук Александр. Приставка на PIC для проверки телефонных аппаратов.
Ибрагимов Максим Рафикович. Простой VGA/Видео адаптер.
Независимая Группа Инженеров Астраханского Государственного Технического Университета. Черный ящик-2.
Красносельский Денис. Прибор для прозвонки многожильных кабелей.
Шабров Дмитрий. Комбинированный прибор радиолюбителя.
Фурсов Андрей, Мелихов Виктор. Пакетный FFSK-модем (rev.2.0).
Протопопов Александр Петрович. Жако - многофункциональный говорящий выключатель освещения с голосовым управлением..
Мирский Владислав. Программа-драйвер для ЖКИ на базе контроллера HD44780..
Новоселов Игорь. Устройство для выделения сигнала точного времени из радио «Маяк».
Бабанин Валерий Борисович. АЦП на стабилитронах (статья).
Протопопов Александр. Игровой автомат "Видеослот" с возможностью замены игр и встроенной защитой.
Шабров Дмитрий. Зарядное устройство для малогабаритных аккумуляторов с индикацией напряжения и тока.
Протопопов Александр. Часы с метеостанцией и дистанционным управлением.
Кокунин А. Датчики температуры DS18B20: исследования работы..
Борисевич Алексей. Цифровое устройство управления инкубатором.
Грицик Олег. Цифровой FM-приемник с электронной регулировкой громкости и тембра.
Шабров Дмитрий. Блок персонального вызова.
Александр Петрович Протопопов. Игровой автомат "Столб" с независимой системой игровых каналов.
Александр Петрович Протопопов. Устройство размена купюр для игровых автоматов.
Александр Петрович Протопопов. Многофункциональное устройство управления домашними приборами.
Буров Михаил. Часы-звонок с заменяемыми мелодиями.
Красносельский Денис Александрович. Стоп сигнал «Бегущие огни».
    Новый!Обновление проекта Стоп сигнал «Бегущие огни».
Шабров Дмитрий. Блок жизнеобеспечения аквариума.
Литовченко Алексей. Автономная охранная система на базе ТМ.
Широков Игорь Игоревич. Контроллер доступа "Tiny KTM".
Шабров Дмитрий. Автомбильный тахометр.
    Новый!Обновление проекта Автомобильный тахометр.
Шабров Дмитрий. Автомобильная сигнализация с радиоканалом, плавающим кодом и домашним комплектом для мониторинга состояния датчиков.
Александр Протопопов. Универсальный сенсорный выключатель с дистанционным управлением.
Александр Протопопов. Автоматический контроллер для просмотра стереоизображения.
Александр Протопопов. Евро-АОН "NEO" - конвертор в стандарт Caller ID (CLIP) для импортных радиотелефонов.
Дмитрий Фитисов. Timer on PIC16F628.
Александр Протопопов. Игровой автомат с системой "Джек Пот" и блоком дистанционного управления и контроля по мобильной связи.
Владислав Мирский. Часы с цифровой подстройкой хода.
Бабанин Валерий Борисович. Интерфейс RS-232 с возможностями SPI для микроконтроллерных систем
Черешнюк Виктор. Регулятор температуры для инкубатора
Александр Квашин. Цифровой термометр
    Новый!Обновление проекта Цифровой термометр.
Владислав Мирский. Калькулятор
Александр Корниленко. 16-канальный логический анализатор "ЛогикАн"
Шабронов Андрей Анатольевич. Фотосчетчик продукции транспортера
Нарчук Александр. Цифровой 4-х канальный регулятор для усилителя на TDA7313
Кияшко Владимир Анатольевич. Анемометр - измеритель скорости ветра
Владислав Мирский. Пианино
Юрис Гризанс. Генератор логических уровней
Вадим и Кирилл Красновы. Прибор для контроля за работой водителей. ("ЧЕРНЫЙ ЯЩИК")
Павел Дичин. Простой четырёхканальный зарядник на микропроцессоре PIC16F876
Александр Протопопов. Интеллектуальная автомобильная система с голосовыми меню и изменяемыми голосовыми сообщениями, предназначенная для дистанционного контроля датчиков охраны и других приборов, управления прогревом двигателя и бортовыми устройствами
Александр Протопопов. Программатор для записи голосовых сообщений в микросхему K9F3208W0A (Samsung)
Ридико Леонид Иванович. УМЗЧ ВВ с упрощённой системой управления
Пионер. Повышающий преобразователь напряжения на AVR
Ридико Леонид Иванович. УМЗЧ ВВ с микроконтроллерной системой управления
Ширяев Алексей Евгеньевич. Технический автоответчик
Альберт Екимов. Микропроцессорный блок управления стиральной машиной
Ридико Леонид Иванович. Контроллер шагового двигателя
Александр Протопопов. Коммуникатор — автоматическое устройство для обмена короткими текстовыми сообщениями
Александр Середовский. Таймер для загрузчика сырья в опытно-технологическую установку по производству антифрикционной присадки "Форум ©"
Анисимов Сергей Владимирович. Система сбора информации от удаленных объектов посредством интерфейса RS485
Владимир Попов. Таймер с выводом на TV, коммутацией Video, накоплением сумм времени и числа запусков
Ридико Леонид Иванович. Генератор прямоугольных импульсов на основе AVR
Сергей Смирнов. Программное дeкодирование DTMF по принципу АОН на базе микроконтроллера PIC16F628
Виктор Бачул. Определитель номера для цифровых АТС PERFECTA
Сергей Фролов. Устройство «ВИДЕОТЕКСТ FRS1.00»
Александр Елисеев. Как сделать простой модуль контроллера 10-и позиционного LED индикатора и IR пульта RC-5 на PIC16F627
Михаил Буров. Музыкальный звонок с заменяемыми мелодиями
Юрий Сафонов. Универсальный велосипедный путевой прибор на PIC контроллере
Ридико Леонид Иванович. Программатор термометра/термостата DS1821
Юрий Горский. Передача отладочной информации из PIC-контроллера через COM-порт
Юрий Сафонов. Бегущая строка на PIC контроллере
Игорь Коваль. Конвертер интерфейсов ИРПС -> RS485 с исправлением однократных ошибок
Ридико Леонид Иванович. Применение 7-сегментных ЖКИ – модулей
Александр Елисеев. Как сделать простой осциллограф двоичного сигнала на AVR
Александр Корниленко. Книгочей
Игорь Ткачук. CompuPIC
Александр Протопопов. Система автоматизации технологического оборудования
Коновалов В. А. Адаптер двухканального светового шнура
Ридико Леонид Иванович. Стабилизатор частоты вращения коллекторного двигателя
Ридико Леонид Иванович, Лапицкий Виктор Петрович. Электронный замок с ключами iButton
Евгений Солошенко. Контроллер двухцветного светового шнура Flexilight
Игорь Коваль. Электронные часы с будильником на микроконтроллере AT90S2313-10PI
Сергей Сергеев. Автоматический регистратор — выключатель освещения
Андрей Воробьёв. Маршрутный компьютер-тестер для автомобилей ВАЗ
Александр Елисеев. Как сделать простой программатор для PIC-ов и AVR-ов
Александр Фомин. Программатор для микроконтроллеров AT89C51/52/55
Сергей Ростовцев. Простой программатор
Ридико Леонид Иванович. Эмулятор ПЗУ — отладчик для MCS-51
Михаил Буров. Часы-будильник с ЖК-индикатором
Игорь Баранов, Константин Терпогосов. Метеотермометр MT-50
Олег Локсеев. Преобразователь и зарядное устройство в одном флаконе
Александр Протопопов. Устройство полной защиты ламп освещения
Артём Скворцов. 128-канальный аналоговый коммутатор
Александр Алехин. Бортовой компьютер М1.5.4. Версия 1.01
Ридико Леонид Иванович. Простая система настройки для УКВ ЧМ приёмника
Ридико Леонид Иванович. Имитатор touch-memory DS1990A
Ридико Леонид Иванович. Автомобильные часы-термометр-вольтметр
Ридико Леонид Иванович. Применение кода RC-5
Ридико Леонид Иванович. Низкочастотный синусоидальный генератор с шагом сетки 0,01 Гц
Александр Волович. Контроллер графического ЖКИ высокого разрешения
Олег Пушкарёв. Приёмник POCSAG кода
Александр Елисеев, Станислав Картонович. Как сделать автосигнализацию с бесконтактными ключами на PIC16C505 с использованием компилятора HI-TECH C 7.85
Алексей Кургузов. Многоточечный термометр
Олег Пушкарёв. Вывод бегущей строки на ЖКИ дисплей 2х24
Александр Протопопов. Сенсорный электронный регулятор громкости
Михаил Буров. Музыкальный звонок
Виктор Заикин. Двухканальный счётчик импульсов — Data Logger Z43001
Игорь Максимов. Универсальная цифровая шкала — частотомер с функцией ЦАПЧ
Игорь Максимов. Малогабаритный частотомер-цифровая шкала до 200 МГц с ЖКИ дисплеем
Дмитрий Александрович Лихачёв. 10BASE-2 Ethernet REPEATER (демо-версия)
Алексей Чумаков. Внутрисхемный SPI-программатор для Atmel At89S8252 на LPT порт
Леонид Иванович Ридико. Два микроконтроллерных регулятора мощности
Александр Алехин. «Индикатор М1.5.4»
Леонид Иванович Ридико. Цифровой термометр с датчиками DS1820 или DS1821
Леонид Иванович Ридико. Если Вы потеряли Touch Memory...
Гуревич Ф.А. Простейшее микропроцессорное устройство ввода-вывода
Александр Елисеев. Как сделать считыватель ЖК дисплея
Вячеслав Кулаков. Микро-АТС 1х5 и мини-АТС 2х8
Александр Протопопов. Игровая приставка для велотренажера
Александр Елисеев. Как сделать простой программатор с использованием DELPHI 5
Александр Протопопов. Устройство передачи абонентского номера телефона
Александр Елисеев. Как сделать простой радиобрелок с плавающим кодом, паролем и бегущими огнями
Александр Волович. Генератор сигналов произвольной формы
Андрей А. Левкин. Устройство «Бегущая строка»
Олег Пушкарёв. Часы на базе индикатора HT1610
Александр Елисеев. Как сделать простую систему бесконтактной идентификации
Александр Елисеев. Простой АОН для «PANAPHONE»
Александр Елисеев. Терморегулятор
Вячеслав Кулаков. Кодовый замок для телефонной линии (антипират)
Группа разработчиков Центра фотохимии РАН. Иономер И-500
Eвгений Гиль. Проигрыватель компакт-дисков на базе дисковода CD-ROM
Андрей Левкин. Датчик присутствия людей

 

 


AVR раз, два, три...   это просто!

действительно Краткий Курс !

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

 

Сайт управляется системой uCoz