Структурна схема виводів порта PORTВ показана на рисунку 2.7.
Примітки:
1. Виводи портів мають захисні діоди, підключені до VDD і Vss-
2. Для включення підтягаючих резисторів необхідно встановити в '1' відповідний біт TRIS і скинути в '0' біт -RBPU (OPTION_REG<7>).
а б
Рисунок 2.7 – Структурна схема виводів порта PORTВ
PORTC - 8-розрядний двонаправлений порт введення/виводу. Біти регістра TRISC визначають напрям каналів порту. Установка бита в '1' регістра TRISC переводить вихідний буфер в 3-й стан. Запис '0' в регістр TRISC настроює відповідний канал як вихід, вміст защіпки PORTC передається на виведення мікроконтролера (якщо вихідна защіпка підключена до виведення мікроконтролера).
Виводи PORTC мультипліковані з декількома периферійними модулями. На каналах PORTC присутній вхідний буфер з трігером Шмідта.
Коли модуль MSSP включений в режимі I2C, виводи PORTC<4:3> можуть підтримувати рівні вихідних сигналів по специфікації I2C або SMBus залежно від стану бита CKE(SSPSTAT<6>).
При використанні периферійних модулів необхідно відповідним чином настроювати біти регістра TRISC для кожного виведення PORTC. Деякі периферійні модулі відміняють дію бітів TRISC примусово настроюючи вивід на вхід або вихід. У зв'язку з чим не рекомендується використовувати команди "Читання - модифікація - запис" з регістром TRISC. Структурна схема виводів порта PORTС показана на рисунку 2.8.
а б
Рисунок 2.8 – Структурна схема виводів порта PORTC
Примітки:
1. Виводи портів мають захисні діоди, підключені до VDD і Vss. 2. Сигнал режиму каналу - вивід використовується периферійним модулем або цифровий порт введення/виводу.
3. Сигнал дозволу (ОЕ) від периферійного модуля, настроює канал як вихід.
PORTD - 8-розрядний двонаправлений порт введення/виводу.
Біти регістра TRISD визначають напрям каналів порту.
PORTD може працювати як 8-розрядний мікропроцесорний порт (ведений паралельний порт), якщо біт PSPMODE (TRISE<4>) встановлений в '1'. У режимі веденого паралельного порту до входів підключені буфери TTL. Структурна схема виводів порта PORTD показана на рисунку 2.9.
Рисунок 2.9 – Структурна схема виводів порта PORTD
PORTE має три виводи (REO/-RD/AN5, RE1/-WR/AN6, RE2/-
CS/AN7), що індивідуально настроюються на вхід або вихід. Виводи PORTE мають вхідний буфер Шмідта.
Канали PORTE стануть керуючими виводами веденого паралельного порту коли біт PSPMODE(TRISE<4>) встановлений в '1'.
У цьому режимі біти TRISE<2:0> повинні бути встановлені в '1'. У регістрі ADCON1 необхідно також настроїти виводи PORTE як цифрові канали введення/виводу. У режимі веденого паралельного порту до виводів PORTE підключені вхідні буфери TTL.
Виводи PORTE мультипліковані з аналоговими входами. Коли канали PORTE настроєні як аналогові входи, біти регістра TRISE управляють напрямом даних PORTE (читання даватиме результат '0'). Структурна схема виводів порта PORTЕ аналогічна схемі порта PORTD.
Контролер PIC16F877 має три багатофункціональні таймери. Кожен модуль таймера/лічільника може працювати окремо або входити складовою частиною в склад модулів спеціального призначення.
TMR0 - таймер/лічильник, має наступні особливості:
• 8-розрядний таймер/лічильник;
• Можливість читання і запису поточного значення лічильника;
• 8-розрядний програмований переддільник;
• Внутрішнє або зовнішнє джерело тактового сигналу;
• Вибір активного фронту зовнішнього тактового сигналу; • Переривання при переповнюванні (перехід від FFh до 00h).
Блок схема модуля TMR0 і загального з WDT переддільника показана на рисунку 2.10.
Рисунок 2.10 – Блок схема модуля TMR0
Примітка. Біти управління TOCS, TOSE, PS2, PS1, PSO, PSA розташовані в регістрі OPTION_REG.
Коли біт TOCS скинутий в '0' (OPTION_REG<5>), TMR0 працює від внутрішнього тактового сигналу. Приріст лічильника TMR0 відбувається в кожному машинному циклі (якщо переддільник відключений). Після запису в TMR0 приріст лічильника заборонений два наступні цикли. Користувач повинен скоректувати цю затримку перед записом нового значення в TMR0.
Якщо біт TOCS встановлений в '1' (OPTION_REG<5>), TMR0 працює
від зовнішнього джерела тактового сигналу з входу RA4/TOCKI. Активний фронт зовнішнього тактового сигналу вибирається бітом TOSE в регістрі OPTION_REG<4> (TOSE=0 - активним є передній фронт сигналу). Переддільник може бути включений перед WDT або TMR0, залежно від стану бита PSA (OPTION_REG<3>). Не можна прочитати або записати нове значення в переддільник.
Переривання від TMR0 виникають при переповнюванні лічильника, тобто під час переходу його значення від FFh до 00h. При виникненні переривання встановлюється в '1' біт TOIF(INTCON<2>). Само переривання може бути дозволено/заборонено установкою/скиданням біта TOIE (INTCON<5>). Прапор переривання від TMR0 TOIF (INTCON<2>) повинен бути скинутий в підпрограмі обробки переривань. У SLEEP режимі мікроконтролера модуль TMR0 вимкнений і не може генерувати переривання.
Якщо переддільник не використовується, зовнішній тактовий сигнал поступає безпосередньо на синхронізатор. Синхронізація TOCKI з таким сигналом мікроконтролера ускладнюється із-за опиту виходу синхронізатора в машинні цикли Q2 і Q4. Тому тривалість високого або низького логічного рівня зовнішнього сигналу повинна бути не менше 2Tosc (плюс невелика затримка внутрішнього RC ланцюга 20нс).
8-розрядний лічильник може працювати як переддільник TMR0 або вихідний дільник WDT. Для простоти опису цей лічильник завжди називатимемо «переддільник». Зверніть увагу, що існує тільки один переддільник, який може бути включений перед TMR0 або WDT. Використання переддільника перед TMR0 означає, що WDT працює без переддільника, і навпаки.
Коефіцієнт ділення переддільника визначається бітами PSA і PS2:PSO в регістрі OPTION_REG<3:0>.
Якщо переддільник включений перед TMR0, будь-які команди запису в TMR0 (наприклад, CLRF 1, MOVWF 1, BSF 1,х і т.д.) скидають переддільника. Коли переддільник підключений до WDT, команда CLRWDT скине переддільника разом з WDT. Переддільник також очищається при скиданні мікроконтролера. Переддільник недоступний для читання/запису.
Примітка. Запис в регістр TMR0 скине переддільника, якщо він підключений до TMR0, але не змінить його режиму роботи.
TMR1 - 16-розрядний таймер/лічильник, що складається з двох 8розрядних регістрів (TMR1H і TMR1L) доступних для читання і запису.
Рахунок виконується в спарених регістрах (TMR1H : TMR1L), інкрементуючи їх значення від 0000h до FFFFh, далі рахує з 0000h. При переповнюванні лічильника встановлюється в ‗1‘ прапор переривання
TMR1IF в регістрі PIR1<0>. Само переривання можна дозволити/заборонити установкою/скиданням, біта TMR1IE в регістрі Р1Е1<0>. Блок схема модуля TMR1 показана на рисунку 2.11.
Рисунок 2.11 – Блок схема модуля TMR1
Примітка. Якщо T1OSCEN=0, то інвертуючий елемент і резистивний зворотний зв'язок вимкнені для зменшення струму споживання.
TMR1 може працювати в двох режимах:
• Режим таймера; • Режим лічильника.
Включення модуля TMR1 здійснюється установкою бита TMR1ON в ‗1‘ (Т1СОМ<0>).
Бітом TMR1CS (T1CON<1>) вибирається джерело тактових імпульсів. У режимі таймера TMR1 інкрементується на кожному машинному циклі. Якщо TMR1 працює із зовнішнім джерелом тактового сигналу, то приріст відбувається по кожному передньому фронту сигналу.
TMR1 має внутрішній вхід скидання від модуля СРР .
Коли включений генератор тактових імпульсів (T1OSCEN=1), виводи
RC1/T1OSI/CCP2 і RCO/T1OSO/T1CKI настроєні як входи. Значення бітів TRISC<1:0> ігнорується, а читання даних з цих виводів дає результат '0'. Керуючі биті TMR1 знаходяться в регістрі T1CON (адреса 10h):
b7 b6 b5 b4 b3 b2 b1 b0
- - T1CKPS1 T1CKPS0 T1OSCEN -T1SYNC TMR1CS TMR1ONбіти 7-6: не реалізовані: читаються як '0';
біти 5-4: T1CKPS1:T1CKPS0: вибір коефіцієнта ділення переддільника TMR1 11 = 1:8, 10= 1:4, 01 = 1:2, 00=1:1;
біт 3:T1OSCEN: включення тактового генератора TMR1: 1 = генератор включений, 0 = генератор вимкнений (інвертуючий елемент і резистивний зворотний зв'язок вимкнені для
зменшення струму споживання);
біт 2: -T1SYNC: синхронізація зовнішнього тактового сигналу TMR1CS = 1
1 = не синхронізувати зовнішній тактовий, 0 = синхронізувати зовнішній тактовий,
TMR1CS = 0 : значення біта ігнорується;
біт 1: TMR1CS: вибір джерела тактового сигналу:
1 = зовнішнє джерело з виведення RCO/T1OSO/T1CKI (активним є передній фронт сигналу),
0 = внутрішнє джерело Fosc/4
біт 0: TMR1ON: Включення модуля TMR1: 1=включений,
0 = вимкнений.
В режимі таймера приріст походить від внутрішнього сигналу Fosc/4, коли біт TMR1CS (T1CON<1>) скинутий в '0'. У цьому режимі біт синхронізації T1SYNC (Т1СОМ<2>) ігнорується, тому що внутрішній тактовий сигнал завжди синхронізований.
В режимі лічильника TMR1 може працювати в синхронному або асинхронному режимі залежно від стані бита TMR1CS. Коли TMR1 використовує зовнішній тактовий сигнал, приріст таймера відбувається по передньому фронту. Включивши TMR1 в режим зовнішнього тактового сигналу рахунок почнеться тільки після появи заднього фронту.