Ngoaïi tröø reset POR traïng thaùi caùc thanh ghi laø khoâng xaùc ñònh vaøWDT wake up
khoâng aûnh höôûng ñeán traïng thaùi caùc thanh ghi, caùc cheá ñoä reset coøn laïi ñeàu ñöa giaù trò caùc
thanh ghi veà giaù trò ban ñaàu ñöôïc aán ñònh saün. Caùc bit vaø chæ thò traïng thaùi hoaït ñoäng,
traïng thaùi reset cuûa vi ñieàu khieån vaø ñöôïc ñieàu khieån bôûi CPU.
reset: Khi pin ôû möùc logic thaáp,
vi ñieàu khieån seõ ñöôïc reset. Tín hieäu reset
ñöôïc cung caáp bôûi moät maïch ngoaïi vi vôùi
caùc yeâu caàu cuï theå sau:
Khoâng noái pin tröïc tieáp leân
nguoàn VDD.
R1 phaûi nhoû hôn 40 K ñeå ñaûm baûo
caùc ñaëc tính ñieän cuûa vi ñieàu khieån.
R2 phaûi lôùn hôn 1 K ñeå haïn doøng ñi
vaøo vi ñieàu khieån.
Hình 2.40 Maïch reset qua pin .
reset coøn ñöôïc choáng nhieãu bôûi moät boä loïc ñeå traùnh caùc tín hieäu nhoû taùc ñoäng
leân pin .
Power-on reset (POR): Ñaây laø xung reset do vi ñieàu khieån taïo ra khi phaùt hieän nguoàn
cung caáp VDD. Khi hoaït ñoäng ôû cheá ñoä bình thöôøng, vi ñieàu khieån caàn ñöôïc ñaûm baûo caùc
thoâng soá veà doøng ñieän, ñieän aùp ñeå hoaït ñoäng bình thöôøng. Nhöng neáu caùc tham soá naøy khoâng
ñöôïc ñaûm baûo, xung reset do POR taïo ra seõ ñöa vi ñieàu khieån veà traïng thaùi reset vaø chæ tieáp
tuïc hoaït ñoäng khi naøo caùc tham soá treân ñöôïc ñaûm baûo.
Power-up Timer (PWRT): ñaây laø boä ñònh thôøi hoaït ñoäng döïa vaøo maïch RC beân trong
vi ñieàu khieån. Khi PWRT ñöôïc kích hoaït, vi ñieàu khieån seõ ñöôïc ñöa veà traïng thaùi reset.
PWRT seõ taïo ra moät khoaûng thôøi gian delay (khoaûng 72 ms) ñeå VDD taêng ñeán giaù trò thích
hôïp.
Oscillator Start-up Timer (OST): OST cung caáp moät khoaûng thôøi gian delay baèng 1024
chu kì xung cuûa oscillator sau khi PWRT ngöng taùc ñoäng (vi ñieàu khieån ñaõ ñuû ñieàu kieän hoaït
ñoäng) ñeå ñaûm baûo söï oån ñònh cuûa xung do oscillator phaùt ra. Taùc ñoäng cuûa OST coøn xaûy ra
ñoái vôùi POR reset vaø khi vi ñieàu khieån ñöôïc ñaùnh thöùc töø cheá ñôï sleep. OST chæ taùc ñoäng ñoái
vôùi caùc loïai oscillator laø XT, HS vaø LP.
Brown-out reset (BOR): Neáu VDD haï xuoáng thaáp hôn giaù trò VBOR (khoaûng 4V) vaø keùo
daøi trong khoaûng thôøi gian lôùn hôn TBOR (khoaûng 100 us), BOR ñöôïc kích hoaït vaø vi ñieàu
khieån ñöôïc ñöa veà traïng thaùi BOR reset. Neáu ñieän aùp cung caáp cho vi ñieàu khieån haï xuoáng
thaáp hôn VBOR trong khoaûng thôøi gian ngaén hôn TBOR, vi ñieàu khieån seõ khoâng ñöôïc reset. Khi
ñieän aùp cung caáp ñuû cho vi ñieàu khieån hoaït ñoäng, PWRT ñöôïc kích hoaït ñeå taïo ra moät
khoaûng thôøi gian delay (khoaûng 72ms). Neáu trong khoaûng thôøi gian naøy ñieän aùp cung caáp cho
vi ñieàu khieån laïi tieáp tuïc haï xuoáng döôùi möùc ñieän aùp VBOR, BOR reset seõ laïi ñöôïc kích hoaït
khi vi ñieàu khieån ñuû ñieän aùp hoaït ñoäng. Moät ñieåm caàn chuù yù laø khi BOR reset ñöôïc cho pheùp,
PWRT cuõng seõ hoaït ñoäng baát chaáp traïng thaùi cuûa bit PWRT.
Toùm laïi ñeå vi ñieàu khieån hoaït ñoäng ñöôïc töø khi caáp nguoàn caàn traûi qua caùc böôùc sau:
POR taùc ñoäng.
PWRT (neáu ñöôïc cho pheùp hoaït ñoäng) taïo ra khoaûng thôøi gian delay TPWRT ñeå oån ñònh
nguoàn cung caáp.
OST (neáu ñöôïc cho pheùp) taïo ra khoaûng thôøi gian delay baèng 1024 chu kì xung cuûa
oscillator ñeå oån ñònh taàn soá cuûa oscillator.
Ñeán thôøi ñieåm naøy vi ñieàu khieån môùi baét ñaàu hoaït ñoäng bình thöôøng.
Thanh ghi ñieàu khieån vaø chæ thò traïng thaùi nguoàn cung caáp cho vi ñieàu khieån laø thanh ghi
PCON (xem phuï luïc 2 ñeå bieát theâm chi tieát).
Hình 2.41 Sô ñoà caùc cheá ñoä reset cuûa PIC16F877A.
2.14.4 NGAÉT (INTERRUPT)
PIC16F877A coù ñeán 15 nguoàn taïo ra hoaït ñoäng ngaét ñöôïc ñieàu khieån bôûi thanh ghi
INTCON (bit GIE). Beân caïnh ñoù moãi ngaét coøn coù moät bit ñieàu khieån vaø côø ngaét rieâng. Caùc côø
ngaét vaãn ñöôïc set bình thöôøng khi thoûa maõn ñieàu kieän ngaét xaûy ra baát chaáp traïng thaùi cuûa bit
GIE, tuy nhieân hoaït ñoäng ngaét vaãn phuï thuoâc vaøo bit GIE vaø caùc bit ñieàu khieån khaùc. Bit ñieàu
khieån ngaét RB0/INT vaø TMR0 naèm trong thanh ghi INTCON, thanh ghi naøy coøn chöùa bit cho
pheùp caùc ngaét ngoaïi vi PEIE. Bit ñieàu khieån caùc ngaét naèm trong thanh ghi PIE1 vaø PIE2. Côø
ngaét cuûa caùc ngaét naèm trong thanh ghi PIR1 vaø PIR2.
Trong moät thôøi ñieåm chæ coù moät chöông trình ngaét ñöôïc thöïc thi, chöông trình ngaét
ñöôïc keát thuùc baèng leänh RETFIE. Khi chöông trình ngaét ñöôïc thöïc thi, bit GIE töï ñoäng ñöôïc
xoùa, ñòa chæ leänh tieáp theo cuûa chöông trình chính ñöôïc caát vaøo trong boä nhôù Stack vaø boä ñeám
chöông trình seõ chæ ñeán ñòa chæ 0004h. Leänh RETFIE ñöôïc duøng ñeå thoaùt khoûi chöông trình
ngaét vaø quay trôû veà chöông trình chính, ñoàng thôøi bit GIE cuõng seõ ñöôïc set ñeå cho pheùp caùc
ngaét hoaït ñoäng trôû laïi. Caùc côø hieäu ñöôïc duøng ñeå kieåm tra ngaét naøo ñang xaûy ra vaø phaûi ñöôïc
xoùa baèng chöông trình tröôùc khi cho pheùp ngaét tieáp tuïc hoaït ñoäng trôû laïi ñeå ta coù theå phaùt
hieän ñöôïc thôøi ñieåm tieáp theo maø ngaét xaûy ra.
Ñoái vôùi caùc ngaét ngoaïi vi nhö ngaét töø chaân INT hay ngaét töø söï thay ñoåi traïng thaùi caùc
pin cuûa PORTB (PORTB Interrupt on change), vieäc xaùc ñònh ngaét naøo xaûy ra caàn 3 hoaëc 4
chu kì leänh tuøy thuoäc vaøo thôøi ñieåm xaûy ra ngaét.
Caàn chuù yù laø trong quaù trình thöïc thi ngaét, chæ coù giaù trò cuûa boä ñeám chöông trình ñöôïc
caát vaøo trong Stack, trong khi moät soá thanh ghi quan troïng seõ khoâng ñöôïc caát vaø coù theå bò
thay ñoåi giaù trò trong quaù trình thöïc thi chöông trình ngaét. Ñieàu naøy neân ñöôïc xöû lí baèng
chöông trình ñeå traùnh hieän töôïng treân xaûy ra.
Hình 2.42 Sô ñoà logic cuûa taát caû caùc ngaét trong vi ñieàu khieån PIC16F877A.
2.14.4.1 NGAÉT INT
Ngaét naøy döïa treân söï thay ñoåi traïng thaùi cuûa pin RB0/INT. Caïnh taùc ñoäng gaây ra ngaét
coù theå laø caïnh leân hay caïnh xuoáng vaø ñöôïc ñieàu khieån bôûi bit INTEDG (thanh ghi OPTION_
REG <6>). Khi coù caïnh taùc ñoäng thích hôïp xuaát hieän taïi pin RB0/INT, côø ngaét INTF ñöôïc set
baát chaáp traïng thaùi caùc bit ñieàu khieån GIE vaø PEIE. Ngaét naøy coù khaû naêng ñaùnh thöùc vi ñieàu
khieån töø cheá ñoä sleep neáu bit cho pheùp ngaét ñöôïc set tröôùc khi leänh SLEEP ñöôïc thöïc thi.
2.14.4.2 NGAÉT DO SÖÏ THAY ÑOÅI TRAÏNG THAÙI CAÙC PIN TRONG PORTB
Caùc pin PORTB<7:4> ñöôïc duøng cho ngaét naøy vaø ñöôïc ñieàu khieån bôûi bit RBIE
(thanh ghi INTCON<4>). Côø ngaét cuûa ngaét naøy laø bit RBIF (INTCON<0>).
2.14.5 WATCHDOG TIMER (WDT)
Watchdog timer (WDT) laø boä ñeám ñoäc laäp duøng nguoàn xung ñeám töø boä taïo xung ñöôïc
tích hôïp saün trong vi ñieàu khieån vaø khoâng phuï thuoäc vaøo baát kì nguoàn xung clock ngoaïi vi
naøo. Ñieàu ñoù coù nghóa laø WDT vaãn hoaït ñoäng ngay caû khi xung clock ñöôïc laáy töø pin
OSC1/CLKI vaø pin OSC2/CLKO cuûa vi ñieàu khieån ngöng hoaït ñoäng (chaúng haïn nhö do taùc
ñoäng cuûa leänh sleep). Bit ñieàu khieån cuûa WDT laø bit WDTE naèm trong boä nhôù chöông trình ôû
ñòa chæ 2007h (Configuration bit).
WDT seõ töï ñoäng reset vi ñieàu khieån (Watchdog Timer Reset) khi boä ñeám cuûa WDT bò
traøn (neáu WDT ñöôïc cho pheùp hoaït ñoäng), ñoàng thôøi bit töï ñoäng ñöôïc xoùa. Neáu vi ñieàu
khieån ñang ôû cheá ñoä sleep thì WDT seõ ñaùnh thöùc vi ñieàu khieån (Watchdog Timer Wake-up)
khi boä ñeám bò traøn. Nhö vaäy WDT coù taùc duïng reset vi ñieàu khieån ôû thôøi ñieåm caàn thieát maø
khoâng caàn ñeán söï taùc ñoäng töø beân ngoaøi, chaúng haïn nhö trong quaù trình thöïc thi leänh, vi ñieàu
khieån bò “keït” ôû moät choå naøo ñoù maø khoâng thoaùt ra ñöôc, khi ñoù vi ñieàu khieån seõ töï ñoäng
ñöôïc reset khi WDT bò traøn eå chöông trình hoaït ñoäng ñuùng trôû laïi. Tuy nhieân khi söû duïng
WDT cuõng coù söï phieàn toaùi vì vi ñieàu khieån seõ thöôøng xuyeân ñöôïc reset sau moät thôøi gian
nhaát ñònh, do ñoùi caàn tính toaùn thôøi gian thích hôïp ñeå xoùa WDT (duøng leänh CLRWDT). Vaø
ñeå vieäc aán ñònh thôøi gian reset ñöôïc linh ñoäng, WDT coøn ñöôïc hoã trôï moät boä chia taàn soá
prescaler ñöôïc ñieàu khieån bôûi thanh ghi OPTION_REG (prescaler naøy ñöôïc chia xeû vôùi
Timer0).
Moät ñieåm caàn chuù yù nöõa laø leänh sleep seõ xoùa boä ñeám WDT vaø prescaler. Ngoaøi ra
leänh xoùa CLRWDT chæ xoùa boä ñeám chöù khoâng laøm thay ñoåi ñoái töôïng taùc ñoäng cuûa prescaler
(WDT hay Timer0).
Xem laïi Timer0 vaø thanh ghi OPTION_REG (phuï luïc 2) ñeå bieát theâm chi tieát.
2.14.6 CHEÁ ÑOÄ SLEEP
Ñaây laø cheá ñoä hoaït ñoäng cuûa vi ñieàu khieån khi leänh SLEEP ñöôïc thöïc thi. Khi ñoù neáu
ñöôïc cho pheùp hoaït ñoäng, boä ñeám cuûa WDT seõ bò xoùa nhöng WDT vaãn tieáp tuïc hoaït ñoäng,
bit (STATUS<3>) ñöôïc reset veà 0, bit ñöôïc set, oscillator ngöng taùc ñoäng vaø caùc
PORT giöõ nguyeân traïng thaùi nhö tröôùc khi leänh SLEEP ñöôïc thöïc thi.
Do khi ôû cheá ñoä SLEEP, doøng cung caáp cho vi ñieàu khieån laø raát nhoû neân ta caàn thöïc hieän caùc
böôùc sau tröôùc khi vi ñieàu khieån thöïc thi leänh SLEEP:
Ñöa taát caû caùc pin veà traïng thaùi VDD hoaëc VSS
Caàn baûo ñaûm raèng khoâng coø maïch ngoaïi vi naøo ñöôïc ñieàu khieån bôûi doøng ñieän cuûa vi
ñieàu khieån vì doøng ñieän nhoû khoâng ñuû khaû naêng cung caáp cho caùc maïch ngoaïi vi hoaït ñoäng.
Taïm ngöng hoaït ñoäng cuû khoái A/D vaø khoâng cho pheùp caùc xung clock töø beân ngoaøi
taùc ñoäng vaøo vi ñieàu khieån.
Ñeå yù ñeán chöùc naêng keùo leân ñieän trôû ôû PORTB.
Pin
phaûi ôû möùc logic cao.
2.14.6.1 “ÑAÙNH THÖÙC” VI ÑIEÀU KHIEÅN
Vi ñieàu khieån coù theå ñöôïc “ñaùnh thöùc” döôùi taùc ñoäng cuûa moät trong soá caùc hieän töôïng sau:
1. Taùc ñoäng cuûa reset ngoaïi vi thoâng qua pin .
2. Taùc ñoäng cuûa WDT khi bò traøn.
3. Taùc ñoäng töø caùc ngaét ngoaïi vi töø PORTB (PORTB Interrupt on change hoaëc pin
INT).
Caùc bit vaø ñöôïc duøng ñeå theå hieän traïng thaùi cuûa vi ñieàu khieån vaø ñeå phaùt hieän nguoàn
taùc ñoäng laøm reset vi ñieàu khieån. Bit ñöôïc set khi vi ñieàu khieån ñöôïc caáp nguoàn vaø ñöôïc
reset veà 0 khi vi ñieàu khieån ôû cheá ñoä sleep. Bit ñöôïc reset veà 0 khi WDT taùc ñoäng do boä
ñeám bò traøn.
Ngoaøi ra coøn coù moät soá nguoàn taùc ñoäng khaùc töø caùc chöùc naêng ngoaïi vi bao goàm:
1. Ñoïc hay ghi döõ lieäu thoâng qua PSP (Parallel Slave Port).
2. Ngaét Timer1 khi hoaït ñoäng ôû cheá ñoä ñeám baát ñoàng boä.
3. Ngaét CCP khi hoaït ñoäng ôû cheá ñoä Capture.
4. Caùc hieän töôïng ñaëc bieät laøm reset Timer1 khi hoaït ñoäng ôû cheá ñoä ñeám baát ñoàng
boä duøng nguoàn xung clock ôû beân ngoaøi).
5. Ngaét SSP khi bit Start/Stop ñöôïc phaùt hieän.
6. SSP hoaït ñoäng ôû cheá ñoä Slave mode khi truyeàn hoaëc nhaän döõ lieäu.
7. Taùc ñoäng cuûa USART töø caùc pin RX hay TX khi hoaït ñoäng ôû cheá ñoä Slave mode
ñoàng boä.
8. Khoái chuyeån ñoåi A/D khi nguoàn xung clock hoaït ñoäng ôû daïng RC.
9. Hoaøn taát quaù trình ghi vaøo EEPROM.
10. Ngoõ ra boä so saùnh thay ñoåi traïng thaùi.