Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Буклет Лабораторні роботи МСТЗІ

.pdf
Скачиваний:
69
Добавлен:
12.02.2016
Размер:
6.09 Mб
Скачать

UCR встановлений, то генерується запит на переривання«Прийом завершено». Скидається прапорець апаратно, при читанні регістра UDR.

ТСХ – прапорець завершення передачі. Даний прапорець встановлюється в 1 після передачі всіх розрядів слова (включно з стоп-бітом) з регістру зсуву передавача, при умові, що в регістр даних UDR не було завантажено нове значення. Якщо розряд ТХСІЕ регістраUСR встановлений, то

при встановлені прапорця ТХ генерується запит

на переривання«Передача завершена».

Прапорець скидається апаратно при виконанні

підпрограми обробки переривання або

програмно записом в нього логічної 1.

 

UDRE – регістр даних пустий. Даний прапорець встановлюється в 1 після пересилання байта з регістра даних UDR в регістр зсуву передавача. Встановлення цього прапорця означає, що

передавач

готовий до

отримання

нового значення для передачі. Якщо розряд UDRІЕ регістра

UСR встановлений, генерується

запит на переривання«Регістр

даних пустий». Скидається

прапорець

апаратно

при запису

в регістрUDR. Відповідно, в

обробнику переривання слід

обов’язково записати в цей регістр, інакше після завершення обробки переривання воно буде викликано знову.

FE – прапорець помилки кадрування. Даний прапорець встановлюється в1, якщо стоп-біт прийнятого слова рівний 0. Прапорець скидається при прийомі стоп-біта, рівного 1.

OR – прапорець переповнення. Даний прапорець встановлюється в1, якщо в регістрі зсуву приймача знаходиться нове прийняте слово, а старий вміст регістраUDR не прочитаний. Прапорець залишається встановленим, поки не буде прочитаний регістрUDR. Прапорець скидається при пересиланні прийнятих даних з регістру зсуву приймача в регістр UDR.

Дані, що передаються і приймаються зберігаються в регістрі данихUDR (UART Data

Register). Фізично регістр UDR складається з

двох окремих регістрів, один з яких

використовується для передачі

даних, інший – для

прийому. При читанні

регістраUDR

виконується звертання до регістра

приймача, при запису – до регістра передавача.

 

Передача даних

Функціональна схема передавача модуля UART наведена на Рис. 8.

 

 

 

 

 

 

 

 

 

 

 

 

Скид

 

 

Переривання

 

Переривання

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Регістр даних передавача

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

UDRE

 

UDRIE

 

TXC

 

TXCIEN

 

 

 

 

 

 

 

 

 

UDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"1"

 

 

 

 

 

 

 

 

 

 

Встановлення

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"0"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10(11)-бітний регістр

 

 

 

 

 

 

 

 

 

 

 

 

PD1/TxD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

зсуву

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Тактовий

 

 

 

 

 

TXEN

 

 

 

 

 

 

 

CHR9

 

 

TXB8

 

 

 

генератор

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 8. Модуль UART МК AT90S2313 в режимі передачі

Робота передавача дозволяється встановленням в1 розряду TXEN регістра UCR. Якщо розряд скинутий, вивід PD1/TxD може використовуватись як лінія вводу/виводу загального призначення. При встановлені розрядуTXEN цей вивід підключається до передавачаUART і починає працювати як вихід незалежно від стану розряду DDD1 регістра DDRD.

Передача ініціалізується записом даних в регістр данихUART – UDR. Після цього дані пересилаються з регістра UDR в регістр зсуву передавача.

Після пересилки вмісту регістраUDR в регістр зсуву прапорецьUDRЕ регістра USR встановлюється в 1, що означає готовність передавача до отримання нового значення. В цьому стані прапорець залишається до нового запису в регістрUDR. Одночасно з пересиланням формується службова інформація: 0-й розряд регістру зсуву скидається в0 (старт-біт), а 9(10)-й розряд встановлюється в 1 (стоп-біт). Якщо включений режим передачі9-розрядних даних, то

60

значення розряду TXB8 регістра UСR копіюється в 9-й розряд регістру зсуву.

Після завантаження регістру зсуву його вміст починає зсуватися вправо і поступати на вивід ТхD в наступному порядку: старт-біт, дані (починаючи з молодшого розряду), стоп-біт. Зсув здійснюється по тактовому сигналу від контролера швидкості передачі. Якщо під час передачі в регістрUDR було записано нове значення, то після передачі стоп-біта воно пересилається в регістр-зсуву. Якщо до моменту закінчення передачі стоп-біту такого запису виконано не було, встановлюється прапорець завершення передачі ТХС регістра USR.

 

Прийом даних

 

 

Функціональна схема приймача модуля UART наведена на Рис. 9.

 

Прийом

даних дозволяється встановленням

розрядуRXEN регістру

UCR. При

встановлені

розряду RXEN цей вивід підключається

до приймачаUART

і починає

функціонувати як вхід незалежно від стану розряду DDD0 регістра DDRD.

 

Схема попередньої обробки опитує вхід приймача з частотою, в 16 раз більше швидкості передачі даних (для обробки одного розряду вхідної послідовності проводиться16 вибірок

сигналу). Виявлення

логічного 0

в режимі очікування інтерпретується

як

поява

переднього

(спадаючого) фронту

старт-біту.

Після цього перевіряється значення8-ї,

9-ї

і 10-ї

вибірок

вхідного сигналу. Якщо значення хоча б двох вибірок з вказаних рівне1, старт-біт вважається хибним (завада), а приймач переходить в стан очікування. Інакше вважається, що виявлений старт-біт нової послідовності.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Переривання

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Регістр даних приймача

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RXCIEN

 

 

RXC

 

FE

 

OR

 

RXB8

 

 

 

 

 

 

 

 

 

 

 

UDR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PD0/RxD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10(11)-бітний регістр

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

зсуву

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

RXEN

 

 

 

Тактовий

 

 

 

 

 

 

 

CHR9

 

 

 

 

 

 

 

 

 

 

 

 

 

генератор

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 9. Модуль UART МК AT90S2313 в режимі прийому

Після виявлення старт-біта починається обробка розрядів слова даних. Рішення про значення прийнятого розряду приймається також по результатам8-ї, 9-ї і 10-ї вибірок вхідного сигналу. Станом розряду вважається логічне значення, яке було отримано принаймі в двох з трьох вибірок. По мірі розпізнавання розрядів, вони поміщаються, зсуваючись вліво, в регістр зсуву приймача.

Розпізнавання стоп-біта проводиться також по трьом вибіркам вхідного сигналу. Стопбіт вважається прийнятим, якщо значення хоча б двох з трьох вибірок рівне 1. Інакше фіксується

помилка кадрування і прапорець FE регістра USR встановлюється в 1.

 

Незалежно від того був чи не був

виявлений стоп-біт в кінці прийнятої , посилки

прийняте слово пересилається в регістр данихUDR і встановлюється прапорець RXC регістра

USR. При обміні 9-розрядними

даними 9-й розряд прийнятого слова завантажується в розряд

RXB8 регістра UCR при пересилці вмісту регістру зсуву приймача в регістр даних.

 

Якщо нове слово буде прийняте до того, як з регістраUDR будуть зчитані попередні

дані, виникає переповнення і встановлюється

прапорецьOR регістра USR. Скидається

цей

прапорець тільки після звертання до регістра даних.

 

Управління швидкістю

прийому і

передачі здійснюється контролером

швидкості

передачі, який є звичайним дільником частоти. Швидкість передачі залежить від вмісту регістра UBRR (UART Baud Rate Register). Швидкість визначається наступним виразом:

61

BAUD =

fCLK

,

16 × (UBRR +1)

де BAUD – швидкість передачі (в біт/сек); fCLK – тактова частота МК, Гц; UBRR – вміст

регістру контролера швидкості передачі (0…255).

Існує ряд значень швидкості передачі даних, які є по суті, стандартними: 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 76800, 115200 біт/сек.

Оскільки при збільшені похибки завадостійкість передачі знижується, швидкості передачі, які мають помилку більше1% при заданій тактовій частоті, використовувати не рекомендується.

У GSM-модемах як і в персональних комп’ютерах використовується асинхронний спосіб передачі і лише частина сигналів, передбачених стандартом RS-232. При передачі даних по RS232 логічна одиниця кодується напругою від -5 до -15 В на стороні передавача і від-3 до -15 В на стороні приймача, а логічний нуль – напругою від 5 до 15 В на стороні передавача і від 3 до 15 В на стороні приймача (Рис. 10.а).

Тому потрібна мікросхема, яка б здійснювала узгодження рівнівRS-232 та сигналів МК (для якого типові значення лог. нуля - від 0 до 0.8 В, лог. 1 – від 2.4 до 5 В). Це можуть бути спеціалізовані мікросхеми MAX232 фірми Maxim або ADM232A фірми Analog Devices (Рис. 10. б). Мікросхеми містять перетворювач напруги+5 В у напругу ±10 В і забезпечують швидкість передачі даних до 200 Кбіт/с.

Типова схема спряження МК та ADM232A наведена на Рис. 11.

Сторона Сторона приймача передавача

+15 В

 

Низький рівень,

+15 В

 

 

 

 

 

 

 

 

 

 

 

 

лог.

0

 

 

 

+5 В

+3 В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-3 В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-5 В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Високий

 

рівень,

 

 

 

 

 

 

 

 

 

-15 В

 

 

 

 

 

 

лог.

1

 

 

 

-15 В

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а)

 

 

 

 

 

 

б)

Рис. 10. Логічні рівні в стандарті RS-232 (а) та мікросхема ADM232A

для спряження МК з інтерфейсом RS-232 (б)

62

Рис. 11. Спряження МК AT90S2313 з GSM-модемом

2. Написання програм для мікроконтролерів на мові С

Для написання програм для мікроконтролерів все більшу популярність набуває мова. С При її використанні скорочується час розробки, що особливо помітно при написанні великих програм, забезпечується можливість перенесення коду на інші платформи. Недоліком мови С у порівнянні з мовою асемблера є більший об’єм коду, які наслідок, менша швидкість роботи програми.

Існує ряд компіляторів С, які підтримують архітектуру AVR: CodeVisionAVR, ImageCraft C, AVR GCC, IAR та інші, які включають в себе широкий набір бібліотек для роботи з периферійними пристроями.

Знайомство з середовищем CodeVisionAVR

CodeVisionAVR – це інтегроване середовище розробки програмного забезпечення для AVR мікроконтролерів на мові С.

Крос-компілятор CodeVisionAVR містить майже всі елементи стандартуANSI C, з додатковими можливостями для підтримки AVR архітектури. Скомпільований об’єктний COFFфайл дозволяє вести відладку на рівні мови С з використанням відладчика AVR Studio.

Окрім стандартних С бібліотек, CodeVisionAVR C компілятор має спеціальні бібліотеки для символьних LCD модулів, I2C шини, 1-Wire протоколу, SPI шини, управління енергоспоживанням, формуванням часових затримок та ін.

Створення нового проекту в CodeVisionAVR

Створити новий проект можна через пункт меню File|New або через натискання кнопки Create new file на панелі інструментів.

В діалоговому вікні (Рис. 12.a) потрібно вибрати пункт File Type|Project та натиснути кнопку ОК.

а) б)

Рис. 12. Створення нового проекту в CodeVisionAVR

63

Появиться діалогове вікно підтвердження (Рис. 12.б), в якому потрібно відмовитися від використання CodeWizardAVR для створення нового проекту натиснувши кнопку No.

При цьому появиться діалогове вікноCreate New Project (Рис. 13), в якому потрібно вказати назву файлу проекту та його розташування. Файли проекту мають розширення .prj.

Рис. 13. Вікно вибору назви та розташування проекту

Якщо проект вже був створений його потрібно відкрити використовуючи пункт меню

File|Open.

Створення нового файлу

Для створення файлу з текстом програми(.с), заголовочного файлу (.h) чи будь-якого іншого виберіть пункт менюFile|New або натисніть кнопкуCreate new file на панелі інструментів.

Удіалоговому вікні (Рис. 12.а) потрібно вибрати пункт File Type|Source та натиснути кнопку ОК.

Уредакторі відкриється новостворений файл з іменем untitled.c. Цей файл потрібно

зберегти під новим іменем(та розширенням – якщо потрібно) використавши пункт меню File|Save As (Рис. 14). Проект повинен мати хоча б один файл з розширенням .с.

Рис. 14. Вікно збереження файлів проекту

Налаштування проекту Додавання файлів до проекту

Щоб додати файл до проекту виберіть пункт меню Project|Configure та у вікні що появиться перейдіть на вкладку Files (Рис. 15).

64

Рис. 15. Вікно додавання файлів у проект

Щоб додати файл з текстом програми до проекту натисніть кнопкуAdd. Перший файл доданий до проекту є головним (main) файлом програми, з якого починається компіляція.

Далі потрібно налаштувати параметри проекту – для цього перейдіть на вкладку С Compiler у тому самому вікні (Рис. 16).

У полі Chip виберіть МК для якого створений проект, в полі Clock можна задати тактову частоту МК.

Рис. 16. Вікно конфігурації проекту та параметрів компілятора

Поле Optimize for: дає змогу вибрати один з типів оптимізації програми: Size або Speed. Якщо вибрано Size компілятор буде намагатися побудувати програму мінімального розміру, якщо вибрано Speed то пріоритетом буде максимальна швидкість виконання програми.

Також в полях SRAM можна змінювати розміри системних ділянок оперативної пам’яті (стеку даних та нерозподіленої пам’яті) у відповідності з потребами програми.

Після того як вихідний файл доданий до проекту можна починати писати в ньому програму. Процес написання програми для МК майже нічим не відрізняється від написання звичайних програм на мові . СТому надалі коротко розглянемо лише основні моменти та

65

спеціальні можливості додані для підтримки AVR архітектури.

Препроцесор

Директиви препроцесора дають змогу:

-включати текст з інших файлів, які містять бібліотеки та прототипи функцій користувача;

-визначати макроси;

-проводити умовну компіляцію для збільшення портативності програми.

Для включення іншого файлу у ваш вихідний файл використовується директива #include. Можна підключати до 16 зовнішніх файлів.

Для кожного типу мікроконтролера в програму повинен бути включений заголовочний файл, який містить оголошення назв регістрів, номерів переривань і т.п. Наприклад, для МК AT90S2313 цей файл носить назву 90S2313.h:

#include <90S2313.h>

Директива #define використовується для визначення макроса. Наприклад

#define ALFA 0xFF

Перед компіляцією препроцесор замінить у вихідному файлі всі ALFA значенням 0xFF.

Типи даних

CodeVisionAVR C компілятор підтримує наступні типи даних:

Тип

Біт

Діапазон

Тип

Біт

Діапазон

bit

1

0 , 1

 

unsigned int

16

0 до 65535

char

8

-128

до

127

signed int

16

-32768

до 32767

unsigned char

8

0 до 255

long int

32

-2147483648

до 2147483647

signed char

8

-128

до

127

unsigned long int

32

0 до 4294967295

int

16

-32768

до

32767

signed long int

32

-2147483648

до 2147483647

short int

16

-32768

до

32767

float

32

±1.175·10-38 до ±3.402·1038

Визначення типів даних

Типи даних користувача оголошуються з допомогою зарезервованого словаtypedef. Наприклад:

typedef unsigned char byte;

 

byte count;

// Оголошення змінної типу byte

Функції

Оголошення прототипу функції здійснюється відповідно до синтаксису мови С і містить інформацію про параметри функції. Наприклад

int my_func(char par1, int par2, long par3);

Визначення функції містить її код: int my_func (char par1, int par2, long par3)

{

return (par1 * par2 – par3);

};

Параметри функцій передаються через стек даних(Data Stack). Значення функції повертається в регістрах R30, R31, R22 та R23 (від молодшого до старшого байту).

Використання переривань

Доступ до системи переривань здійснюється з використанням зарезервованого слова interrupt. Функція обробки переривання відрізняється від звичайної функції тим, що починається

з слова interrupt, після якого вказується номер вектора переривання. Приклад:

interrupt [2] void external_int0(void) // П/п обробки зовнішнього переривання по входу INT0

{

66

PORTB.LED = 1;

// Включити світлодіод

};

Нумерація векторів переривань починається з 1 (вектор RESET – головна функція main). Решта номерів – відповідно до документації на вибраний . МКНомера переривань МК AT90S2313 можна подивитися у файлі 90S2313.h.

Компілятор автоматично зберігає/відновлює вміст всіх регістрів, що використовуються в підпрограмі переривання, при вході/виході у функцію. Компілятор також вставляє асемблерну команду RETI в кінці функції переривання.

Функція переривання не може повертати значення чи приймати параметри.

 

Глобальні змінні

 

Глобальні змінні – це

змінні оголошені

поза

будь-якими функціями. Перевагою

глобальних змінних є ,тещо

вони доступні в

будь-якій

точці програми і їх не потрібно

передавати функціям у вигляді параметрів. Особливо зручно їх використовувати у функціях обробки переривань, які не можуть приймати параметрів та повертати значень.

С-компілятор генерує так званийGlobal Variables Memory Map File, в якому вказуються адреси глобальних змінних вSRAM, регістри які використовуються для зберігання глобальних змінних та розмір самих змінних. Цей файл має розширення .map і може бути переглянутий використовуючи команду меню File|Open.

Вказівники

Внаслідок Гарвардської архітектури AVR мікроконтролерів, з розділеними адресними просторами для даних (SRAM), програми (FLASH) та EEPROM пам’яті, компілятор підтримує три типи вказівників Синтаксис оголошення вказівника:

[<type storage modifier>] type * [<pointer storage modifier>][* [<pointer storage modifier>] ...] pointer_name;

або

type [<type storage modifier>] * [<pointer storage modifier>][* [<pointer storage modifier>] ...] pointer_name;

Доступ до змінних розташованих SRAMв здійснюється з допомогою звичайних вказівників. Для доступу до констант у FLASH пам’яті використовується модифікатор flash. Для доступу до змінних у EEPROM пам’яті використовується модифікатор eeprom.

За замовчуванням вказівники розташовуються у SRAM пам’яті.

// Вказівник на символьний рядок в SRAM

char *ptr_to_ram=”This string is placed in SRAM”; // Вказівник на символьний рядок в FLASH

flash char *ptr_to_flash1=”This string is placed in FLASH”; char flash *ptr_to_flash2=”This string is also placed in FLASH”;

//Вказівник на символьний рядок розташований в SRAM. Вказівник зберігається в FLASH char * flash flash_ptr_to_ram=”This string is placed in SRAM”;

//Вказівник на символьний рядок розташований в FLASH. Вказівник зберігається в FLASH flash char * flash flash_ptr_to_flash=”This string is placed in FLASH”;

//Вказівник на символьний рядок розташований в FLASH. Вказівник зберігається в EEPROM flash char * eeprom eeprom_ptr_to_flash=”This string is placed in FLASH”;

//Вказівник на символьний рядок розташований в EEPROM. Вказівник зберігається в EEPROM eeprom char * eeprom eeprom_ptr_to_eeprom="This string is placed in EEPROM";

Для збільшення ефективності коду використовуються різні моделі пам’яті з різними розрядностями вказівників. Модель пам’яті TINY використовує 8 біт для збереження вказівників на змінні в SRAM. В цій моделі пам’яті є доступ лише до перших 256 байт в SRAM. Модель пам’яті SMALL використовує 16 біт для збереження вказівників на змінні вSRAM. В

цій моделі пам’яті є доступ до 65536 байт в SRAM.

В обох моделях TINY та SMALL вказівники на FLASH-пам’ять використовують 16 біт. У всіх моделях пам’яті вказівники на EEPROM-пам’ять мають 16 біт.

67

Доступ до регістрів вводу-виводу

Адреси регістрів вводу-виводу є визначені у відповідних заголовочних , файлах розташованих в ..\INC директорії. Для МК AT90S2313 цей файл називається90S2313.h. Заголовочний файл, для конкретної моделі МК повинен бути включений на початку програми.

В програмі можна звертатися до регістрів МК по імені. Наприклад

void main (void)

{

unsigned char a;

a = PINВ; // Прочитати стан входів порта В

TCNT1 = 0x1111; // Записати в регістр лічби таймера Т1 значення 0х1111

}

Доступ до регістрів вводу-виводу можна здійснювати також на рівні окремих . бітів Доступ на бітовому рівні до регістрів вводу-виводу здійснюється з використанням селектора(.) після імені регістра. Наприклад

void main(void)

 

{

 

DDRВ.0 =1;

// Встановити вивід РВ0 порта В як вихід

PORTD.5 =1;

// Встановити біт 5 PORTD в 1

if (PINВ.1 == 1)

 

{/* ....... */}

 

}

 

Для покращення зрозумілості програми використовують символічні імена для бітів регістрів вводу-виводу директивою #define.

#define Alarm_Input PINB.2

// Перевірка другого біта if (Alarm_Input)

{ /* ………. */ }

Організація статичної пам’яті даних (SRAM)

Скомпільована програма для МК AT90S2313 має наступний розподіл пам’яті (Рис. 17).

Рис. 17. Розподіл ОЗП для МК АT90S2313 при компіляції С-програм

68

Стек даних (Data Stack) використовується для зберігання локальних змінних програми і передачі параметрів при викликах/поверненнях з функцій. Апаратний стек (Hardware Stack) використовується для зберігання адреси повернення та поточних значень регістрів при виклику функцій та переривань. Нерозподілена пам’ять (Heap) використовується для динамічного виділення пам’яті під змінні.

Використання асемблерних команд в програмі

Для використання в програмі асемблерних команд служать директиви#asm та #endasm. Наприклад:

#asm nop inc r22

#endasm

Однорядкові асемблерні команди можуть використовуватися у вигляді

#asm("sei")

Регістри R0, R1, R22, R23, R24, R25, R26, R27, R30 та R31 можуть вільно використовуватися у функціях в асемблерних командах. Якщо ці регістри використовуються в функціях обробки переривань програміст повинен сам зберегти вміст цих регістрів при вході та відповідно відновити вміст при виході з функції.

Зауваження

Для зменшення розміру програми та збільшення швидкодії потрібно дотримуватися наступних правил:

-по можливості використовувати беззнакові змінні;

-використовувати типи даних, як можна меншого розміру, тобто bit та unsigned char;

-якщо можливо використовувати модель пам’яті TINY;

-завжди зберігати символьні константи у FLASH-пам’яті використовуючи модифікатор flash;

-критичні щодо часу виконання фрагменти програми реалізувати на мові асемблера.

 

Бібліотечні функції CodeVisionAVR

Перед використанням функцій стандартних бібліотек мови С потрібно включити

відповідні заголовочні файли директивою #include. Наприклад

#include <math.h>

// Для функції abs()

#include <stdio.h>

// Для функції puts()

Функції вводу-виводу

Прототипи цих функцій знаходяться в файліstdio.h, який повинен бути підключений директивою #include перед їх використанням.

Функціями найнижчого рівня вводу-виводу є:

char getchar(void) – повертає символ прийнятий з UART, використовуючи полінг. void putchar(char c) – передає символ c через UART, використовуючи полінг.

Перед використанням цих функцій потрібно:

-ініціалізувати швидкість передачі через UART;

-дозволити передачу через UART;

-дозволити прийом через UART.

 

Всі функції вводу-виводу високого рівня використовують getchar() та putchar().

void

puts(char *str) – виводить, використовуючи putchar(), символьний рядок str

доповнений

символом нового рядку (0х0А). Рядок str розташований в SRAM.

 

void

putsf(char flash *str) – виводить, використовуючи putchar(), символьний

рядок str

доповнений символом нового рядку (0х0А). Рядок розташований в FLASH.

 

69