Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Стек і повернення із підпрограм



 

В мікроконтролерах PIC16C5X використовується дворівневий апаратний стек. Це означає, що він може зберігати водночас не більше двох адрес повернення.

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

При виконанні команди RETLW в програмний лічильник вивантажується вміст стека першого рівня. Водночас вміст стека другого рівня копіюється в стек першого рівня. Якщо виконуються більше двох команд RETLW одна за одною, в стеку обох рівнів буде записане значення другого рівня.

Робочий регістр W

 

Робочий регістр W містить другий операнд в двохоперандних командах і підтримує внутрішню передачу даних.

 

Порти вводу-виводу

Регістри вводу-виводу можуть керуватися, як будь-які інші регістри. Проте, команда "читання" (наприклад MOVF 6, W) завжди зчитує фактичний рівень сигналу на ніжці порту, незалежно від того, запрограмований цей розряд порту на ввід чи на вивід. Після сигналу "Скид" всі порти вводу-виводу встановлюються на "ввід" (електрично еквівалентно третьому стану), а керуючі регістри TRISA, TRISB та TRISC встановлюються в одиниці (конфігурація на ввід).

Для того, щоб сконфігурувати деякі лінії порту на вивід, необхідно встановити відповідні біти у потрібному TRIS регістрі в "0". Це можна робити командою "TRIS f".

Порт А є 4-бітним портом вводу-виводу. Використовуються тільки молодші 4 біти (RA0 – RA3). Старші 4 біти – завжди читаються як нулі.

Порт B є 8-бітним портом вводу-виводу.

Порт С для PIC 16C55/C57: 8-бітний порт вводу-виводу. Для PIC16C54/C56: внутрішній регістр загального призначення пам'яті даних (не порт).

Схема одного розряду (лінії) порту вводу-виводу наведена на рис. 2.7.

При операціях вводу порти не защепуються. Вхідний сигнал повинен бути присутній поки іде процес читання (наприклад, MOVF 6, W). При операціях виводу порти защіпуються і зберігають значення до тих пір, поки не будуть перезаписані. На рис. 2.7 не показані діоди, що захищають ніжку порту від зовнішніх імпульсів великої напруги. Вони обмежують імпульсну напругу на ніжці значеннями від Vss (0,6 В) до Vdd (+ 6 В).

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

Проблеми при організації двонаправлених портів.Деякі команди виконуються в режимі читання-модифікація-запис. Наприклад, команди BCF і BSF повністю читають порт, модифікують один біт і виводять результат назад. Тут необхідна обережність. Наприклад, команда BSF для біта 5 регістра f6 (порт В) спочатку зчитує всі 8 бітів. Після цього виконуються дії над бітом 5 і нове значення байта повністю записується у вихідні защіпки. Якщо другий біт регістра f6 використовується в якості двонаправленого вводу-виводу (скажімо біт 0) і в даний момент він визначений як вхідний, вхідний сигнал на цій ніжці буде зчитаний і записаний назад у вихідну защіпку цієї ж ніжки, стираючи її попередній стан. До тих пір, поки ця ніжка залишається в режимі вводу, жодних проблем не виникає. Проте, якщо лінія 0 переключиться пізніше в режим виводу, її стан буде невизначеним.

На вивід, що працює в режимі виходу, не повинні підключатися зовнішні навантаження за схемою "монтажне І" чи "монтажне АБО". Великі струми, що виникають при цьому, можуть пошкодити кристал.

 

 
 

 

 


Рис. 2.7. Схема одного розряду порту вводу-виводу PIC 16C5X

 

Послідовне звертання до портів вводу-виводу.Запис в порт вводу відбувається наприкінці командного циклу. Але при читанні, дані повинні бути стабільні на початку командного циклу. Будьте уважні в операціях читання, що відбуваються відразу за записом в той же порт. Тут потрібно враховувати інерційність встановлення напруги на виводах. Може знадобитись програмна затримка, щоб напруга на ніжці (залежить від навантаження) встигла стабілізуватися до початку виконання наступної команди читання.

 

Таймер/лічильник

 

На рис. 2.8 наведена спрощена структурна схема модуля таймера. Він може працювати в одному з 2-х режимів: таймера або лічильника.

Режим таймера вибирається встановленням в "0" біта TOCS (RTS) в 5-му розряді регістра ОРТION. В режимі таймера RTCC (TMRO) збільшується в кожному командному циклі (при відсутності попереднього дільника). Якщо відбувається запис в RTCC, то збільшення лічильника затримується на два наступних цикли виконання команди.

 
 

 

 


 

(TOSE) (TOCS)

 

 

TOCS, TOSE, PSA, PS2: PS0 – Біти регістра OPTION <6:0>.

 

Рис. 2.8. Структурна схема модуля таймера

 

Запис в RTCC повинен вестися з урахуванням цієї затримки. При необхідності перевірки регістра TMRO на нуль без впливу на процес лічення рекомендується користуватися командою MOVF TMRO, W.

 

Режим лічильника вибирається встановленням в "1" біта TOCS (ОРТION <5>). В цьому режимі вміст таймера збільшується по кожному перепаду 1/0 або 0/1 на виводі TOCKI. Перепад, що збільшує значення TMRO, вибирається бітом вибору фронту переключення TOSE (RTE) в регістрі ОРТION (<4>). Встановлення цього біта в "0" викликає збільшення RTCC по перепаду 0/1.

В регістр RTCC можна завантажити дані або зчитати з нього, як з будь-якого іншого регістра. Вміст цього регістра може бути інкрементовано фронтом зовнішнього сигналу, що надходить на вхід RTCC кристала, або внутрішнім сигналом синхронізації (CLKOUT = Fosc/4).

Структурна схема містить елемент MUX – це електронний перемикач (мультиплексор).

Для того, щоб 8-бітний попередній дільник приєднати до таймера/лічильника, потрібно встановити певним чином біт PSA і біти PS в регістрі Option. Регістр Option ‑ це спеціальний регістр (у нього немає адреси в пам'яті даних), але до нього можна звернутися за допомогою команди OPTION. Якщо попередній дільник підключений до таймера/лічильника (RTCC), то будь-які команди запису в самий RTCC (регістр f1, наприклад ClrF1 BSF1,5 ... і т.п.) очищають його.

Біт RTS (RTCC signal Source) в регістрі Option визначає джерело лічильних імпульсів (внутрішніх чи зовнішніх).

Коли RTS = 1:

Сигналом синхронізації для таймера/лічильника RTCC чи для попереднього дільника, якщо він підключений до RTCC, є сигнал, що надходить на вивід RTCC. Значення біта 4 (RTE) в регістрі Option визначає, чи відбувається лічення по задньому фронту (RTE = 1) або по передньому фронту (RTE = 0) сигналу на виводі RTCC.

Коли RTS = 0:

Регістр RTCC інкрементується за сигналом внутрішньої синхронізації CLKOUT (Tcy = Fosc/4). В цьому випадку значення біта RTE в регістрі Option і сигналу на виводі RTCC не мають значення. Проте вивід RTCC слідує підключити до Vdd або до Vss, як зручніше, щоб випадково не потрапити в режим тесту і забезпечити коректність в режимі пониженого споживання.

Доки на таймер/лічильник RTCC надходять синхроімпульси (не важливо зовнішні або внутрішні, підключений попередній дільник до RTCC чи ні), регістр f1 – RTCC інкрементується і при досягненні значення "FFH" скидається в 0. Після обнулення лічення продовжується.

Лічильні імпульси затримуються на два командних цикли. Наприклад, після запису інформації в RTCC, інкрементація його відбудеться через два командних цикли. Таке відбувається з усіма командами, що здійснюють запис або читання-модифікацію-запис f1 (наприклад, MOVF f1, CLRF f1). Якщо RTCC потрібно перевірити на рівність нулю без зупинки лічення, слідує використати інструкцію MOVF f1,W.

Попередній дільник представляє собою 8-бітний лічильник, який використовується як дільник частоти перед RTCC або після Watchdog таймера. Якщо дільник з'єднаний з RTCC, то він не може бути підключений до Watchdog таймера і навпаки. Біти PSA і PS0 – PS2 в регістрі OPTION визначають місце підключення дільника і встановлюють його коефіцієнт ділення.

Попередній дільник може підключатись по-різному. Коли він приєднаний до RTCC, всі команди, що здійснюють запис в RTCC (наприклад, CLRF 1, MOVWF 1, BSF 1, x... і т.д.) будуть водночас обнуляти і дільник. Коли дільник підключений до WDT, команда CLRWDT також обнулить дільник разом з Watchdog таймером. Підключення дільника – програмно керуєме. Щоб уникнути несанкціонованого сигналу "Скид" під час переключення дільника з RTCC на WDT, слід виконати певну послідовність команд:

1. MOVLW B`xx0x0xxx` ; Вибрати внутрішню синхронізацію

; і нове значення для дільника. Якщо

; нове значення дільника рівне "000"

; або "001", то треба тимчасово вибрати

; інше значення дільника.

2. OPTION

3. CLRF 1 ; Обнулити RTCC і дільник.

4. MOVLW B`xxxx1xxx` ; Вибрати WDT, не змінюючи

; значення дільника.

5. OPTION

6. CLRWD ; Обнулити WDT і дільник (Скид).

7. MOVLW B`xxxx1xxx` ; Вибрати нове значення для

; дільника.

8. OPTION

 

Пункти 1 і 2 вимагаються тільки тоді, коли до RTCC було підключено зовнішнє джерело. Пункти 7 і 8 необхідні тоді, коли в дільник вимагається завантажити величину 000 або 001.

Переключення дільника з WDT на RTCC необхідно здійснювати за допомогою наступної послідовності команд:

 

1. CLRWDT ; Обнулити WDT і дільник.

2. MOVLW B`xxxx0xxx` ; Вибрати RTCC, нове значення для

; дільника і джерело сигналу.

3. OPTION

 

Ця послідовність повинна бути виконана навіть у тому випадку, якщо сторожовий таймер WDT заборонений.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.