Глава 4
4.1. PIC16F84 Главно описание на PIC16F84
PIC16F84 е евтин, високоскоростен, компактен, 8-битов микроконтролер. Всички микроконтролери от фамилията PIC16/17 използват съвременната RISK архитектура. PIC16FXX има подчертана активна зона, 8-битов стек и източници на прекъсване, които са външни и вътрешни. Вътрешната архитектура, отделните инструкции и база данни позволяват 14-битови инструкции да се предават по 8-битови шини. Двуфазният инструкционен съобщителен канал разрешава всички инструкции да бъдат изпълнени в един цикъл, изключвайки програмните прекъсвания, които изискват два цикъла.
По този начин микроконтролерът PIC16F84 постига компресия на кода 2:1 и се увеличава два пъти скоростта спрямо другите микроконтролери от този клас.
PIC16F84 има 64B RAM, 64B EEPROM памет за данни и 13 входно/изходни пина. Има вграден таймер/брояч и възможност за външен такъв.
Микроконтролерите от тази фамилия, чрез своята архитектура позволяват значително да се намалят външните компоненти, като по този начин се намалява цената и консумираната мощност и се повишава системната надеждност.
Ниската цена, ниската консумация, съвременната архитектура,лесното използване входно/изходната гъвкавост правят PIC16F84 подходящ за множество сфери на приложение.
Характерна особеност на този микроконтролер е факта, че има електрически програмируема памет, което позволява многократното записване и изтриване на данни и програми. Това го прави приложим при проектирането на устройства, в които ще се използват еднократно програмируеми микроконтролери от същата фамилия.
Архитектура на PIC16F84
Микроконтролерът отделно памет за данни и отделно програмна памет. Това обуславя и разделянето на шината за памет на две – една за данни и една програмна. Разделянето на паметта позволява инструкциите да бъдат с размерност различна от 8 бита (данните са 8-битови, а инструкциите 14-битови).
Цялата програмна памет е вътрешна и е с обем 1к х 14. PIC16F84 има 64 х 8 SRAM и 64 х 8 EEPROM памет за данни. Той съдържа още, едно 8-битово аритметично-логическо устройство (АЛУ) и работен регистър (W). АЛУ изпълнява аритметичните операции и булеви функции между данните в работния регистър и кой да е регистър.
Работния регистър е 8-битов, адресируем регистър и се използва за АЛУ операции. В зависимост от изпълнението на инструкциите, АЛУ може да въздейства върху три бита от STATUS регистъра : C-carri, DC-digit carri и Z-zero. Този регистър съдържа още битове за състоянието на АЛУ, за захранването и битове за избор на част от паметта за данни.
Друга съставна част от архитектурата е Stack-ът. Той представлява 8-нивова, 13 битова твърда памет. Пространството на тази памет не е нито част от програмната, нито от паметта за данни.
За да може да се осъществява обмен на данни между различни устройства са предвидени входно/изходни портове. Те са два – PORTA и PORTB. Някои от портовите пинове изпълняват алтернативни функции за други свойства на устройството.
Организация на паметта
В PIC16F84 има два блока памет. Те са програмна памет и памет за данни, като всеки блок има своя собствена шина,така че достъпът до всеки от тях може да стане по време на кой да е цикъл.
Организация на паметта за данни
Паметта за данни е разделена на две части, които съдържат регистър за различни цели (GPR) и специален функционален регистър (SFR). Съответната част се избира чрез установяване или нулиране на съответните битове в регистъра STATUS. Първите 12 позиции на всяка част са запазени за SFR. Останалите са за GPR изпълнени като статична RAM.
Паметта за данни също съдържа EEPROM памет, която е обозначена индиректно. Това е един индиректен адресен показалец показващ адресите в паметта за данни при четене/запис (R/W). Този показалец е съвкупност от четири регистъра със специално предназначение: EECON1, EECON2, EEDATA, EEADR.
Регистър EEDATA съдържа осем битови данни, които ще се четат или записват.
Регистърът EEADR се използва за адресиране и може да адресира 256B. Само първите 64B на EEPROM паметта за данни са реализирани. Старшите два бита са адресно декодирани, т. е. тези два бита трябва винаги да бъдат нулирани за осигуряване на адрес в 64 байтовото паметно пространство.
Регистър EECON1 е контролен и се използват само младшите пет бита. Старшите три бита не са необходими и са нулирани.
Контролните битове RD и WR са инициатори съответно за четене и запис. Установяването на тези битове може да стане само чрез софтуера. Те се нулират хардуерно след изпълнението на всяка четяща или записваща операция. Забраната за нулиране на WR бита в софтуера предпазва от случайно, преждевременно прекратяване на записващата операция. Контролния бит WREN е предназначен за разрешение на записа.
Регистър EECON2 не е физически регистър. При неговото прочитане ще се прочетат само нули.
За да се прочете паметта за данни е необходимо, потребителят да запише адреса в регистър EEADR и след това да установи бит RD. Данните са разрешени във всеки следващ цикъл, т. е. съдържанието може да бъде прочетено със следващата инструкция. Регистър EEDATA ще помни тази стойност до следващото четене или до неговото записване от потребителя.
-
00h
|
Индир. адресиране(1)
|
Индир. адресиране(1)
|
80h
|
01h
|
TMRO
|
OPTION
|
81h
|
02h
|
PCL
|
PCL
|
82h
|
03h
|
STATUS
|
STATUS
|
83h
|
04h
|
FSR
|
FSR
|
84h
|
05h
|
PORTA
|
TRISA
|
85h
|
06h
|
PORTB
|
TRISB
|
86h
|
07h
|
Неизползвана памет. Чете се като нула.
|
87h
|
08h
|
EEDATA
|
EECON1
|
88h
|
09h
|
EEADR
|
EECON2
|
89h
|
0Ah
|
PCLATH
|
PCLATH
|
8Ah
|
0Bh
|
INTCON
|
INTCON
|
8Bh
|
0Ch
2Fh
|
64 GPR (SRAM)
|
Mapped (accesses)
in Bank0
|
8Сh
AFh
|
30h
7Fh
|
Неизползвана памет. Чете се като нула.
|
B0h
FFh
|
(1) Няма физически запис (регистър)
фиг.4.1.1. Карта на Register File
За да се запише информация в EEPROM, е необходимо първо да се запише адреса в регистър EEADR и данните в регистър EEDATA. За да не се допусне фалшив запис е необходимо разрешаващия бит WREN да бъде винаги нулиран, освен при промяна на данните. При завършване на записващия цикъл, битът WR се нулира хардуерно.
PIC16F84 има 64B EEPROM памет за данни с адреси 00h-3Fh. Времето за запис се контролира от вграден таймер. Когато устройството е защитено с парола,CPU може да продължи да чете и записва в EEPROM паметта.
Организация на програмната памет
PIC16F84 има 13-битов програмен брояч (Programm Counter-PC), способен да адресира 8к х 14 пространство на програмната памет. За този микроконтролер само първите 1к х 14 (0000H-03FFH) са физически изпълнени. Достъпността до участъка над физически изпълнените адреси ще причини зацикляне. Например адреси 20H, 420H, C20H, 1020H, 1420H, 1820H и 1C20H ще бъдат идентични.
Програмен брояч. Регистри PCL и PCLATH.
Програмния брояч (PC-Programm Counter) е 13 битов. Младшия байт (PC<0:7>) е PCL регистър, от който може да се чете и,в който може да се записва. Останалите битове (старшия байт-PC<8:12>) са нечетими и незаписваеми, тяхното съдържание идва от PCLATH регистър (PC Latch High). PCLATH е поддържащ регистър за PC(<8:12>). Съдържанието на PCLATH се предава на старшия байт на програмния брояч, когато той (PC) е зареден с нова стойност. Това става когато се използват инструкциите CALL и GOTO, или при запис в PCL.
Тактуване и инструкционен цикъл.
фиг.4.1.2
Тактуване и изпълнение на инструкциите.
Тактовия вход (OSC1) е вътрешно разделен на четири, за да се генерират четири незастъпващи се, 900 тактови импулса, които се означават с Q1-Q4. Програмния брояч (PC) нараства по предния фронт на Q1, инструкциите се четат от програмната памет по време на Q4. Инструкциите се декодират и изпълняват по време на протичането на четирите цикъла Q1-Q4. На фиг.Х. са показани тактовете и изпълнението на инструкциите.
Входно/изходни портове-PORTA и регистър TRISA
PORTA е 5-битов. Входът RA4 е с тригер на Шмит и отворен дрейн. Всички други RA портови пинове имат TTL входно ниво и пълен CMOS изходен драйвер. Всеки един пин може да бъде конфигуриран като входен или изходен чрез съответните битове в регистър TRISA. Установяването на тези битове привежда съответните портове във високоимпедансно състояние. При нулирането им съдържанието на изходните тригери се извежда на съответните им пинове. Четейки, регистър PORTA прочита състоянието на пиновете и го записва в портовия тригер. Характерно за RA4 е мултиплицирането му с TMR0 тактов вход. На фиг.4.1.3 е показана карта на битовете на регистри PORTA и TRISA.
АДРЕС
|
ИМЕ
|
b7
|
b6
|
b5
|
b4
|
b3
|
b2
|
b1
|
b0
|
05h
|
PORTA
|
---
|
---
|
---
|
RA4/TOCK1
|
RA3
|
RA2
|
RA1
|
RA0
|
85h
|
TRISA
|
---
|
---
|
---
|
TRISA4
|
TRISA3
|
TRISA2
|
TRISA1
|
TRISA0
|
фиг.4.1.3
Регистри PORTA и TRISA
Входно/изходни портове-PORTB и регистър TRISB
PORTB е 8 битов двупосочен порт. Регистърът насочващ данните е TRISB. Една единица на някой от битовете в този регистър ще приведе съответния пин във високоимпедансно състояние. Една нула на някой от битовете в регистър TRISB ще изведе съдържанието на изходния тригер на съответния портов пин. Промяната на състоянието на RA4-RA7 може да събуди устройството от режим SLEEP. Записът на входно/изходен порт става в края на цикъла на една инструкция. При четяща операция е необходимо данните да са налични в началото на цикъла. Тези особености навеждат на мисълта, че е добре между две последователни, записваща и четяща инструкции, да има една празна (NOP). На фиг.4.1.4 е показана карта на битовете на регистри PORTB и TRISB.
-
Адрес
|
Име
|
b7
|
b6
|
b5
|
b4
|
b3
|
b2
|
b1
|
b0
|
06h
|
PORTB
|
RB7
|
RB6
|
RB5
|
RB4
|
RB3
|
RB2
|
RB1
|
RB0
|
86h
|
TRISB
|
TRISB7
|
TRISB6
|
TRISB5
|
TRISB4
|
TRISB3
|
TRISB2
|
TRISB1
|
TRISB0
|
фиг.4.1.4
Регистри PORTB и TRISB
Модул TAMER0 и регистър TMR0
Модулът Timer0 е 8 битов таймер/брояч, в който може да се записва и, от който може да се чете, има софтуерно програмируем делител, вътрешен и външен тактов сигнал, прекъсване при препълване и служи за изглаждане на външния такт.
Режим таймер/брояч се избира съответно чрез нулиране/сетване на бит TOCS в регистър OPTION. При препълване на Timer0 битът T0IF в регистър INTCON се установява. Прекъсването може да бъде маскирано чрез нулиране на разрешаващият бит T0IE. Докато таймерът е изключен чрез SLEEP, микроконтролера не може да бъде събуден чрез TMR0 прекъсване.
Специални характеристики на микроконтролера
Това, което отличава микроконтролера от другите процесори са специалните вериги за работа в реално време. PIC16F84 има множество подобни характеристики, проектирани за максимална системна надеждност, намалена цена поради премахване на външни компоненти, осигурява ниска консумация в режим SLEEP и предлага кодирана защита.
PIC16F84 има вграден RC осцилатор наречен Watshdog Timer (WDT), който може да бъде изключен само чрез конфигурационни битове. Той не изисква никакви външни елементи и е отделен от RC осцилаторът на пин OSC1/CLKIN. Продължителността на един WDT time-out e 18ms. PIC16F84 има още два таймера, което осигурява необходимото забавяне при включване на захранването. Единият е OST (Oscilator Start-up Timer), проектиран да задържи чипът ресетван за 1024 осцилаторни цикъла, докато се стабилизира кристалният осцилатор. Другият е PWRT (Power-up Timer), който осигурява фиксирано закъснение от 72ms на захранването. По този начин устройството се държи в ресет, докато се стабилизира захранването тези два вградени таймера са достатъчни и няма от външна ресетваща верига.
Режим SLEEP осигурява ниска консумация на енергия по време на неизползване на устройството. Събуждането става чрез външен ресет, WDT time-out или чрез едно прекъсване.
Конфигурация на осцилатора
PIC16F84 може да бъде управляван от четири различни модела осцилатори. Определянето на типа на използвания осцилатор става чрез два конфигурационни бита (FOSC1 и FOSC0).
-
LP - Low Power Cristal (Кристал с ниска консумация)
-
XT - Cristal/Resonator (Кристал резонатор)
-
HS - Hid Speed Cristal/(Resonator (Високоскоростен К./Р.)
-
RC - Resistor/Capacitor (RC - група)
При използването на тип XT, LP или HS осцилатора се свързва към пинове OSC1/CLKIN и OSC2/CLKOUT, за да се получи по-добра стабилност на генерациите. Може да се използват два вида вериги за кристалния резонатор. Едната със сериен резонанс и една с паралелен резонанс.
Ако се използва RC осцилатор, генерираната честота ще зависи от захранващото напрежение, стойностите на използваните резистори и кондензатори и от температурата. Препоръчително е R>2,2k. По-малка стойност може да доведе до нестабилност на осцилатора и дори той изцяло да спре. За много големи стойности на R (R>1M), осцилаторът става чувствителен към шум, влага и утечки. Макар че осцилаторът ще работи осцилаторът ще работи и без външен кондензатор, препоръчително е използването на такъв със стойност 20pF за предпазване от шумове и по-добра стабилност.
Прекъсвания в PIC16F84
PIC16F84 има четири източника на прекъсване:
-
Външен прекъсващ пин RBO/INT
-
Прекъсване при препълване на TMR0
-
PORTB прекъсване при промяна на пинове RB4-RB7
-
PORTB прекъсване при завършен запис в EEPROM
Регистърът за контрол на прекъсването (INTCON) записва индивидуалните заявки за прекъсване във флаговите битове. Той съдържа индивидуални и общ (глобален),разрешаващи прекъсването битове.
Общият разрешаващ прекъсването бит е GIE (Global Interrupt Enable). Чрез него се разрешават всички немаскирани прекъсвания или се забраняват всички прекъсвания. Индивидуалните прекъсвания могат да бъдат разрешени чрез съответните им разрешаващи битове в регистър INTCON. Определянето на вида на прекъсването може да стане софтуерно, като се провери състоянието на тези битове в регистъра. Когато заявката е външна, от пин RB0/INT или PORTB, се получава закъснение от на прекъсването от три или четири инструкционни цикъла. Едно INT прекъсване може да събуди микроконтролера от режим SLEEP,само ако разрешаващият бит INTE е бил предварително установен (сетван). Прекъсването при препълване TMR0 ще настъпи, когато се достигне стойност FFh и се премине към 00h, което ще установи флаговия бит TOIF в регистър INTCON. Прекъсването може д а бъде разрешено или забранено чрез бит TOIE в същия регистър. POTRB прекъсване настъпва при смяна на състоянието на RA4-RA7 пинове, което установява (сетва) флаговия бит RBIF в регистър прекъсването може да бъде разрешено или забранено чрез бит RBIE в същия регистър.
Режим на ниска консумация
Микроконтролерът може да бъде поставен в режем на понижена консумация, а по-късно отново в режим на нормална работа, т.е. да бъде събуден от режим SLEEP (сън).
В този режим се влиза след изпълнение на инструкцията SLEEP, при което настъпват определени промени в конфигурационните битове. Като пример може да се посочи, че ако WDT е разрешен се нулира, битът PD от регистър STATUS SE се нулира, битът ТО от същият регистър се установява в единица и драйвера на осцилатора се изключва.
За по-малка консумация в режим SLEEP е препоръчително всички входно/изходни пинове да се към Vdd или Vss, без външни вериги черпещи ток от тези пинове.
Събуждането на мицропроцесора от този режим може да стане по един от следните начини:
-
Външно въвеждане на ресет чрез пин MCLR.
-
Събуждане чрез WDT
-
Прекъсване на пин RB0/INT, смяна на нивата на един от пиновете на PORTB или при завършване на запис в EEPROM паметта.
Първият случай ще причини ресет на паметта и програмата ще започне от начало. При следващите два изпълнението на програмата ще от мястото, където е настъпил режим SLEEP. Битовете ТО и PD могат да бъдат използвани за определяне причината за ресета на процесора.
Асемблер на PIC16F84
Команда
|
Описание
|
Цикли
|
Статус
Битове
|
ADDWF f,d
|
Събира W и f
|
1
|
C,DC,Z
|
ANDWF f,d
|
Лог. “И” между W и f
|
1
|
Z
|
CLRF f
|
Нулира f
|
1
|
Z
|
CLRW -
|
Нулира W
|
1
|
Z
|
COMF f,d
|
Инвертира f
|
1
|
Z
|
DECF f,d
|
Намалява с 1 f
|
1
|
Z
|
DECFSZ f,d
|
Намалява с 1 f и при резултат 0 прескача следващата команда
|
1 (2)
|
NONE
|
INC f,d
|
Увеличава с 1 f
|
1
|
Z
|
INCFSZ f,d
|
Увеличава с 1 f и при резултат 0 прескача следващата команда
|
1 (2)
|
NONE
|
IORWF f,d
|
Лог. “ИЛИ” между W и f
|
1
|
Z
|
MOVF f,d
|
Премества f
|
1
|
Z
|
MOVWF f
|
Премества W в f
|
1
|
NONE
|
NOP -
|
Празна операция
|
1
|
NONE
|
RLF f,d
|
Извършва ротация наляво през бит С на рег. STATUS
|
1
|
C
|
RRF f,d
|
Извършва ротация надясно през бит С на рег. STATUS
|
1
|
C
|
SUBWF f,d
|
Изважда W от f
|
1
|
C,DC,Z
|
SWAPF f,d
|
Размества младши и старши полубайт в f
|
1
|
NONE
|
XORWF f,d
|
Изключващо “ИЛИ” между W и f
|
1
|
Z
|
Битово ориентирани команди
|
BCF f,b
|
Нулира указания чрез b бит във f
|
1
|
NONE
|
BSF f,b
|
Установява указания чрез b бит във f
|
1
|
NONE
|
BTFSC f,b
|
Ако бит b от f е 0 прескача следващата команда
|
1 (2)
|
NONE
|
BTFSS f,b
|
Ако бит b от f е 1 прескача следващата команда
|
1 (2)
|
NONE
|
Константни и контролни команди
|
ADDLW k
|
Събира стойността k с W
|
1
|
C,DC,Z
|
ANDLW k
|
Лог. “И” между стойността к и W
|
1
|
Z
|
CALL k
|
Извиква подпрограма с етикет к
|
2
|
|
CLRWDT -
|
Нулира Watchdog Timer
|
1
|
TO,PD
|
GOTO k
|
Безусловен преход към ред с етикет к
|
2
|
NONE
|
IORLW k
|
Лог. “ИЛИ” между стойността к и W
|
1
|
Z
|
MOVLW k
|
Премества стойността к в W
|
1
|
NONE
|
RETFIE -
|
Връщане от прекъсване
|
2
|
NONE
|
RETLW k
|
Връща като записва стойността на к в W
|
2
|
NONE
|
RETURN -
|
Връща от подпрограма
|
2
|
NONE
|
SLEEP -
|
Преминава в режим на ниска консумация
|
1
|
TO,PD
|
SUBLW k
|
Изважда W от стойността на к
|
1
|
C,DC,Z
|
XORLW k
|
Изключващо “ИЛИ” между W и к
|
1
|
Z
|
Сподели с приятели: |