PIC16C84 (Або PIC16F84) Фірми «Microchip« – Мініатюрний, але потужний мікроконтролер. Він заснований на EEPROM або «FLASH» технології, що дозволяє перепрограмувати його буквально за секунди. Типове кількість циклів перезапису – близько 1000. З його 18-ти висновків 13 можуть використовуватися як розряди введення / виведення загального призначення. Коли вони програмуються на висновок, то допускають струм «1″ до 20мА і струм «0″ до 25мА (більш ніж достатній для підключення, наприклад, світлодіодів). Це дозволяє розробляти на даному мікроконтролері прості й недорогі електронні пристрої і робить його ідеальним для бажаючих вивчити принципи роботи мікроконтролерів.

Цей короткий посібник призначено для людей, які тільки що зібрали або купили програматор для PIC мікроконтролера і хочуть переконатися, що обидва, програматор і мікроконтролер, працюють. Для цього спочатку необхідно володіти деякими знаннями про структуру і функціонування PIC мікроконтролера. Це цоколевка висновків (див. рис.):

Висновки RA * і RB * – це контакти введення / виведення, пов’язані з регістрами мікроконтролера PORTA і PORTB відповідно (RA4 також може бути використовуватися як вхід внутрішнього таймера, а RB0 може бути використаний як джерело переривань). VDD і VSS – висновки харчування (+ Uпит і GND відповідно). Серія 16 × 84 працює в широкому діапазоні живлячих напруг, але зазвичай VSS підключений до 0В, а VDD підключений +5 В. Виведення основного скидання / MCLR зазвичай підключений до VDD (безпосередньо або через резистор), тому що мікроконтролер містить надійну схему скидання при включенні харчування – все, що вам треба, мікроконтролер виконає сам. Висновки OSC1 і OSC2 підключаються до генератора тактової частоти і можуть бути налаштовані для різних його типів, включаючи режими кварцу і RC-генератора. Проста схема, яка використовується як база для проекту з використанням PIC16C84 представлена ​​на малюнку:

Більш наочна схема:

Схема містить RC-генератор і один висновок (RB4) підключений до індикатора. Це – все, що необхідно для роботи мікроконтролера. Charles Manning (Electronics Australia, April 1996) написав дивовижно коротку (6 слів) програму для мигання індикатора, яку ви можете використовувати з цією схемою:

LIST    P=16C84
;
MOVLW   0
TRIS    6
OPTION
LOOP    SLEEP
INCF    6, F
GOTO    LOOP
END

Ця програма написана для MPASM. Для використання програми ви повинні витягти її з цього файлу будь-яким редактором, зберегти в інший файл (наприклад LIGHTS.ASM), потім проассембліровать за допомогою MPASM (Використовуйте команду «MPASM LIGHTS.ASM«) Для отримання HEX файлу LIGHTS.HEX, який може бути завантажений в мікроконтроллер за допомогою програматора. Не звертайте уваги на зауваження MPASM про те, що використання регістрів TRIS і OPTION «Не рекомендується». Переконайтеся в тому, що сторожовий таймер «watchdog» включений і обраний RC-генератор. Якщо у вас ще немає MPASM, то тут представлений HEX-варіант наведеної вище програми:

:0C0000000030660062006300860A0328DE
:00000001FF

Програма використовує таймаут «watchdog» таймера як як джерело синхронізації для визначення моментів включення і виключення світлодіода; в результаті ви можете змусити світлодіод спалахувати з різною частотою, підключаючи його до різних розрядів порту PORTB (RB0-RB7, висновки 6-13). Це незвичайне використання «watchdog» таймера. Зазвичай «watchdog» таймер використовується, щоб упевнитися, що PIC веде себе відповідно до заданої програми, і, якщо ваша програма спеціально не налаштована для використання «watchdog» таймера, активізувати його було б великою помилкою. Проста програма LIGHTS використовує його для виходу з режиму “SLEEP” (тобто режиму «засипання»); при виході з цього режиму PIC збільшує вміст регістра PORTB, що змінює стан RB0-RB7 і знову переходить в режим «засинання» до наступного таймаута «watchdog» таймера. «Watchdog» таймер синхронізований внутрішнім RC генератором, який має однаковий період на всіх PIC мікроконтролерах, отже, використання «watchdog» таймера для операцій з часом гарантує, що тимчасові затримки будуть вимірюватися стабільно незалежно від конфігурації задає генератора мікроконтролера або використовуваної частоти (бажано, щоб частота становила хоча б кілька кГц). Ця властивість робить програму LIGHTS дуже зручною для початкового тестування більшості макетних плат для PIC. Схема може бути змінена для отримання значно більшої кількості ефектів шляхом додавання сведодіодов. Підключіть перший з них до висновку RB0 (контакт 6), другий – до RB1 (контакт 7), третій – до RB2 (контакт 8) і т.д. Найкращим варіантом є використання як мінімум чотирьох світлодіодів з збільшенням до восьми (останній підключити до RB7, тобто контакт 13). Кожен сведодіод підключається через резистор 470 Ом між ніжкою мікроконтролера і «землею». Наступна програма реалізує ефект «біжить вогню»:

; WALKLEDS.ASM

LIST P=16C84
;
PORTB   EQU     6
TRISB   EQU     86H
OPTREG  EQU     81H
STATUS  EQU     3
CARRY   EQU     0
RP0     EQU     5
MSB EQU 3; номер біта для крайнього зліва світлодіода
;
CLRF PORTB; погасити всі светодіди
BSF STATUS, RP0; вибрати регістровий банк 1
CLRF TRISB ^ 80H; встановити всі розряди PORTB на виведення інформації
MOVLW   0AH
MOVWF OPTREG ^ 80H; налаштувати попередній дільник в WDT на (1:4)
BCF STATUS, RP0; вибрати регістровий банк 0
INCF PORTB, F; включити крайній праворуч світлодіод
BCF STATUS, CARRY; очистити прапор CARRY
LEFT SLEEP; почекати таймаута WDT («watchdog» таймера)
RLF PORTB, F; зрушити вміст індикатора вліво
BTFSS PORTB, MSB; досягли крайньої лівої позиції?
GOTO LEFT; якщо ні – цикл
RIGHT SLEEP; почекати таймаута WDT
RRF PORTB, F; зрушити вміст індикатора вправо
BTFSS PORTB, 0; досягли крайньої лівої позиції?
GOTO RIGHT; якщо ні – цикл
GOTO LEFT; почати новий цикл
END

Проассембліруйте цю програму за допомогою MPASM для отримання її HEX подання:

:100000008601831686010A3081008312860A031056
:100010006300860D861D08286300860C061C0C28CC
:020020000828AE
:00000001FF

Програма «біжить вогонь» призначена для використання чотирьох світлодіодів, але ви можете змінювати значення MSB для використання більшої кількості світлодіодів: для кількості світлодіодів 5, 6, 7 і 8 значення MSB повинні бути 4, 5, 6 і 7 відповідно.

У програмі не використовуються команди TRIS і OPTIONS, які не рекомендовані до застосування фірмою MicroChip, тому що вони можуть не підтримуватися майбутніх мікроконтролерах. Таким чином, на відміну від попередньої програми, під час асемблювання НЕ будуть генеруватися попередження Для запобігання генерації MPASM’мом повідомлень про коректне використанні реєстрових банків необхідно інвертувати старший значущий біт в будь-якому адресі, приходящемся на банк 1 (наприклад, використовувати TRISB ^ 80H замість звичайного TRISB, де оператор «^» означає бітове «виключає АБО»). Це – одна з вивертів, які використовуються для придушення виведення попереджуючих повідомлень MPASM.

В якості заключного прикладу розглянемо програму, Когоро демонструє такі ж ефекти, як і програма WALKLEDS на 4-х світлодіодах. Ви зверніть увагу на те, що вона значно більше за обсягом і її не можна назвати прикладів ефективного програмування. Вона всього лише призначена для демонстрації декількох ключових ідіом і технологій PIC мікропроцесорів. Окрім іншого, вона містить обробник переривань, процедури запису і читання даних вбудованого FLASH EEPROM і демонструє, як в PIC реалізований принцип табличного пошуку. Програма містить приклади однією з найбільш зручних особливостей MPASM, такий як два види макрокоманд. Вона також показує, як скасувати задане за замовчуванням основу системи числення (шістнадцяткове) для чисел і як впровадити інформацію про конфігурацію мікроконтролера. Принаймні, за стилем вона більше нагадує «справжню» програму для мікроконтролера.

; PATTERN.ASM
; Програма розроблена для демонстрації процедур читання / запису даних EEPROM і обробки
; Переривань таймера. Таблиця значень записана в EEPROM процесор виконує «холостий»
; Цикл. Коли таймер переповнюється, відбувається переривання роботи процесора і наступне
; Значення таблиці зчитується з EEPROM і записується в порт B, тобто відображається на
; Світлодіодах. За допомогою змін у таблиці може бути зображений будь-який зразок довжиною до
; 64 значень.
;

; Copyright (C) 1997 David Tait (david.tait@man.ac.uk)

PROCESSOR 16C84
__CONFIG 03FF3; RC генератор

PCL     equ     2
STATUS equ 3; адреси стандартних регістрів
PORTB   equ     6
EEDATA  equ     8
EEADR   equ     9
INTCON  equ     0BH
OPTREG  equ     081H
TRISB   equ     086H
EECON1  equ     088H
EECON2  equ     089H

RP0     equ     5
Z       equ     2
GIE     equ     7
T0IE    equ     5
T0IF    equ     2
WREN    equ     2
WR      equ     1
RD      equ     0

# Define bank0 bcf STATUS, RP0; вибрати Bank 0
# Define bank1 bsf STATUS, RP0; вибрати bank 1

magic macro; »магічна» послідовність запису в EEPROM
movlw   55H
movwf   EECON2^80H
movlw   0AAH
movwf   EECON2^80H
endm

cblock 0CH; блок змінних
n_vals
n_tmp
endc

;**********************************;
; Основна точка входу в програму;
;**********************************;

org     0
goto    start

;**************************;
; Точка входу в переривання;
;**************************;

org     4

; Зазвичай вміст необхідно зберігати перед процедурою обробки переривання і
; Відновлювати після неї, але в даній програмі в цьому немає необхідності, тому що
; Процесор нічого не робить між перериваннями. Дивіться PIC datasheet для
; Рекомендованої процедури.

movf    EEADR,w
xorwf   n_vals,w
btfsc   STATUS,Z                ;EEADR == n_vals?
clrf EEADR; якщо так, то почати з нуля
call    ee_rd
movf EEDATA, w; читати EEPROM
movwf PORTB; відобразити байт
incf EEADR, f; нову адресу
bcf INTCON, T0IF; очистити прапор переривання
retfie

start   clrf    PORTB
bank1
clrf TRISB ^ 80H; всі розряди порту B на виведення
movlw   B’00000111′
movwf OPTREG ^ 80H; таймер 0 попередній дільник 256:1
bsf EECON1 ^ 80, WREN; дозволити запис в EEPROM
bank0
call ee_init; пересилання таблиці в EEPROM
bank1
bcf EECON1 ^ 80H, WREN; заборонити запис в EEPROM
bank0
bsf INTCON, T0IE; дозволити переривання від таймера
bsf INTCON, GIE; вирішити всі переривання

loop goto loop; »холостий» цикл

; ee_init
;
; Ініціалізація EEPROM з таблиці

ee_init clrw
call lut; отримати кол-во елементів в таблиці
movwf n_vals; і зберегти
movwf n_tmp; зберегти ще раз
clrf    EEADR
decf    EEADR,f                 ;EEADR = -1
ee_in1 incf EEADR, f; наступну адресу
movf    EEADR,w
addlw   1
call lut; отримати відповідне значення таблиці
movwf   EEDATA
call ee_wr; запис в EEPROM
decfsz n_tmp, f; є ще?
goto ee_in1; да
clrf EEADR; немає, завершити
return

; lut
;
; Перегляд таблиці

lut addwf PCL, f; додати W до PCL для получ. адреси ел-та таблиці
retlw D’12 ‘; число елементів в таблиці
retlw B’1000 ‘; перший елемент
retlw   B’1000′
retlw   B’0100′
retlw   B’0100′
retlw   B’0010′
retlw   B’0010′
retlw   B’0001′
retlw   B’0001′
retlw   B’0010′
retlw   B’0010′
retlw   B’0100′
retlw B’0100 ‘; останній елемент

; ee_wr
;
; Записати байт з EEDATA в EEPROM за адресою в EEADR. Переривання
; Повинні бути заборонені перед викликом ee_wr.

ee_wr   bank1
magic; виклик «чарівної» послідовності
bsf EECON1 ^ 80H, WR; почати запис
ee_wr1 btfsc EECON1 ^ 80H, WR; запис завершена?
goto ee_wr1; немає
bank0
return

; ee_rd
;
; Читати всі байт EEPROM з EEPROM за адресою EEADR в EEDATA

ee_rd   bank1
bsf EECON1 ^ 80H, RD; почати запис
bank0
return; при поверненні читання має бути завершено

end

Це HEX файл, сформований MPASM (запишіть його як PATTERN.HEX):

:020000000E28C8
:0800080009080C060319890127
:10001000442008088600890A0B110900860183160E
:10002000860107308100081583121C2083160811F1
:1000300083128B168B171B2800012C208C008D003F
:1000400089018903890A0908013E2C2088003A2089
:100050008D0B22288901080082070C3408340834EB
:1000600004340434023402340134013402340234DE
:1000700004340434831655308900AA30890088146A
:100080008818402883120800831608148312080079
:02400E00F33F7E
:00000001FF

При використанні мого програматора це може бути виконано за допомогою наступної
команди:

PP PATTERN.HEX                               (PP V-0.4)

TOPIC -G PATTERN.HEX                         (TOPIC V-0.2)

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