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 / тисячу двадцять-чотири = 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 файл - в ньому міститься прив'язка прошивки для МК до тексту програми на Сі для симуляторів!
ADC приклад для МК AT90S8535
Курс AVR "з нуля" на мові Сі - завдання 5
CodeVisionAVR C Compiler
Напруга на виводі AREF = 5.0V
Частота кварцу 3.69 МГц
Вимірюється напруга подається на висновок PA0
Результат (молодший байт!) Виводиться в PORTB
До бітам 0_4 PORTB підключені світлодіоди.
* /
#include <90s8535.h> / * Файл з описом "заліза" МК AT90S8535. Текст цього файлу просто буде вставлений замість цього рядка препроцесором компілятора перед компіляцією * /
#include
#define ADC_VREF_TYPE 0x00 / * тепер препроцесор всюди в тексті програми замінить "ADC_VREF_TYPE" на "0x00"
Директива #define - дуже потужна і зручна Вивчіть і застосовуйте її!
/ * Ми будемо перериватися по завершенні АЦ перетворення і виводити результат.
Потрібно написати функцію обробник цього
переривання - пишемо: * /
ADCW;
/ * Виводимо в PORTB результат АЦП.
Проаналізуємо цей рядок програми.
Регістру ADCW ви не знайдете в DataSheet але в компіляторі CVAVR ви можете використовувати його - це віртуальний 16 бітний регістр, він містить всі 10 біт результату - зручно, але можна використовувати і регістри з DataSheet, а саме: ADCL і ADCH
Далі йде операція:
- це інверсія: ОДИНИЦІ стають нулями і навпаки, нам потрібно це зробити, щоб "1" відповідав палаючий світлодіод - адже за схемою підключення він загоряється коли на ніжці МК "0"
Ще важливий момент: (unsigned char) - приведення типу даних - двухбайтное величину (ADCW - віртуальний. 16 бітний регістр існуючий тільки в "голові" компілятора КодВіжн!) Ми привели до типу беззнаковий символьний - це 8 біт - такий тип даних "полізе" в порт МК * /
delay_ms (20); / * затримка 20 мілісекунд
Увага. Не рекомендується використовувати паузи в обробнику переривання, якщо ви не контролюєте момент виникнення подій, що викликають переривання, і більше одного переривання а програмі.
ADCSR | = 0x40; // запустили наступне
// АЦ перетворення.
// почитайте DataSheet про регістрі ADCSR!
> // закриває дужка функції-
// обробника переривання
void main (void)
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 Також його потрібно включити до складу проекту: натисніть на "молоток-ключ-викрутка" - у вікні конфігурації проекту натисніть - Add - оберіть Atmega16.c - і "Відкрити" - тепер файл A8535.c в складі проекту, натиснемо "ОК" . Зробіть: Файл - зберегти все. Нам знадобляться всього 3 файлу з отриманих в процесі компіляції: Потрібно створити новий проект натискаємо: Project - New project з'явилося вікно "Create new project" подивіться уважно - воно містить кілька кроків конфігурації проекту - потрібно просто заповнити їх акуратно. step 1 - дамо ім'я нашого проекту ad_test.prj переконайтеся що він розташований у створеній нами теці! step 2 - вибір МК: AT90S8535 step 3 - відзначаємо третій пункт - файл A8535.cof step 4 - пишемо в верхньому полі назва файлу вихідного тексту на Сі A8535 __. c Сі натискаємо кнопку праворуч: "додати цей". Розгорніть вікно файлу проекту ad_test.prj - скелет проекту готовий! Тепер потрібно відкрити текстовий файл z5_start.txt який ми створювали на початку завдання. Ми описали в ньому на мові Емулятора схему пристрою на МК - тепер потрібно додати в нього кілька рядків з згенерованого емулятором файлу проекту: Вставте перед рядком "; Для викорис." Наступне: TARGET "a8535.hex"; емульованого прошивка МК COFF "a8535.cof"; файл містить прив'язку SOURCE "a8535 __. C"; исходник на Сі на який CLOCK 3.69meg; частота використовуваного кварцу ; --------------------------------------------- Тепер: Файл - зберегти все. Можна от`Білдіть проект - натисніть F9 Ось такий напис повинна вас порадувати: Все готово до прогону програми в емуляторі. Але перед запуском потрібно ще конфігурувати вікна на екрані ПК щоб зручно було спостерігати процес емуляції. Нам знадобляться вікна: · Control panel - на цій панелі переменнік для зміни напруги на вході АЦП і світлодіоди · Messages - всякі месагі кидає по ходу емуляції - розмістіть його внизу і зробіть низьким і широким. · Code - в цьому вікні ми побачимо наш исходник на Сі і рух програми по ньому в процесі роботи. У меню View можна подивитися які ще вікна доступні - а для чого вони почитати в Help. Натискаємо світлофор. Емулятор мудрує і лається: мовляв Сторожовий Таймер (собака в просторіччі) батенька повинна бути скинута! до включення! Любить він посваритися - але у нас ЦСЄ не використовується - подивіться файл з асемблерним лістингом програми (він в папці проекту в компіляторі) - там ось такий пунктик є:
Збережіть файл з вихідним тестом програми - натисніть на "дискетку".
A8535 __. C
A8535.hex
A8535.cof
Тепер в полі "Target file [HEX]" впишемо: A8535.hex
; вмісту [.hex] до коду в [__. c]
; сорентірован файл [.cof].
; це CodeVision додав `__` при компіляції
.TRACE; виводити отладочную інфо в вікні
; SCOPE - рожевим (див. HELP емулятора)
; Позначення електричних "контактів" -
; вузлів МК до яких можна "підключитися"
; емулятора: RESET, AREF, ACO, TIM1OVF
; PA0-PA7, PB0-PB7, PC0-PC7, PD0-PD7,
;
; __ета інформація довідкова - для
; кожного МК своя!
Peripherals - натисніть "+" A / D converter - будемо дивитися що в регістрах АЦП відбуватися буде.
Scope - віртуалний осцилографи - в ньому можна побачити напруга на вході АЦП - встановіть вертикальну шкалу 1 вольт на поділ.Схожі статті