Tài liệu Vi điều khiển - Nguyễn Văn Tình

pdf 177 trang ngocly 1760
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu Vi điều khiển - Nguyễn Văn Tình", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftai_lieu_vi_dieu_khien_nguyen_van_tinh.pdf

Nội dung text: Tài liệu Vi điều khiển - Nguyễn Văn Tình

  1. TRƯỜNG SĨ QUAN CHKT THÔNG TIN NGUYEN VĂN TÌNH Kho¸ DH12 HÖ ®μo t¹o dμi h¹n ĐAI HỌC TÀI LIỆU VI ĐIỀU KHIỂN PIC 16F877A N¨m 2008 SI QUAN CHI HUY KI THUẬT THÔNG TIN
  2. LỜI NÓI ĐẦU Chào các đồng chí.Mình tên là nguyễn văn tình là hoc viên tiểu đoàn 18 khóa ĐH12 .Sau nhiều thời gian nghiên cứu về vi điều khiển,và nhận thấy là chúng ta học ĐIỆN TỬ VIỄN THÔNG nhưng chúng ta chưa được các thầy dạy nhiều về vi điều khiển .Chính vì điều đó nên hôm nay mình quyết định cho xuất bản quyển sách về một loại vi điều khiển mà nó có những tính năng vượt trội so với nhiều dòng vi điều khiển trước như:8051,AVR,P89v51 .Đó là dòng vi điều khiển của hãng MICROCHIP .Vi điều khiển hiện nay cũng như tương lai là có rất nhiều ứng dụng trong cuộc sống,không chỉ cho những đồng chí thích nghiên cứu về tự động hóa hay về robocon v v Vì hiện tại là dòng vi điều khiển này cũng chưa được đưa vào dạy trong các trường đại học mà đa số các trường chỉ dạy về 8051 và cũng chưa có tài liệu chính thống nào.Nay mình cho ra đời quyển sách này với mục đích giúp chúng ta tiếp cận công nghệ mới chứ không để lạc hậu so với những sinh viên bên ngoài.Vì nhiều lý do và khả năng có hạn nên quá trình biên soạn có nhiều sai sót.mong các đồng chí đọc và cho ý kiến để chúng ta cùng sửa chữa. Mọi thắc mắc sin liện hệ với mình NGUYỄN VĂN TÌNH c3/d18/dh12h.Hay qua email henlagka@yahoo.com. DT:0583743625 Nha Trang ,ngay 25 tháng 12 năm 2008
  3. MUÏC LUÏC CHÖÔNG 1 TOÅNG QUAN VEÀ VI ÑIEÀU KHIEÅN PIC 1.1 PIC LAØ GÌ ?? 1.2 TAÏI SAO LAØ PIC MAØ KHOÂNG LAØ CAÙC HOÏ VI ÑIEÀU KHIEÅN KHAÙC?? 1.3 KIEÁN TRUÙC PIC 1.4 RISC VAØ CISC 1.5 PIPELINING 1.6 CAÙC DOØNG PIC VAØ CAÙCH LÖÏA CHOÏN VI ÑIEÀU KHIEÅN PIC 1.7 NGOÂN NGÖÕ LAÄP TRÌNH CHO PIC 1.8 MAÏCH NAÏP PIC 1.9 BOOTLOADER VAØ ICP (In Circuit Programming) CHÖÔNG 2 VI ÑIEÀU KHIEÅN PIC16F877A 2.1 SÔ ÑOÀ CHAÂN VI ÑIEÀU KHIEÅN PIC16F877A 2.2 MOÄT VAØI THOÂNG SOÁ VEÀ VI ÑIEÀU KHIEÅN PIC16F877A 2.3 SÔ ÑOÀ KHOÁI VI ÑIEÀU KHIEÅN PIC16F877A 2.4 TOÅ CHÖÙC BOÄ NHÔÙ 2.4.1 BOÄ NHÔÙ CHÖÔNG TRÌNH 2.4.2 BOÄ NHÔÙ DÖÕ LIEÄU 2.4.2.1 THANH GHI CHÖÙC NAÊNG ÑAËC BIEÄT SFR 2.4.2.2 THANH GHI MUÏC ÑÍCH CHUNG GPR 2.4.3 STACK 2.5 CAÙC COÅNG XUAÁT NHAÄP CUÛA PIC16F877A 2.5.1 PORTA 2.5.2 PORTB 2.5.3 PORTC 2.5.4 PORTD 2.5.5 PORTE 2.6 TIMER 0 2.7 TIMER1 2.8 TIMER2 2.9 ADC 2.10 COMPARATOR 2.10.1 BOÄ TAÏO ÑIEÄN AÙP SO SAÙNH 2.11 CCP 2.12 GIAO TIEÁP NOÁI TIEÁP
  4. 1.12.1 USART 2.12.1.1 USART BAÁT ÑOÀNG BOÄ 2.12.1.1.1 TRUYEÀN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART BAÁT ÑOÀNG BOÄ 2.12.1.1.2 NHAÄN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART BAÁT ÑOÀNG BOÄ 2.12.1.1.2 USART ÑOÀNG BOÄ 2.12.1.2.1 TRUYEÀN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ MASTER MODE 2.12.1.2.2 NHAÄN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ MASTER MODE 2.12.1.2.3 TRUYEÀN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ SLAVE MODE 2.12.1.2.4 NHAÄN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ SLAVE MODE 2.12.2 MSSP 2.12.2.1 SPI 2.12.2.1.1 SPI MASTER MODE 2.12.2.1.2 SPI SLAVE MODE 2.12.2.2 I2C 2.12.2.2.1 I2C SLAVE MODE 2.12.2.2.2 I2C MASTER MODE 2.13 COÅNG GIAO TIEÁP SONG SONG PSP (PARALLEL SLAVE PORT) 2.14 TOÅNG QUAN VEÀ MOÄT SOÁ ÑAËC TÍNH CUÛA CPU. 2.14.1 CONFIGURATION BIT 2.14.2 CAÙC ÑAËC TÍNH CUÛA OSCILLATOR 2.14.3 CAÙC CHEÁ ÑOÄRESET 2.14.4 NGAÉT (INTERRUPT) 2.14.4.1 NGAÉT INT 2.14.4.2 NGAÉT DO SÖÏ THAY ÑOÅI TRAÏNG THAÙI CAÙC PIN TRONG PORTB 2.14.5 WATCHDOG TIMER (WDT) 2.14.6 CHEÁ ÑOÄ SLEEP 2.14.6.1 “ÑAÙNH THÖÙC” VI ÑIEÀU KHIEÅN CHÖÔNG 3 TAÄP LEÄNH CUÛA VI ÑIEÀU KHIEÅN PIC 3.1 VAØI NEÙT SÔ LÖÔÏC VEÀ TAÄP LEÄNH CUÛA VI ÑIEÀU KHIEÅN PIC 3.2 TAÄP LEÄNH CUÛA VI ÑIEÀU KHIEÅN PIC 3.3 CAÁU TRUÙC CUÛA MOÄT CHÖÔNG TRÌNH ASSEMBLY VIEÁT CHO VI ÑIEÀU KHIEÅN PIC
  5. CHÖÔNG 4 MOÄT SOÁ ÖÙNG DUÏNG CUÏ THEÅ CUÛA PIC16F877A 4.1 ÑIEÀU KHIEÅN CAÙC PORT I/O 4.1.1 CHÖÔNG TRÌNH DELAY 4.1.2 MOÄT SOÁ ÖÙNG DUÏNG VEÀ ÑAËC TÍNH I/O CUÛA CAÙC PORT ÑIEÀU KHIEÅN 4.2 VI ÑIEÀU KHIEÅN PIC16F877A VAØ IC GHI DÒCH 74HC595 4.3 PIC16F877A VAØ LED 7 ÑOAÏN 4.4 NGAÉT VAØ CAÁU TRUÙC CUÛA MOÄT CHÖÔNG TRÌNH NGAÉT 4.5 TIMER VAØ ÖÙNG DUÏNG 4.5.1 TIMER VAØ HOAÏT ÑOÄNG ÑÒNH THÔØI PHUÏ LUÏC 1 SÔ ÑOÀ KHOÁI CAÙC PORT CUÛA VI ÑIEÀU KHIEÅN PIC16F877A PHUÏ LUÏC 2 THANH GHI SFR (SPECIAL FUNCTION REGISTER)
  6. CHÖÔNG 1 TOÅNG QUAN VEÀ VI ÑIEÀU KHIEÅN PIC 1.1 PIC LAØ GÌ ?? PIC laø vieát taét cuûa “Programable Intelligent Computer”, coù theå taïm dòch laø “maùy tính thoâng minh khaû trình” do haõng Genenral Instrument ñaët teân cho vi ñieàu khieån ñaàu tieân cuûa hoï: PIC1650 ñöôïc thieát keá ñeå duøng laøm caùc thieát bò ngoaïi vi cho vi ñieàu khieån CP1600. Vi ñieàu khieån naøy sau ñoù ñöôïc nghieân cöùu phaùt trieån theâm vaø töø ñoù hình thaønh neân doøng vi ñieàu khieån PIC ngaøy nay. 1.2 TAÏI SAO LAØ PIC MAØ KHOÂNG LAØ CAÙC HOÏ VI ÑIEÀU KHIEÅN KHAÙC?? Hieän nay treân thò tröôøng coù raát nhieàu hoï vi ñieàu khieån nhö 8051, Motorola 68HC, AVR, ARM, Ngoaøi hoï 8051 ñöôïc höôùng daãn moät caùch caên baûn ôû moâi tröôøng ñaïi hoïc, baûn thaân ngöôøi vieát ñaõ choïn hoï vi ñieàu khieån PIC ñeå môû roäng voán kieán thöùc vaø phaùt trieån caùc öùng duïng treân coâng cuï naøy vì caùc nguyeân nhaân sau: Hoï vi ñieàu khieån naøy coù theå tìm mua deã daøng taïi thò tröôøng Vieät Nam. Giaù thaønh khoâng quaù ñaét. Coù ñaày ñuû caùc tính naêng cuûa moät vi ñieàu khieån khi hoaït ñoäng ñoäc laäp. Laø moät söï boå sung raát toát veà kieán thöùc cuõng nhö veà öùng duïng cho hoï vi ñieàu khieån mang tính truyeàn thoáng: hoï vi ñieàu khieån 8051. Soá löôïng ngöôøi söû duïng hoï vi ñieàu khieån PIC. Hieän nay taïi Vieät Nam cuõng nhö treân theá giôùi, hoï vi ñieàu khieån naøy ñöôïc söû duïng khaù roäng raõi. Ñieàu naøy taïo nhieàu thuaän lôïi trong quaù trình tìm hieåu vaø phaùt trieån caùc öùng duïng nhö: soá löôïng taøi lieäu, soá löôïng caùc öùng duïng môû ñaõ ñöôïc phaùt trieån thaønh coâng, deã daøng trao ñoåi, hoïc taäp, deã daøng tìm ñöôïc söï chæ daãn khi gaëp khoù khaên, Söï hoã trôï cuûa nhaø saûn xuaát veà trình bieân dòch, caùc coâng cuï laäp trình, naïp chöông trình töø ñôn giaûn ñeán phöùc taïp, Caùc tính naêng ña daïng cuûa vi ñieàu khieån PIC, vaø caùc tính naêng naøy khoâng ngöøng ñöôïc phaùt trieån. 1.3 KIEÁN TRUÙC PIC Caáu truùc phaàn cöùng cuûa moät vi ñieàu khieån ñöôïc thieát keá theo hai daïng kieán truùc: kieán truùc Von Neuman vaø kieán truùc Havard.
  7. Hình 1.1: Kieán truùc Havard vaø kieán truùc Von-Neuman Toå chöùc phaàn cöùng cuûa PIC ñöôïc thieát keá theo kieán truùc Havard. Ñieåm khaùc bieät giöõa kieán truùc Havard vaø kieán truùc Von-Neuman laø caáu truùc boä nhôù döõ lieäu vaø boä nhôù chöông trình. Ñoái vôùi kieán truùc Von-Neuman, boä nhôù döõ lieäu vaø boä nhôù chöông trình naèm chung trong moät boä nhôù, do ñoù ta coù theå toå chöùc, caân ñoái moät caùch linh hoaït boä nhôù chöông trình vaø boä nhôù döõ lieäu. Tuy nhieân ñieàu naøy chæ coù yù nghóa khi toác ñoä xöû lí cuûa CPU phaûi raát cao, vì vôùi caáu truùc ñoù, trong cuøng moät thôøi ñieåm CPU chæ coù theå töông taùc vôùi boä nhôù döõ lieäu hoaëc boä nhôù chöông trình. Nhö vaäy coù theå noùi kieán truùc Von-Neuman khoâng thích hôïp vôùi caáu truùc cuûa moät vi ñieàu khieån. Ñoái vôùi kieán truùc Havard, boä nhôù döõ lieäu vaø boä nhôù chöông trình taùch ra thaønh hai boä nhôù rieâng bieät. Do ñoù trong cuøng moät thôøi ñieåm CPU coù theå töông taùc vôùi caû hai boä nhôù, nhö vaäy toác ñoä xöû lí cuûa vi ñieàu khieån ñöôïc caûi thieän ñaùng keå. Moät ñieåm caàn chuù yù nöõa laø taäp leänh trong kieán truùc Havard coù theå ñöôïc toái öu tuøy theo yeâu caàu kieán truùc cuûa vi ñieàu khieån maø khoâng phuï thuoäc vaøo caáu truùc döõ lieäu. Ví duï, ñoái vôùi vi ñieàu khieån doøng 16F, ñoä daøi leänh luoân laø 14 bit (trong khi döõ lieäu ñöôïc toå chöùc thaønh töøng byte), coøn ñoái vôùi kieán truùc Von-Neuman, ñoä daøi leänh luoân laø boäi soá cuûa 1 byte (do döõ lieäu ñöôïc toå chöùc thaønh töøng byte). Ñaëc ñieåm naøy ñöôïc minh hoïa cuï theå trong hình 1.1. 1.4 RISC vaø CISC Nhö ñaõ trình baøy ôû treân, kieán truùc Havard laø khaùi nieäm môùi hôn so vôùi kieán truùc Von- Neuman. Khaùi nieäm naøy ñöôïc hình thaønh nhaèm caûi tieán toác ñoä thöïc thi cuûa moät vi ñieàu khieån. Qua vieäc taùch rôøi boä nhôù chöông trình vaø boä nhôù döõ lieäu, bus chöông trình vaø bus döõ lieäu, CPU coù theå cuøng moät luùc truy xuaát caû boä nhôù chöông trình vaø boä nhôù döõ lieäu, giuùp taêng toác ñoä xöû lí cuûa vi ñieàu khieån leân gaáp ñoâi. Ñoàng thôøi caáu truùc leänh khoâng coøn phuï thuoäc vaøo caáu truùc döõ lieäu nöõa maø coù theå linh ñoäng ñieàu chænh tuøy theo khaû naêng vaø toác ñoä cuûa töøng vi ñieàu
  8. khieån. Vaø ñeå tieáp tuïc caûi tieán toác ñoä thöïc thi leänh, taäp leänh cuûa hoï vi ñieàu khieån PIC ñöôïc thieát keá sao cho chieàu daøi maõ leänh luoân coá ñònh (ví duï ñoái vôùi hoï 16Fxxxx chieàu daøi maõ leänh luoân laø 14 bit) vaø cho pheùp thöïc thi leänh trong moät chu kì cuûa xung clock ( ngoaïi tröø moät soá tröôøng hôïp ñaëc bieät nhö leänh nhaûy, leänh goïi chöông trình con caàn hai chu kì xung ñoàng hoà). Ñieàu naøy coù nghóa taäp leänh cuûa vi ñieàu khieån thuoäc caáu truùc Havard seõ ít leänh hôn, ngaén hôn, ñôn giaûn hôn ñeå ñaùp öùng yeâu caàu maõ hoùa leänh baèng moät soá löôïng bit nhaát ñònh. Vi ñieàu khieån ñöôïc toå chöùc theo kieán truùc Havard coøn ñöôïc goïi laø vi ñieàu khieån RISC (Reduced Instruction Set Computer) hay vi ñieàu khieån coù taäp leänh ruùt goïn. Vi ñieàu khieån ñöôïc thieát keá theo kieán truùc Von-Neuman coøn ñöôïc goïi laø vi ñieàu khieån CISC (Complex Instruction Set Computer) hay vi ñieàu khieån coù taäp leänh phöùc taïp vì maõ leänh cuûa noù khoâng phaûi laø moät soá coá ñònh maø luoân laø boäi soá cuûa 8 bit (1 byte). 1.5 PIPELINING Ñaây chính laø cô cheá xöû lí leänh cuûa caùc vi ñieàu khieån PIC. Moät chu kì leänh cuûa vi ñieàu khieån seõ bao goàm 4 xung clock. Ví duï ta söû duïng oscillator coù taàn soá 4 MHZ, thì xung leänh seõ coù taàn soá 1 MHz (chu kì leänh seõ laø 1 us). Giaû söû ta coù moät ñoaïn chöông trình nhö sau: 1. MOVLW 55h 2. MOVWF PORTB 3. CALL SUB_1 4. BSF PORTA,BIT3 5. instruction @ address SUB_1 ÔÛ ñaây ta chæ baøn ñeán qui trình vi ñieàu khieån xöû lí ñoaïn chöông trình treân thoâng qua töøng chu kì leänh. Quaù trình treân seõ ñöôïc thöïc thi nhö sau: Hình 1.2: Cô cheá pipelining
  9. TCY0: ñoïc leänh 1 TCY1: thöïc thi leänh 1, ñoïc leänh 2 TCY2: thöïc thi leänh 2, ñoïc leänh 3 TCY3: thöïc thi leänh 3, ñoïc leänh 4. TCY4: vì leänh 4 khoâng phaûi laø leänh seõ ñöôïc thöïc thi theo qui trình thöïc thi cuûa chöông trình (leänh tieáp theo ñöôïc thöïc thi phaûi laø leänh ñaàu tieân taïi label SUB_1) neân chu kì thöïc thi leänh naøy chæ ñöôïc duøng ñeå ñoïc leänh ñaàu tieân taïi label SUB_1. Nhö vaäy coù theå xem leânh 3 caàn 2 chu kì xung clock ñeå thöïc thi. TCY5: thöïc thi leänh ñaàu tieân cuûa SUB_1 vaø ñoïc leänh tieáp theo cuûa SUB_1. Quaù trình naøy ñöôïc thöïc hieän töông töï cho caùc leänh tieáp theo cuûa chöông trình. Thoâng thöôøng, ñeå thöïc thi moät leänh, ta caàn moät chu kì leänh ñeå goïi leänh ñoù, vaø moät chu kì xung clock nöõa ñeå giaûi maõ vaø thöïc thi leänh. Vôùi cô cheá pipelining ñöôïc trình baøy ôû treân, moãi leänh xem nhö chæ ñöôïc thöïc thi trong moät chu kì leänh. Ñoái vôùi caùc leänh maø quaù trình thöïc thi noù laøm thay ñoåi giaù trò thanh ghi PC (Program Counter) caàn hai chu kì leänh ñeå thöïc thi vì phaûi thöïc hieän vieäc goïi leänh ôû ñòa chæ thanh ghi PC chæ tôùi. Sau khi ñaõ xaùc ñònh ñuùng vò trí leänh trong thanh ghi PC, moãi leänh chæ caàn moät chu kì leänh ñeå thöïc thi xong. 1.6 CAÙC DOØNG PIC VAØ CAÙCH LÖÏA CHOÏN VI ÑIEÀU KHIEÅN PIC Caùc kí hieäu cuûa vi ñieàu khieån PIC: PIC12xxxx: ñoä daøi leänh 12 bit PIC16xxxx: ñoä daøi leänh 14 bit PIC18xxxx: ñoä daøi leänh 16 bit C: PIC coù boä nhôù EPROM (chæ coù 16C84 laø EEPROM) F: PIC coù boä nhôù flash LF: PIC coù boä nhôù flash hoaït ñoäng ôû ñieän aùp thaáp LV: töông töï nhö LF, ñaây laø kí hieäu cuõ Beân caïnh ñoù moät soá vi ñieäu khieån coù kí hieäu xxFxxx laø EEPROM, neáu coù theâm chöõ A ôû cuoái laø flash (ví duï PIC16F877 laø EEPROM, coøn PIC16F877A laø flash). Ngoaøi ra coøn coù theâm moät doøng vi ñieàu khieån PIC môùi laø dsPIC. ÔÛ Vieät Nam phoå bieán nhaát laø caùc hoï vi ñieàu khieån PIC do haõng Microchip saûn xuaát. Caùch löïa choïn moät vi ñieàu khieån PIC phuø hôïp: Tröôùc heát caàn chuù yù ñeán soá chaân cuûa vi ñieàu khieån caàn thieát cho öùng duïng. Coù nhieàu vi ñieàu khieån PIC vôùi soá löôïng chaân khaùc nhau, thaäm chí coù vi ñieàu khieån chæ coù 8 chaân, ngoaøi ra coøn coù caùc vi ñieàu khieån 28, 40, 44, chaân.
  10. Caàn choïn vi ñieàu khieån PIC coù boä nhôù flash ñeå coù theå naïp xoùa chöông trình ñöôïc nhieàu laàn hôn. Tieáp theo caàn chuù yù ñeán caùc khoái chöùc naêng ñöôïc tích hôïp saün trong vi ñieàu khieån, caùc chuaån giao tieáp beân trong. Sau cuøng caàn chuù yù ñeán boä nhôù chöông trình maø vi ñieàu khieån cho pheùp. Ngoaøi ra moïi thoâng tin veà caùch löïa choïn vi ñieàu khieån PIC coù theå ñöôïc tìm thaáy trong cuoán saùch “Select PIC guide” do nhaø saûn xuaát Microchip cung caáp. 1.7 NGOÂN NGÖÕ LAÄP TRÌNH CHO PIC Ngoân ngöõ laäp trình cho PIC raát ña daïng. Ngoân ngöõ laäp trình caáp thaáp coù MPLAB (ñöôïc cung caáp mieãn phí bôûi nhaø saûn xuaát Microchip), caùc ngoân ngöõ laäp trình caáp cao hôn bao goàm C, Basic, Pascal, Ngoaøi ra coøn coù moät soá ngoân ngöõ laäp trình ñöôïc phaùt trieån daønh rieâng cho PIC nhö PICBasic, MikroBasic, 1.8 MAÏCH NAÏP PIC Ñaây cuõng laø moät doøng saûn phaåm raát ña daïng daønh cho vi ñieàu khieån PIC. Coù theå söû duïng caùc maïch naïp ñöôïc cung caáp bôûi nhaø saûn xuaát laø haõng Microchip nhö: PICSTART plus, MPLAB ICD 2, MPLAB PM 3, PRO MATE II. Coù theå duøng caùc saûn phaåm naøy ñeå naïp cho vi ñieàu khieån khaùc thoâng qua chöông trình MPLAB. Doøng saûn phaåm chính thoáng naøy coù öu theá laø naïp ñöôïc cho taát caû caùc vi ñieàu khieån PIC, tuy nhieân giaù thaønh raát cao vaø thöôøng gaëp raát nhieàu khoù khaên trong quaù trình mua saûn phaåm. Ngoaøi ra do tính naêng cho pheùp nhieàu cheá ñoä naïp khaùc nhau, coøn coù raát nhieàu maïch naïp ñöôïc thieát keá daønh cho vi ñieàu khieån PIC. Coù theå sô löôïc moät soá maïch naïp cho PIC nhö sau: JDM programmer: maïch naïp naøy duøng chöông trình naïp Icprog cho pheùp naïp caùc vi ñieàu khieån PIC coù hoã trôï tính naêng naïp chöông trình ñieän aùp thaáp ICSP (In Circuit Serial Programming). Haàu heát caùc maïch naïp ñeàu hoã trôï tính naêng naïp chöông trình naøy. WARP-13A vaø MCP-USB: hai maïch naïp naøy gioáng vôùi maïch naïp PICSTART PLUS do nhaø saûn xuaát Microchip cung caáp, töông thích vôùi trình bieân dòch MPLAB, nghóa laø ta coù theå tröïc tieáp duøng chöông trình MPLAB ñeå naïp cho vi ñieàu khieån PIC maø khoâng caàn söû duïng moät chöông trình naïp khaùc, chaúng haïn nhö ICprog. P16PRO40: maïch naïp naøy do Nigel thieát keá vaø cuõng khaù noåi tieáng. OÂng coøn thieát keá caû chöông trình naïp, tuy nhieân ta cuõng coù theå söû duïng chöông trình naïp Icprog.
  11. Maïch naïp Universal cuûa Williem: ñaây khoâng phaûi laø maïch naïp chuyeân duïng daønh cho PIC nhö P16PRO40. Caùc maïch naïp keå treân coù öu ñieåm raát lôùn laø ñôn giaûn, reû tieàn, hoaøn toaøn coù theå töï laép raùp moät caùch deã daøng, vaø moïi thoâng tin veà sô ñoà maïch naïp, caùch thieát keá, thi coâng, kieåm tra vaø chöông trình naïp ñeàu deã daøng tìm ñöôïc vaø download mieãn phí thoâng qua maïng Internet. Tuy nhieân caùc maïch naïp treân coù nhöôïc ñieåm laø haïn cheá veà soá vi ñieàu khieån ñöôïc hoã trôï, beân caïnh ñoù moãi maïch naïp caàn ñöôïc söû duïng vôùi moät chöông trình naïp thích hôïp. 1.9 BOOTLOADER VAØ ICP (In Circuit Programming)
  12. CHÖÔNG 2 VI ÑIEÀU KHIEÅN PIC16F877A 2.1 SÔ ÑOÀ CHAÂN VI ÑIEÀU KHIEÅN PIC16F877A Hình 2.1 Vi ñieàu khieån PIC16F877A/PIC16F874A vaø caùc daïng sô ñoà chaân
  13. 2.2 MOÄT VAØI THOÂNG SOÁ VEÀ VI ÑIEÀU KHIEÅN PIC16F877A Ñaây laø vi ñieàu khieån thuoäc hoï PIC16Fxxx vôùi taäp leänh goàm 35 leänh coù ñoä daøi 14 bit. Moãi leänh ñeàu ñöôïc thöïc thi trong moät chu kì xung clock. Toác ñoä hoaït ñoäng toái ña cho pheùp laø 20 MHz vôùi moät chu kì leänh laø 200ns. Boä nhôù chöông trình 8Kx14 bit, boä nhôù döõ lieäu 368x8 byte RAM vaø boä nhôù döõ lieäu EEPROM vôùi dung löôïng 256x8 byte. Soá PORT I/O laø 5 vôùi 33 pin I/O. Caùc ñaëc tính ngoaïi vi bao goàmcaùc khoái chöùc naêng sau: Timer0: boä ñeám 8 bit vôùi boä chia taàn soá 8 bit. Timer1: boä ñeám 16 bit vôùi boä chia taàn soá, coù theå thöïc hieän chöùc naêng ñeám döïa vaøo xung clock ngoaïi vi ngay khi vi ñieàu khieån hoaït ñoäng ôû cheá ñoä sleep. Timer2: boä ñeám 8 bit vôùi boä chia taàn soá, boä postcaler. Hai boä Capture/so saùnh/ñieàu cheá ñoä roâng xung. Caùc chuaån giao tieáp noái tieáp SSP (Synchronous Serial Port), SPI vaø I2C. Chuaån giao tieáp noái tieáp USART vôùi 9 bit ñòa chæ. Coång giao tieáp song song PSP (Parallel Slave Port) vôùi caùc chaân ñieàu khieån RD, WR, CS ôû beân ngoaøi. Caùc ñaëc tính Analog: 8 keânh chuyeån ñoåi ADC 10 bit. Hai boä so saùnh. Beân caïnh ñoù laø moät vaøi ñaëc tính khaùc cuûa vi ñieàu khieån nhö: Boä nhôù flash vôùi khaû naêng ghi xoùa ñöôïc 100.000 laàn. Boä nhôù EEPROM vôùi khaû naêng ghi xoùa ñöôïc 1.000.000 laàn. Döõ lieäu boä nhôù EEPROM coù theå löu tröõ treân 40 naêm. Khaû naêng töï naïp chöông trình vôùi söï ñieàu khieån cuûa phaàn meàm. Naïp ñöôïc chöông trình ngay treân maïch ñieän ICSP (In Circuit Serial Programming) thoâng qua 2 chaân. Watchdog Timer vôùi boä dao ñoäng trong. Chöùc naêng baûo maät maõ chöông trình. Cheá ñoä Sleep. Coù theå hoaït ñoäng vôùi nhieàu daïng Oscillator khaùc nhau.
  14. 2.3 SÔ ÑOÀ KHOÁI VI ÑIEÀU KHIEÅN PIC16F877A Hình 2.2 Sô ñoà khoái vi ñieàu khieån PIC16F877A.
  15. 2.4 TOÅ CHÖÙC BOÄ NHÔÙ Caáu truùc boä nhôù cuûa vi ñieàu khieån PIC16F877A bao goàm boä nhôù chöông trình (Program memory) vaø boä nhôù döõ lieäu (Data Memory). 2.4.1 BOÄ NHÔÙ CHÖÔNG TRÌNH Boä nhôù chöông trình cuûa vi ñieàu khieån PIC16F877A laø boä nhôù flash, dung löôïng boä nhôù 8K word (1 word = 14 bit) vaø ñöôïc phaân thaønh nhieàu trang (töø page0 ñeán page 3) . Nhö vaäy boä nhôù chöông trình coù khaû naêng chöùa ñöôïc 8*1024 = 8192 leänh (vì moät leänh sau khi maõ hoùa seõ coù dung löôïng 1 word (14 bit). Ñeå maõ hoùa ñöôïc ñòa chæ cuûa 8K word boä nhôù chöông trình, boä ñeám chöông trình coù dung löôïng 13 bit (PC ). Khi vi ñieàu khieån ñöôïc reset, boä ñeám chöông trình seõ chæ ñeán ñòa chæ 0000h (Reset vector). Khi coù ngaét xaûy ra, boä ñeám chöông trình seõ chæ ñeán ñòa chæ 0004h (Interrupt vector). Boä nhôù chöông trình khoâng bao goàm boä nhôù stack vaø khoâng ñöôïc ñòa chæ hoùa bôûi boä ñeám chöông trình. Boä nhôù stack seõ ñöôïc ñeà caäp cuï theå trong phaàn sau. Hình 2.3 Boä nhôù chöông trình PIC16F877A 2.4.2 BOÄ NHÔÙ DÖÕ LIEÄU Boä nhôù döõ lieäu cuûa PIC laø boä nhôù EEPROM ñöôïc chia ra laøm nhieàu bank. Ñoái vôùi PIC16F877A boä nhôù döõ lieäu ñöôïc chia ra laøm 4 bank. Moãi bank coù dung löôïng 128 byte, bao goàm caùc thanh ghi coù chöùc naêng ñaëc bieät SFG (Special Function Register) naèm ôû caùc vuøng ñòa chæ thaáp vaø caùc thanh ghi muïc ñích chung GPR (General Purpose Register) naèm ôû vuøng ñòa chæ coøn laïi trong bank. Caùc thanh ghi SFR thöôøng xuyeân ñöôïc söû duïng (ví duï nhö thanh ghi STATUS) seõ ñöôïc ñaët ôû taát caø caùc bank cuûa boä nhôù döõ lieäu giuùp thuaän tieän trong quaù trình truy xuaát vaø laøm giaûm bôùt leänh cuûa chöông trình. Sô ñoà cuï theå cuûa boä nhôù döõ lieäu PIC16F877A nhö sau:
  16. Hình 2.4 Sô ñoà boä nhôù döõ lieäu PIC16F877A
  17. 2.4.2.1 THANH GHI CHÖÙC NAÊNG ÑAËC BIEÄT SFR Ñaây laø caùc thanh ghi ñöôïc söû duïng bôûi CPU hoaëc ñöôïc duøng ñeå thieát laäp vaø ñieàu khieån caùc khoái chöùc naêng ñöôïc tích hôïp beân trong vi ñieàu khieån. Coù theå phaân thanh ghi SFR laøm hai loïai: thanh ghi SFR lieân quan ñeán caùc chöùc naêng beân trong (CPU) vaø thanh ghi SRF duøng ñeå thieát laäp vaø ñieàu khieån caùc khoái chöùc naêng beân ngoaøi (ví duï nhö ADC, PWM, ). Phaàn naøy seõ ñeà caäp ñeán caùc thanh ghi lieân quan ñeán caùc chöùc naêng beân trong. Caùc thanh ghi duøng ñeå thieát laäp vaø ñieàu khieån caùc khoái chöùc naêng seõ ñöôïc nhaéc ñeán khi ta ñeà caäp ñeán caùc khoái chöùc naêng ñoù. Chi tieát veà caùc thanh ghi SFR seõ ñöôïc lieät keâ cuï theå trong baûng phuï luïc 2. Thanh ghi STATUS (03h, 83h, 103h, 183h):thanh ghi chöùa keát quaû thöïc hieän pheùp toaùn cuûa khoái ALU, traïng thaùi reset vaø caùc bit choïn bank caàn truy xuaát trong boä nhôù döõ lieäu. Thanh ghi OPTION_REG (81h, 181h): thanh ghi naøy cho pheùp ñoïc vaø ghi, cho pheùp ñieàu khieån chöùc naêng pull-up cuûa caùc chaân trong PORTB, xaùc laäp caùc tham soá veà xung taùc ñoäng, caïnh taùc ñoäng cuûa ngaét ngoaïi vi vaø boä ñeám Timer0. Thanh ghi INTCON (0Bh, 8Bh,10Bh, 18Bh):thanh ghi cho pheùp ñoïc vaø ghi, chöùa caùc bit ñieàu khieån vaø caùc bit côø hieäu khi timer0 bò traøn, ngaét ngoaïi vi RB0/INT vaø ngaét interrput- on-change taïi caùc chaân cuûa PORTB. Thanh ghi PIE1 (8Ch): chöùa caùc bit ñieàu khieån chi tieát caùc ngaét cuûa caùc khoái chöùc naêng ngoaïi vi. Thanh ghi PIR1 (0Ch) chöùa côø ngaét cuûa caùc khoái chöùc naêng ngoaïi vi, caùc ngaét naøy ñöôïc cho pheùp bôûi caùc bit ñieàu khieån chöùa trong thanh ghi PIE1. Thanh ghi PIE2 (8Dh): chöùa caùc bit ñieàu khieån caùc ngaét cuûa caùc khoái chöùc naêng CCP2, SSP bus, ngaét cuûa boä so saùnh vaø ngaét ghi vaøo boä nhôù EEPROM.
  18. Thanh ghi PIR2 (0Dh): chöùa caùc côø ngaét cuûa caùc khoái chöùc naêng ngoaïi vi, caùc ngaét naøy ñöôïc cho pheùp bôûi caùc bit ñieàu khieån chöùa trong thanh ghi PIE2. Thanh ghi PCON (8Eh): chöùa caùc côø hieäu cho bieát traïng thaùi caùc cheá ñoä reset cuûa vi ñieàu khieån. 2.4.2.2 THANH GHI MUÏC ÑÍCH CHUNG GPR Caùc thanh ghi naøy coù theå ñöôïc truy xuaát tröïc tieáp hoaëc giaùn tieáp thoâng qua thanh ghi FSG (File Select Register). Ñaây laø caùc thanh ghi döõ lieäu thoâng thöôøng, ngöôøi söû duïng coù theå tuøy theo muïc ñích chöông trình maø coù theå duøng caùc thanh ghi naøy ñeå chöùa caùc bieán soá, haèng soá, keát quaû hoaëc caùc tham soá phuïc vuï cho chöông trình. 2.4.3 STACK Stack khoâng naèm trong boä nhôù chöông trình hay boä nhôù döõ lieäu maø laø moät vuøng nhôù ñaëc bieät khoâng cho pheùp ñoïc hay ghi. Khi leänh CALL ñöôïc thöïc hieän hay khi moät ngaét xaûy ra laøm chöông trình bò reõ nhaùnh, giaù trò cuûa boä ñeám chöông trình PC töï ñoäng ñöôïc vi ñieàu khieån caát vaøo trong stack. Khi moät trong caùc leänh RETURN, RETLW hat RETFIE ñöôïc thöïc thi, giaù trò PC seõ töï ñoäng ñöôïc laáy ra töø trong stack, vi ñieàu khieån seõ thöïc hieän tieáp chöông trình theo ñuùng qui trình ñònh tröôùc. Boä nhôù Stack trong vi ñieàu khieån PIC hoï 16F87xA coù khaû naêng chöùa ñöôïc 8 ñòa chæ vaø hoaït ñoäng theo cô cheá xoay voøng. Nghóa laø giaù trò caát vaøo boä nhôù Stack laàn thöù 9 seõ ghi ñeø leân giaù trò caát vaøo Stack laàn ñaàu tieân vaø giaù trò caát vaøo boä nhôù Stack laàn thöù 10 seõ ghi ñeø leân giaù tri6 caát vaøo Stack laàn thöù 2. Caàn chuù yù laø khoâng coù côø hieäu naøo cho bieát traïng thaùi stack, do ñoù ta khoâng bieát ñöôïc khi naøo stack traøn. Beân caïnh ñoù taäp leänh cuûa vi ñieàu khieån doøng PIC cuõng khoâng coù leänh POP hay PUSH, caùc thao taùc vôùi boä nhôù stack seõ hoaøn toaøn ñöôïc ñieàu khieån bôûi CPU.
  19. 2.5 CAÙC COÅNG XUAÁT NHAÄP CUÛA PIC16F877A Coång xuaát nhaäp (I/O port) chính laø phöông tieän maø vi ñieàu khieån duøng ñeå töông taùc vôùi theá giôùi beân ngoaøi. Söï töông taùc naøy raát ña daïng vaø thoâng qua quaù trình töông taùc ñoù, chöùc naêng cuûa vi ñieàu khieån ñöôïc theå hieän moät caùch roõ raøng. Moät coång xuaát nhaäp cuûa vi ñieàu khieån bao goàm nhieàu chaân (I/O pin), tuøy theo caùch boá trí vaø chöùc naêng cuûa vi ñieàu khieån maø soá löôïng coång xuaát nhaäp vaø soá löôïng chaân trong moãi coång coù theå khaùc nhau. Beân caïnh ñoù, do vi ñieàu khieån ñöôïc tích hôïp saün beân trong caùc ñaëc tính giao tieáp ngoaïi vi neân beân caïnh chöùc naêng laø coång xuaát nhaäp thoâng thöôøng, moät soá chaân xuaát nhaäp coøn coù theâm caùc chöùc naêng khaùc ñeå theå hieän söï taùc ñoäng cuûa caùc ñaëc tính ngoaïi vi neâu treân ñoái vôùi theá giôùi beân ngoaøi. Chöùc naêng cuûa töøng chaân xuaát nhaäp trong moãi coång hoaøn toaøn coù theå ñöôïc xaùc laäp vaø ñieàu khieån ñöôïc thoâng qua caùc thanh ghi SFR lieân quan ñeán chaân xuaát nhaäp ñoù. Vi ñieàu khieån PIC16F877A coù 5 coång xuaát nhaäp, bao goàm PORTA, PORTB, PORTC, PORTD vaø PORTE. Caáu truùc vaø chöùc naêng cuûa töøng coång xuaát nhaäp seõ ñöôïc ñeà caäp cuï theå trong phaàn sau. 2.5.1 PORTA PORTA (RPA) bao goàm 6 I/O pin. Ñaây laø caùc chaân “hai chieàu” (bidirectional pin), nghóa laø coù theå xuaát vaø nhaäp ñöôïc. Chöùc naêng I/O naøy ñöôïc ñieàu khieån bôûi thanh ghi TRISA (ñòa chæ 85h). Muoán xaùc laäp chöùc naêng cuûa moät chaân trong PORTA laø input, ta “set” bit ñieàu khieån töông öùng vôùi chaân ñoù trong thanh ghi TRISA vaø ngöôïc laïi, muoán xaùc laäp chöùc naêng cuûa moät chaân trong PORTA laø output, ta “clear” bit ñieàu khieån töông öùng vôùi chaân ñoù trong thanh ghi TRISA. Thao taùc naøy hoaøn toaøn töông töï ñoái vôùi caùc PORT vaø caùc thanh ghi ñieàu khieån töông öùng TRIS (ñoái vôùi PORTA laø TRISA, ñoái vôùi PORTB laø TRISB, ñoái vôùi PORTC laø TRISC, ñoái vôùi PORTD laø TRISD vaøñoái vôùi PORTE laø TRISE). Beân caïnh ñoù PORTA coøn laø ngoõ ra cuûa boä ADC, boä so saùnh, ngoõ vaøo analog ngoõ vaøo xung clock cuûa Timer0 vaø ngoõ vaøo cuûa boä giao tieáp MSSP (Master Synchronous Serial Port). Ñaëc tính naøy seõ ñöôïc trình baøy cuï theå trong phaàn sau. Caáu truùc beân trong vaø chöùc naêng cuï theå cuûa töøng chaân trong PORTA seõ ñöôïc trình baøy cuï theå trong Phuï luïc 1. Caùc thanh ghi SFR lieân quan ñeán PORTA bao goàm: PORTA (ñòa chæ 05h) : chöùa giaù trò caùc pin trong PORTA. TRISA (ñòa chæ 85h) : ñieàu khieån xuaát nhaäp. CMCON (ñòa chæ 9Ch) : thanh ghi ñieàu khieån boä so saùnh. CVRCON (ñòa chæ 9Dh) : thanh ghi ñieàu khieån boä so saùnh ñieän aùp.
  20. ADCON1 (ñòa chæ 9Fh) : thanh ghi ñieàu khieån boä ADC. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. 2.5.2 PORTB PORTB (RPB) goàm 8 pin I/O. Thanh ghi ñieàu khieån xuaát nhaäp töông öùng laø TRISB. Beân caïnh ñoù moät soá chaân cuûa PORTB coøn ñöôïc söû duïng trong quaù trình naïp chöông trình cho vi ñieàu khieån vôùi caùc cheá ñoä naïp khaùc nhau. PORTB coøn lieân quan ñeán ngaét ngoaïi vi vaø boä Timer0. PORTB coøn ñöôïc tích hôïp chöùc naêng ñieän trôû keùo leân ñöôïc ñieàu khieån bôûi chöông trình. Caáu truùc beân trong vaø chöùc naêng cuï theå cuûa töøng chaân trong PORTB seõ ñöôïc trình baøy cuï theå trong Phuï luïc 1. Caùc thanh ghi SFR lieân quan ñeán PORTB bao goàm: PORTB (ñòa chæ 06h,106h) : chöùa giaù trò caùc pin trong PORTB TRISB (ñòa chæ 86h,186h) : ñieàu khieån xuaát nhaäp OPTION_REG (ñòa chæ 81h,181h) : ñieàu khieån ngaét ngoaïi vi vaø boä Timer0. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. 2.5.3 PORTC PORTC (RPC) goàm 8 pin I/O. Thanh ghi ñieàu khieån xuaát nhaäp töông öùng laø TRISC. Beân caïnh ñoù PORTC coøn chöùa caùc chaân chöùc naêng cuûa boä so saùnh, boä Timer1, boä PWM vaø caùc chuaån giao tieáp noái tieáp I2C, SPI, SSP, USART. Caáu truùc beân trong vaø chöùc naêng cuï theå cuûa töøng chaân trong PORTC seõ ñöôïc trình baøy cuï theå trong Phuï luïc 1. Caùc thanh ghi ñieàu khieån lieân quan ñeán PORTC: PORTC (ñòa chæ 07h) : chöùa giaù trò caùc pin trong PORTC TRISC (ñòa chæ 87h) : ñieàu khieån xuaát nhaäp. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. 2.5.4 PORTD PORTD (RPD) goàm 8 chaân I/O, thanh ghi ñieàu khieån xuaát nhaäp töông öùng laø TRISD. PORTD coøn laø coång xuaát döõ lieäu cuûa chuaån giao tieáp PSP (Parallel Slave Port). Caáu truùc beân trong vaø chöùc naêng cuï theå cuûa töøng chaân trong PORTD seõ ñöôïc trình baøy cuï theå trong Phuï luïc 1. Caùc thanh ghi lieân quan ñeán PORTD bao goàm: Thanh ghi PORTD : chöùa giaù trò caùc pin trong PORTD. Thanh ghi TRISD : ñieàu khieån xuaát nhaäp. Thanh ghi TRISE : ñieàu khieån xuaát nhaäp PORTE vaø chuaån giao tieáp PSP. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2.
  21. 2.5.5 PORTE PORTE (RPE) goàm 3 chaân I/O. Thanh ghi ñieàu khieån xuaát nhaäp töông öùng laø TRISE. Caùc chaân cuûa PORTE coù ngoõ vaøo analog. Beân caïnh ñoù PORTE coøn laø caùc chaân ñieàu khieån cuûa chuaån giao tieáp PSP. Caáu truùc beân trong vaø chöùc naêng cuï theå cuûa töøng chaân trong PORTE seõ ñöôïc trình baøy cuï theå trong Phuï luïc 1. Caùc thanh ghi lieân quan ñeán PORTE bao goàm: PORTE : chöùa giaù trò caùc chaân trong PORTE. TRISE : ñieàu khieån xuaát nhaäp vaø xaùc laäp caùc thoâng soá cho chuaån giao tieáp PSP. ADCON1 : thanh ghi ñieàu khieån khoái ADC. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. 2.6 TIMER 0 Ñaây laø moät trong ba boä ñeám hoaëc boä ñònh thôøi cuûa vi ñieàu khieån PIC16F877A. Timer0 laø boä ñeám 8 bit ñöôïc keát noái vôùi boä chia taàn soá (prescaler) 8 bit. Caáu truùc cuûa Timer0 cho pheùp ta löïa choïn xung clock taùc ñoäng vaø caïnh tích cöïc cuûa xung clock. Ngaét Timer0 seõ xuaát hieän khi Timer0 bò traøn. Bit TMR0IE (INTCON ) laø bit ñieàu khieån cuûa Timer0. TMR0IE=1 cho pheùp ngaét Timer0 taùc ñoäng, TMR0IF= 0 khoâng cho pheùp ngaét Timer0 taùc ñoäng. Sô ñoà khoái cuûa Timer0 nhö sau: Hình 2.5 Sô ñoà khoái cuûa Timer0.
  22. Muoán Timer0 hoaït ñoäng ôû cheá ñoä Timer ta clear bit TOSC (OPTION_REG ), khi ñoù giaù trò thanh ghi TMR0 seõ taêng theo töøng chu kì xung ñoàng hoà (taàn soá vaøo Timer0 baèng ¼ taàn soá oscillator). Khi giaù trò thanh ghi TMR0 töø FFh trôû veà 00h, ngaét Timer0 seõ xuaát hieän. Thanh ghi TMR0 cho pheùp ghi vaø xoùa ñöôïc giuùp ta aán ñònh thôøi ñieåm ngaét Timer0 xuaát hieän moät caùch linh ñoäng. Muoán Timer0 hoaït ñoäng ôû cheá ñoä counter ta set bit TOSC (OPTION_REG ). Khi ñoù xung taùc ñoäng leân boä ñeám ñöôïc laáy töø chaân RA4/TOCK1. Bit TOSE (OPTION_REG ) cho pheùp löïa choïn caïnh taùc ñoäng vaøo boät ñeám. Caïnh taùc ñoäng seõ laø caïnh leân neáu TOSE=0 vaø caïnh taùc ñoäng seõ laø caïnh xuoáng neáu TOSE=1. Khi thanh ghi TMR0 bò traøn, bit TMR0IF (INTCON ) seõ ñöôïc set. Ñaây chính laø côø ngaét cuûa Timer0. Côø ngaét naøy phaûi ñöôïc xoùa baèng chöông trình tröôùc khi boä ñeám baét ñaàu thöïc hieän laïi quaù trình ñeám. Ngaét Timer0 khoâng theå “ñaùnh thöùc” vi ñieàu khieån töø cheá ñoä sleep. Boä chia taàn soá (prescaler) ñöôïc chia seû giöõa Timer0 vaø WDT (Watchdog Timer). Ñieàu ñoù coù nghóa laø neáu prescaler ñöôïc söû duïng cho Timer0 thì WDT seõ khoâng coù ñöôïc hoã trôï cuûa prescaler vaø ngöôïc laïi. Prescaler ñöôïc ñieàu khieån bôûi thanh ghi OPTION_REG. Bit PSA (OPTION_REG ) xaùc ñònh ñoái töôïng taùc ñoäng cuûa prescaler. Caùc bit PS2:PS0 (OPTION_REG ) xaùc ñònh tæ soá chia taàn soá cuûa prescaler. Xem laïi thanh ghi OPTION_REG ñeå xaùc ñònh laïi moät caùch chi tieát veà caùc bit ñieàu khieån treân. Caùc leänh taùc ñoäng leân giaù trò thanh ghi TMR0 seõ xoùa cheá ñoä hoaït ñoäng cuûa prescaler. Khi ñoái töôïng taùc ñoäng laø Timer0, taùc ñoäng leân giaù trò thanh ghi TMR0 seõ xoùa prescaler nhöng khoâng laøm thay ñoåi ñoái töôïng taùc ñoäng cuûa prescaler. Khi ñoái töôïng taùc ñoäng laø WDT, leänh CLRWDT seõ xoùa prescaler, ñoàng thôøi prescaler seõ ngöng taùc vuï hoã trôï cho WDT. Caùc thanh ghi ñieàu khieån lieân quan ñeán Timer0 bao goàm: TMR0 (ñòa chæ 01h, 101h) : chöùa giaù trò ñeám cuûa Timer0. INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp ngaét hoaït ñoäng (GIE vaø PEIE). OPTION_REG (ñòa chæ 81h, 181h): ñieàu khieån prescaler. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. 2.7 TIMER1 Timer1 laø boä ñònh thôøi 16 bit, giaù trò cuûa Timer1 seõ ñöôïc löu trong hai thanh ghi (TMR1H:TMR1L). Côø ngaét cuûa Timer1 laø bit TMR1IF (PIR1 ). Bit ñieàu khieån cuûa Timer1 seõ laø TMR1IE (PIE ). Töông töï nhö Timer0, Timer1 cuõng coù hai cheá ñoä hoaït ñoäng: cheá ñoä ñònh thôøi (timer) vôùi xung kích laø xung clock cuûa oscillator (taàn soá cuûa timer baèng ¼ taàn soá cuûa oscillator) vaø cheá ñoä ñeám (counter) vôùi xung kích laø xung phaûn aùnh caùc söï kieän caàn ñeám laáy töø beân ngoaøi
  23. thoâng qua chaân RC0/T1OSO/T1CKI (caïnh taùc ñoäng laø caïnh leân). Vieäc löïa choïn xung taùc ñoäng (töông öùng vôùi vieäc löïa choïn cheá ñoä hoaït ñoäng laø timer hay counter) ñöôïc ñieàu khieån bôûi bit TMR1CS (T1CON ). Sau ñaây laø sô ñoà khoái cuûa Timer1: Hình 2.6 Sô ñoà khoái cuûa Timer1. Ngoaøi ra Timer1 coøn coù chöùc naêng reset input beân trong ñöôïc ñieàu khieån bôûi moät trong hai khoái CCP (Capture/Compare/PWM). Khi bit T1OSCEN (T1CON ) ñöôïc set, Timer1 seõ laáy xung clock töø hai chaân RC1/T1OSI/CCP2 vaø RC0/T1OSO/T1CKI laøm xung ñeám. Timer1 seõ baét ñaàu ñeám sau caïnh xuoáng ñaàu tieân cuûa xung ngoõ vaøo. Khi ñoù PORTC seõ boû qua söï taùc ñoäng cuûa hai bit TRISC vaø PORTC ñöôïc gaùn giaù trò 0. Khi clear bit T1OSCEN Timer1 seõ laáy xung ñeám töø oscillator hoaëc töø chaân RC0/T1OSO/T1CKI. Timer1 coù hai cheá ñoä ñeám laø ñoàng boä (Synchronous) vaø baát ñoàng boä (Asynchronous). Cheá ñoä ñeám ñöôïc quyeát ñònh bôûi bit ñieàu khieån (T1CON ). Khi =1 xung ñeám laáy töø beân ngoaøi seõ khoâng ñöôïc ñoàng boä hoùa vôùi xung clock beân trong, Timer1 seõ tieáp tuïc quaù trình ñeám khi vi ñieàu khieån ñang ôû cheá ñoä sleep vaø ngaét do Timer1 taïo ra khi bò traøn coù khaû naêng “ñaùnh thöùc” vi ñieàu khieån. ÔÛ cheá ñoä ñeám baát ñoàng boä, Timer1 khoâng theå ñöôïc söû duïng ñeå laøm nguoàn xung clock cho khoái CCP (Capture/Compare/Pulse width modulation). Khi =0 xung ñeám vaøo Timer1 seõ ñöôïc ñoàng boä hoùa vôùi xung clock beân trong. ÔÛ cheá ñoä naøy Timer1 seõ khoâng hoaït ñoäng khi vi ñieàu khieån ñang ôû cheá ñoä sleep. Caùc thanh ghi lieân quan ñeán Timer1 bao goàm: INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp ngaét hoaït ñoäng (GIE vaø PEIE). PIR1 (ñòa chæ 0Ch): chöùa côø ngaét Timer1 (TMR1IF). PIE1( ñòa chæ 8Ch): cho pheùp ngaét Timer1 (TMR1IE). TMR1L (ñòa chæ 0Eh): chöùa giaù trò 8 bit thaáp cuûa boä ñeám Timer1. TMR1H (ñòa chæ 0Eh): chöùa giaù trò 8 bit cao cuûa boä ñeám Timer1. T1CON (ñòa chæ 10h): xaùc laäp caùc thoâng soá cho Timer1. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2.
  24. 2.8 TIMER2 Timer2 laø boä ñònh thôøi 8 bit vaø ñöôïc hoã trôï bôûi hai boä chia taàn soá prescaler va postscaler. Thanh ghi chöùa giaù trò ñeám cuûa Timer2 laø TMR2. Bit cho pheùp ngaét Timer2 taùc ñoäng laø TMR2ON (T2CON ). Côø ngaét cuûa Timer2 laø bit TMR2IF (PIR1 ). Xung ngoõ vaøo (taàn soá baèng ¼ taàn soá oscillator) ñöôïc ñöa qua boä chia taàn soá prescaler 4 bit (vôùi caùc tæ soá chia taàn soá laø 1:1, 1:4 hoaëc 1:16 vaø ñöôïc ñieàu khieån bôûi caùc bit T2CKPS1:T2CKPS0 (T2CON )). Hình 2.7 Sô ñoà khoái Timer2. Timer2 coøn ñöôïc hoã trôï bôûi thanh ghi PR2. Giaù trò ñeám trong thanh ghi TMR2 seõ taêng töø 00h ñeán giaù trò chöùa trong thanh ghi PR2, sau ñoù ñöôïc reset veà 00h. Kh I reset thanh ghi PR2 ñöôïc nhaän giaù trò maëc ñònh FFh. Ngoõ ra cuûa Timer2 ñöôïc ñöa qua boä chia taàn soá postscaler vôùi caùc möùc chia töø 1:1 ñeán 1:16. Postscaler ñöôïc ñieàu khieån bôûi 4 bit T2OUTPS3:T2OUTPS0. Ngoõ ra cuûa postscaler ñoùng vai troø quyeát ñònh trong vieäc ñieàu khieån côø ngaét. Ngoaøi ra ngoõ ra cuûa Timer2 coøn ñöôïc keát noái vôùi khoái SSP, do ñoù Timer2 coøn ñoùng vai troø taïo ra xung clock ñoàng boä cho khoái giao tieáp SSP. Caùc thanh ghi lieân quan ñeán Timer2 bao goàm: INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp toaøn boä caùc ngaét (GIE vaø PEIE). PIR1 (ñòa chæ 0Ch): chöùa côø ngaét Timer2 (TMR2IF). PIE1 (ñòa chò 8Ch): chöùa bit ñieàu khieån Timer2 (TMR2IE). TMR2 (ñòa chæ 11h): chöùa giaù trò ñeám cuûa Timer2. T2CON (ñòa chæ 12h): xaùc laäp caùc thoâng soá cho Timer2.
  25. PR2 (ñòa chæ 92h): thanh ghi hoã trôï cho Timer2. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. Ta coù moät vaøi nhaän xeùt veà Timer0, Timer1 vaø Timer2 nhö sau: Timer0 vaø Timer2 laø boä ñeám 8 bit (giaù trò ñeám toái ña laø FFh), trong khi Timer1 laø boä ñeám 16 bit (giaù trò ñeám toái ña laø FFFFh). Timer0, Timer1 vaø Timer2 ñeàu coù hai cheá ñoä hoaït ñoäng laø timer vaø counter. Xung clock coù taàn soá baèng ¼ taàn soá cuûa oscillator. Xung taùc ñoäng leân Timer0 ñöôïc hoã trôï bôûi prescaler vaø coù theå ñöôïc thieát laäp ôû nhieàu cheá ñoä khaùc nhau (taàn soá taùc ñoäng, caïnh taùc ñoäng) trong khi caùc thoâng soá cuûa xung taùc ñoäng leân Timer1 laø coá ñònh. Timer2 ñöôïc hoã trôï bôûi hai boä chia taàn soá prescaler vaø postcaler ñoäc laäp, tuy nhieân caïnh taùc ñoäng vaãn ñöôïc coá ñònh laø caïnh leân. Timer1 coù quan heä vôùi khoái CCP, trong khi Timer2 ñöôïc keát noái vôùi khoái SSP. Moät vaøi so saùnh seõ giuùp ta deã daøng löïa choïn ñöôïc Timer thích hôïp cho öùng duïng. 2.9 ADC ADC (Analog to Digital Converter) laø boä chuyeån ñoåi tín hieäu giöõa hai daïng töông töï vaø soá. PIC16F877A coù 8 ngoõ vaøo analog (RA4:RA0 vaø RE2:RE0). Hieäu ñieän theá chuaån VREF coù theå ñöôïc löïa choïn laø VDD, VSS hay hieäu ñieän theå chuaån ñöôïc xaùc laäp treân hai chaân RA2 vaø RA3. Keát quaû chuyeån ñoåi töø tín tieäu töông töï sang tín hieäu soá laø 10 bit soá töông öùng vaø ñöôïc löu trong hai thanh ghi ADRESH:ADRESL. Khi khoâng söû duïng boä chuyeån ñoåi ADC, caùc thanh ghi naøy coù theå ñöôïc söû duïng nhö caùc thanh ghi thoâng thöôøng khaùc. Khi quaù trình chuyeån ñoåi hoaøn taát, keát quaû seõ ñöôïc löu vaøo hai thanh ghi ADRESH:ADRESL, bit (ADCON0 ) ñöôïc xoùa veà 0 vaø côø ngaét ADIF ñöôïc set. Qui trình chuyeån ñoåi töø töông töï sang soá bao goàm caùc böôùc sau: 1. Thieát laäp caùc thoâng soá cho boä chuyeån ñoåi ADC: Choïn ngoõ vaøo analog, choïn ñieän aùp maãu (döïa treân caùc thoâng soá cuûa thanh ghi ADCON1) Choïnh keânh chuyeån ñoåi AD (thanh ghi ADCON0). Choïnh xung clock cho keânh chuyeån ñoåi AD (thanh ghi ADCON0). Cho pheùp boä chuyeån ñoåi AD hoaït ñoäng (thanh ghi ADCON0). 2. Thieát laäp caùc côø ngaét cho boä AD Clear bit ADIF. Set bit ADIE. Set bit PEIE. Set bit GIE.
  26. 3. Ñôïi cho tôùi khi quaù trình laáy maãu hoaøn taát. 4. Baét ñaàu quaù trình chuyeån ñoåi (set bit ). 5. Ñôïi cho tôùi khi quaù trình chuyeån ñoåi hoaøn taát baèng caùch: Kieåm tra bit . Neáu =0, quaù trình chuyeån ñoåi ñaõ hoaøn taát. Kieåm tra côø ngaét. 6. Ñoïc keát quaû chuyeån ñoåi vaø xoùa côø ngaét, set bit (neáu caàn tieáp tuïc chuyeån ñoåi). 7. Tieáp tuïc thöïc hieän caùc böôùc 1 vaø 2 cho quaù trình chuyeån ñoåi tieáp theo. Hình 2.8 Sô ñoà khoái boä chuyeån ñoåi ADC. Caàn chuù yù laø coù hai caùch löu keát quaû chuyeån ñoåi AD, vieäc löïa choïn caùch löu ñöôïc ñieàu khieån bôûi bit ADFM vaø ñöôïc minh hoïa cuï theå trong hình sau:
  27. Hình 2.9 Caùc caùch löu keát quaû chuyeån ñoåi AD. Caùc thanh ghi lieân quan ñeán boä chuyeån ñoåi ADC bao goàm: INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp caùc ngaét (caùc bit GIE, PEIE). PIR1 (ñòa chæ 0Ch): chöùa côø ngaét AD (bit ADIF). PIE1 (ñòa chæ 8Ch): chöùa bit ñieàu khieån AD (ADIE). ADRESH (ñòa chæ 1Eh) vaø ADRESL (ñòa chæ 9Eh): caùc thanh ghi chöùa keát quaû chuyeån ñoåi AD. ADCON0 (ñòa chæ 1Fh) vaø ADCON1 (ñòa chæ 9Fh): xaùc laäp caùc thoâng soá cho boä chuyeån ñoåi AD. PORTA (ñòa chæ 05h) vaø TRISA (ñòa chæ 85h): lieân quan ñeán caùc ngoõ vaøo analog ôû PORTA. PORTE (ñòa chæ 09h) vaø TRISE (ñòa chæ 89h): lieân quan ñeán caùc ngoõ vaøo analog ôû PORTE. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.10 COMPARATOR Boä so saùnh bao goàm hai boä so so saùnh tín hieäu analog vaø ñöôïc ñaët ôû PORTA. Ngoõ vaøo boä so saùnh laø caùc chaân RA3:RA0, ngoõ ra laø hai chaân RA4 vaø RA5. Thanh ghi ñieàu khieån boä so saùnh laø CMCON. Caùc bit CM2:CM0 trong thanh ghi CMCON ñoùng vai troø choïn löïa caùc cheá ñoä hoaït ñoäng cho boä Comparator (hình 2.10). Cô cheá hoaït ñoäng cuûa boä Comparator nhö sau:
  28. Tín hieäu analog ôû chaân VIN + seõ ñöôïc soù saùnh vôùi ñieän aùp chuaån ôû chaân VIN- vaø tín hieäu ôû ngoõ ra boä so saùnh seõ thay ñoåi töông öùng nhö hình veõ. Khi ñieän aùp ôû chaân VIN+ lôùn hôn ñieän aùp ôû chaân VIN+ ngoõ ra seõ ôû möùc 1 vaø ngöôïc laïi. Döïa vaøo hình veõ ta thaáy ñaùp öùng taïi ngoõ ra khoâng phaûi laø töùc thôøi so vôùi thay ñoåi taïi ngoõ vaøo maø caàn coù moät khoaûng thôøi gian nhaát ñònh ñeå ngoõ ra thay ñoåi traïng thaùi (toái ña laø 10 us). Caàn chuù yù ñeán khoaûng thôøi gian ñaùp öùng naøy khi söû duïng boä so saùnh. Cöïc tính cuûa caùc boä so saùnh coù theå thay ñoåi döïa vaøo caùc giaù trò ñaët vaøo caùc bit C2INV vaø C1INV (CMCON ). Hình 2.10 Nguyeân lí hoaït ñoäng cuûa moät boä so saùnh ñôn giaûn.
  29. Hình 2.11 Caùc cheá ñoä hoaït ñoäng cuûa boä comparator. Caùc bit C2OUT vaø C1OUT (CMCON ) ñoùng vai troø ghi nhaän söï thay ñoåi tín hieäu analog so vôùi ñieän aùp ñaët tröôùc. Caùc bit naøy caàn ñöôïc xöû lí thích hôïp baèng chöông trình ñeå ghi nhaän söï thay ñoåi cuûa tín hieäu ngoõ vaøo. Côø ngaét cuûa boä so saùnh laø bit CMIF (thanh ghi PIR1). Côø ngaét naøy phaûi ñöôïc reset veà 0. Bit ñieàu khieån boä so saùnh laø bit CMIE (Tranh ghi PIE).
  30. Caùc thanh ghi lieân quan ñeán boä so saùnh bao goàm: CMCON (ñòa chæ 9Ch) vaø CVRCON (ñòa chæ 9Dh): xaùc laäp caùc thoâng soá cho boä so saùnh. Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): chöùa caùc bit cho pheùp caùc ngaét (GIE vaø PEIE). Thanh ghi PIR2 (ñòa chæ 0Dh): chöùa côø ngaét cuûa boä so saùnh (CMIF). Thanh ghi PIE2 (ñòa chæ 8Dh): chöùa bit cho pheùp boä so saùnh (CNIE). Thanh ghi PORTA (ñòa chæ 05h) vaø TRISA (ñòa chæ 85h): caùc thanh ghi ñieàu khieån PORTA. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå trong phuï luïc 2. 2.10.1 BOÄ TAÏO ÑIEÄN AÙP SO SAÙNH Boä so saùnh naøy chæ hoaït ñoäng khi boä Comparator ñöïôc ñònh daïng hoaït ñoäng ôû cheá ñoä ‘110’. Khi ñoù caùc pin RA0/AN0 vaø RA1/AN1 (khi CIS = 0) hoaëc pin RA3/AN3 vaø RA2/AN2 (khi CIS = 1) seõ laø ngoõ vaøo analog cuûa ñieän aùp caàn so saùnh ñöa vaøo ngoõ VIN- cuûa 2 boä so saùnh C1 vaø C2 (xem chi tieát ôû hình 2.10). Trong khi ñoù ñieän aùp ñöa vaøo ngoõ VIN+ seõ ñöôïc laáy töø moät boä taïo ñieän aùp so saùnh. Sô ñoà khoái cuûa boä taïo ñieän aùp so saùnh ñöïôc trình baøy trong hình veõ sau: Hình 2.12 Sô ñoà khoái boä taïo ñieän aùp so saùnh. Boä taïo ñieän aùp so saùnh naøy bao goàm moät thang ñieän trôû 16 möùc ñoùng vai troø laø caàu phaân aùp chia nhoû ñieän aùp VDD thaønh nhieàu möùc khaùc nhau (16 möùc). Moãi möùc coù giaù trò ñieän aùp khaùc nhau tuøy thuoäc vaøo bit ñieàu khieån CVRR (CVRCON ). Neáu CVRR ôû möùc logic 1, ñieän trôû 8R seõ khoâng coù taùc duïng nhö moät thaønh phaàn cuûa caàu phaân aùp (BJT daãn maïnh vaø doøng ñieän
  31. khoâng ñi qua ñieän trôû 8R), khi ñoù 1 möùc ñieän aùp coù giaù trò VDD/24. Ngöôïc laïi khi CVRR ôû möùc logic 0, doøng ñieän seõ qua ñieän trôû 8R vaø1 möùc ñieän aùp coù giaù trò VDD/32. Caùc möùc ñieän aùp naøy ñöôïc ñöa qua boä MUX cho pheùp ta choïn ñöôïc ñieän aùp ñöa ra pin RA2/AN2/VREF-/CVREF ñeå ñöa vaøo ngoõ VIN+ cuûa boä so saùnh baèng caùch ñöa caùc giaù trò thích hôïp vaøo caùc bit CVR3:CVR0. Boä taïo ñieän aùp so saùnh naøy coù theå xem nhö moät boä chuyeån ñoåi D/A ñôn giaûn. Giaù trò ñieän aùp caàn so saùnh ôû ngoõ vaøo Analog seõ ñöôïc so saùnh vôùi caùc möùc ñieän aùp do boä taïo ñieän aùp taïo ra cho tôùi khi hai ñieän aùp naøy ñaït ñöôïc giaù trò xaáp xæ baèng nhau. Khi ñoù keát quaû chuyeån ñoåi xem nhö ñöôïc chöùa trong caùc bit CVR3:CVR0. Caùc thanh ghi lieân quan ñeán boä taïo ñieän aùp so saùnh naøy bao goàm: Thanh ghi CVRCON (ñòa chæ 9Dh): thanh ghi tröïc tieáp ñieàu khieån boä so saùnh ñieän aùp. Thanh ghi CMCON (ñòa chæ 9Ch): thanh ghi ñieàu khieån boä Comparator. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.11 CCP CCP (Capture/Compare/PWM) bao goàm caùc thao taùc treân caùc xung ñeám cung caáp bôûi caùc boä ñeám Timer1 vaø Timer2. PIC16F877A ñöôïc tích hôïp saün hai khoái CCP : CCP1 vaø CCP2.Moãi CCP coù moät thanh ghi 16 bit (CCPR1H:CCPR1L vaø CCPR2H:CCPR2L), pin ñieàu khieån duøng cho khoái CCPx laø RC2/CCP1 vaø RC1/T1OSI/CCP2. Caùc chöùc naêng cuûa CCP bao goàm: Capture. So saùnh (Compare). Ñieàu cheá ñoä roäng xung PWM (Pulse Width Modulation). Caû CCP1 vaø CCP2 veà nguyeân taéc hoaït ñoäng ñeàu gioáng nhau vaø chöùc naêng cuûa töøng khoái laø khaù ñoäc laäp. Tuy nhieân trong moät soá tröôøng hôïp ngoaïi leä CCP1 vaø CCP2 coù khaû naêng phoái hôïp vôùi nhau ñeå ñeå taïo ra caùc hieän töôïng ñaëc bieät (Special event trigger) hoaëc caùc taùc ñoäng leân Timer1 vaø Timer2. Caùc tröôøng hôïp naøy ñöôïc lieät keâ trong baûng sau: CCPx CCPy Taùc ñoäng Capture Capture Duøng chung nguoàn xung clock töø TMR1 Capture Compare Taïo ra hieän töôïng ñaëc bieät laøm xoùa TMR1 Compare Compare Taïo ra hieän töôïng ñaëc bieät laøm xoùa TMR1 PWM PWM Duøng chung taàn soá xung clock vaøcuøng chòu taùc ñoäng cuûa ngaét TMR2. PWM Capture Hoaït ñoäng ñoäc laäp PWM Compare Hoaït ñoäng ñoäc laäp
  32. Khi hoaït ñoäng ôû cheá ñoä Capture thì khi coù moät “hieän töôïng” xaûy ra taïi pin RC2/CCP1 (hoaëc RC1/T1OSI/CCP2), giaù trò cuûa thanh ghi TMR1 seõ ñöôïc ñöa vaøo thanh ghi CCPR1 (CCPR2). Caùc “hieän töôïng” ñöôïc ñònh nghóa bôûi caùc bit CCPxM3:CCPxM0 (CCPxCON ) vaø coù theå laø moät trong caùc hieän töôïng sau: Moãi khi coù caïnh xuoáng taïi caùc pin Hình 2.13 Sô ñoà khoái CCP (Capture mode). CCP. Moãi khi coù caïnh leân. Moãi caïnh leân thöù 4. Moãi caïnh leân thöù 16. Sau khi giaù trò cuûa thanh ghi TMR1 ñöôïc ñöa vaøo thanh ghi CCPRx, côø ngaét CCPIF ñöôïc set vaø phaûi ñöôïc xoùa baèng chöông trình. Neáu hieän töôïng tieáp theo xaûy ra maø giaù trò trong thanh ghi CCPRx chöa ñöôïc xöû lí, giaù trò tieáp theo nhaän ñöôïc seõ töï ñoäng ñöôïc ghi ñeø leân giaù trò cuõ. Moät soá ñieåm caàn chuù yù khi söû duïng CCP nhö sau: Caùc pin duøng cho khoái CCP phaûi ñöôïc aán ñònh laø input (set caùc bit töông öùng trong thanh ghi TRISC). Khi aán ñònh caùc pin duøng cho khoái CCP laø output, vieäc ñöa giaù trò vaøo PORTC cuõng coù theå gaây ra caùc “hieän töôïng” taùc ñoäng leân khoái CCP do traïng thaùi cuûa pin thay ñoåi. Timer1 phaûi ñöôïc hoaït ñoäng ôû cheá ñoä Timer hoaëc cheá ñoä ñeám ñoàng boä. Traùnh söû duïng ngaét CCP baèng caùch clear bit CCPxIE (thanh ghi PIE1), côø ngaét CCPIF neân ñöôïc xoùa baèng phaàn meàm moãi khi ñöôïc set ñeå tieáp tuïc nhaän ñònh ñöôïc traïng thaùi hoaït ñoäng cuûa CCP. CCP coøn ñöôïc tích hôïp boä chia taàn soá prescaler ñöôïc ñieàu khieån bôûi caùc bit CCPxM3:CCPxM0. Vieäc thay ñoåi ñoái töôïng taùc ñoäng cuûa prescaler coù theå taïo ra hoaït ñoäng ngaét. Prescaler ñöôïc xoùa khi CCP khoâng hoaït ñoäng hoaëc khi reset. Xem caùc thanh ghi ñieàu khieån khoái CCP (phuï luïc 2 ñeå bieát theâm chi tieát).
  33. Khi hoaït ñoäng ôû cheá ñoä Compare, giaù trò trong thanh ghi CCPRx seõ thöôøng xuyeân ñöôïc so saùnh vôùi giaù trò trong thanh ghi TMR1. Khi hai thanh ghi chöùa giaù trò baèng nhau, caùc pin cuûa CCP ñöôïc thay ñoåi traïng thaùi (ñöôïc ñöa leân möùc cao, ñöa xuoáng möùc thaáp hoaëc giöõ nguyeân traïng thaùi), ñoàng thôøi côø ngaét CCPIF cuõng seõ ñöôïc set. Söï thay ñoåi traïng thaùi cuûa pin coù theå ñöôïc ñieàu khieån bôûi caùc bit CCPxM3:CCPxM0 (CCPxCON ). Hình 2.14 Sô ñoà khoái CCP (Compare mode). Töông töï nhö ôû cheá ñoä Capture, Timer1 phaûi ñöôïc aán ñònh cheá ñoä hoaït ñoäng laø timer hoaëc ñeám ñoàng boä. Ngoaøi ra, khi ôû cheá ñoä Compare, CCP coù khaû naêng taïo ra hieän töôïng ñaëc bieät (Special Event trigger) laøm reset giaù trò thanh ghi TMR1 vaø khôûi ñoäng boä chuyeån ñoåi ADC. Ñieàu naøy cho pheùp ta ñieàu khieån giaù trò thanh ghi TMR1 moät caùch linh ñoäng hôn.
  34. Khi hoaït ñoäng ôû cheá ñoä PWM (Pulse Width Modulation _ khoái ñieàu cheá ñoä roäng xung), tín hieäu sau khi ñieàu cheá seõ ñöôïc ñöa ra caùc pin cuûa khoái CCP (caàn aán ñònh caùc pin naøy laø output). Ñeå söû duïng chöùc naêng ñieàu cheá naøy tröôùc tieân ta caàn tieán haønh caùc böôùc caøi ñaët sau: 1. Thieát laäp thôøi gian cuûa 1 chu kì cuûa xung ñieàu cheá cho PWM (period) baèng caùch ñöa giaù trò thích hôïp vaøo thanh ghi PR2. 2. Thieát laäp ñoä roäng xung caàn ñieàu cheá (duty cycle) baèng caùch ñöa giaù trò vaøo thanh ghi CCPRxL vaø caùc bit CCP1CON . 3. Ñieàu khieån caùc pin cuûa CCP laø Hình 2.15 Sô ñoà khoái CCP (PWM mode). output baèng caùch clear caùc bit töông öùng trong thanh ghi TRISC. 4. Thieát laäp giaù trò boä chia taàn soá prescaler cuûa Timer2 vaø cho pheùp Timer2 hoaït ñoäng baèng caùch ñöa giaù trò thích hôïp vaøo thanh ghi T2CON. 5. Cho pheùp CCP hoaït ñoäng ôû cheá ñoä PWM. Hình 2.16 Caùc tham soá cuûa PWM Trong ñoù giaù trò 1 chu kì (period) cuûa xung ñieàu cheá ñöôïc tính baèng coâng thöùc: PWM period = [(PR2)+1]*4*T *(giaù trò boä chia taàn soá cuûa TMR2). OSC Boä chia taàn soá prescaler cuûa Timer2 chæ coù theå nhaän caùc giaù trò 1,4 hoaëc 16 (xem laïi Timer2 ñeå bieát theâm chi tieát). Khi giaù trò thanh ghi PR2 baèng vôùi giaù trò thanh ghi TMR2 thì quaù trình sau xaûy ra: Thanh ghi TMR2 töï ñoäng ñöôïc xoùa. Pin cuûa khoái CCP ñöôïc set. Giaù trò thanh ghi CCPR1L (chöùa giaù trò aán ñònh ñoä roäng xung ñieàu cheá duty cycle) ñöôïc ñöa vaøo thanh ghi CCPRxH. Ñoä roäng cuûa xung ñieàu cheá (duty cycle) ñöôïc tính theo coâng thöùc: PWM duty cycle = (CCPRxL:CCPxCON )*TOSC*(giaù trò boä chia taàn soá TMR2)
  35. Nhö vaäy 2 bit CCPxCON seõ chöùa 2 bit LSB. Thanh ghi CCPRxL chöùa byte cao cuûa giaù trò quyeát ñònh ñoä roäng xung. Thanh ghi CCPRxH ñoùng vai troø laø buffer cho khoái PWM. Khi giaù trò trong thanh ghi CCPRxH baèng vôùi giaù trò trong thanh ghi TMR2 vaø hai bit CCPxCON baèng vôùi giaù trò 2 bit cuûa boä chia taàn soá prescaler, pin cuûa khoái CCP laïi ñöôïc ñöa veà möùc thaáp, nhö vaäy ta coù ñöôïc hình aûnh cuûa xung ñieàu cheá taïi ngoõ ra cuûa khoái PWM nhö hình 2.14. Moät soá ñieåm caàn chuù yù khi söû duïng khoái PWM: Timer2 coù hai boä chia taàn soá prescaler vaø postscaler. Tuy nhieân boä postscaler khoâng ñöôïc söû duïng trong quaù trình ñieàu cheá ñoä roäng xung cuûa khoái PWM. Neáu thôøi gian duty cycle daøi hôn thôøi gian chu kì xung period thì xung ngoõ ra tieáp tuïc ñöôïc giöõ ôû möùc cao sau khi giaù trò PR2 baèng vôùi giaù trò TMR2. 2.12 GIAO TIEÁP NOÁI TIEÁP 1.12.1 USART USART (Universal Synchronous Asynchronous Receiver Transmitter) laø moät trong hai chuaån giao tieáp noái tieáp.USART coøn ñöôïc goïi laø giao dieän giao tieáp noái tieáp noái tieáp SCI (Serial Communication Interface). Coù theå söû duïng giao dieän naøy cho caùc giao tieáp vôùi caùc thieát bò ngoïai vi, vôùi caùc vi ñieàu khieån khaùc hay vôùi maùy tính. Caùc daïng cuûa giao dieän USART ngoïai vi bao goàm: Baát ñoäng boä (Asynchronous). Ñoàng boä_ Master mode. Ñoàng boä_ Slave mode. Hai pin duøng cho giao dieän naøy laø RC6/TX/CK vaø RC7/RX/DT, trong ñoù RC6/TX/CK duøng ñeå truyeàn xung clock (baud rate) vaø RC7/RX/DT duøng ñeå truyeàn data. Trong tröôøng hôïp naøy ta phaûi set bit TRISC vaø SPEN (RCSTA ) c0ñeå cho pheùp giao dieän USART. PIC16F877A ñöôïc tích hôïp saün boä taïo toác ñoä baud BRG (Baud Rate Genetator) 8 bit duøng cho giao dieän USART. BRG thöïc chaát laø moät boä ñeám coù theå ñöôïc söû duïng cho caû hai daïng ñoàng boä vaø baát ñoàng boä vaø ñöôïc ñieàu khieån bôûi thanh ghi PSBRG. ÔÛ daïng baát ñoàng boä, BRG coøn ñöôïc ñieàu khieån bôûi bit BRGH ( TXSTA ). ÔÛ daïng ñoàng boä taùc ñoäng cuûa bit BRGH ñöôïc boû qua. Toác ñoä baud do BRG taïo ra ñöôïc tính theo coâng thöùc sau: Trong ñoù X laø giaù trò cuûa thanh ghi RSBRG ( X laø soá nguyeân vaø 0<X<255).
  36. Caùc thanh ghi lieân quan ñeán BRG bao goàm: TXSTA (ñòa chæ 98h): choïn cheá ñoä ñoøng boä hay baát ñoàng boä ( bit SYNC) vaø choïn möùc toác ñoä baud (bit BRGH). RCSTA (ñòa chæ 18h): cho pheùp hoaït ñoäng coång noái tieáp (bit SPEN). RSBRG (ñòa chæ 99h): quyeát ñònh toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøt cuï theå trong phuï luïc 2. 2.12.1.1 USART BAÁT ÑOÀNG BOÄ ÔÛ cheá ñoä truyeàn naøy USART hoaït ñoäng theo chuaån NRZ (None-Return-to-Zero), nghóa laø caùc bit truyeàn ñi seõ bao goàm 1 bit Start, 8 hay 9 bit döõ lieäu (thoâng thöôøng laø 8 bit) vaø 1 bit Stop. Bit LSB seõ ñöôïc truyeàn ñi tröôùc. Caùc khoái truyeàn vaø nhaän data ñoäc laäp vôùi nhau seõ duøng chung taàn soá töông öùng vôùi toác ñoä baud cho quaù trình dòch döõ lieäu (toác ñoä baud gaáp 16 hay 64 laàn toác ñoä dòch döõ lieäu tuøy theo giaù trò cuûa bit BRGH), vaø ñeå ñaûm baûo tính hieäu quaû cuûa döõ lieäu thì hai khoái truyeàn vaø nhaän phaûi duøng chung moät ñònh daïng döõ lieäu. 2.12.1.1.1 TRUYEÀN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART BAÁT ÑOÀNG BOÄ Thaønh phaàn quan troïng nhaát cuûa khoái truyeàn döõ lieäu laø thanh ghi dòch döõ lieäu TSR (Transmit Shift Register). Thanh ghi TSR seõ laáy döõ lieäu töø thanh ghi ñeäm duøng cho quaù trình truyeàn döõ lieäu TXREG. Döõ lieäu caàn truyeàn phaûi ñöïôc ñöa tröôùc vaøo thanh ghi TXREG. Ngay sau khi bit Stop cuûa döõ lieäu caàn truyeàn tröôùc ñoù ñöôïc truyeàn xong, döõ lieäu töø thanh ghi TXREG seõ ñöôïc ñöa vaøo thanh ghi TSR, thanh ghi TXREG bò roãng, ngaét xaûy ra vaø côø hieäu TXIF (PIR1 ) ñöôïc set. Ngaét naøy ñöôïc ñieàu khieån bôûi bit TXIE (PIE1 ). Côø hieäu TXIF vaãn ñöôïc set baát chaáp traïng thaùi cuûa bit TXIE hay taùc ñoäng cuûa chöông trình (khoâng theå xoùa TXIF baèng chöông trình) maø chæ reset veà 0 khi coù döõ lieäu môùi ñöôïc ñöa vaøo thanhh ghi TXREG. Hình 2.17 Sô ñoà khoái cuûa khoái truyeàn döõ lieäu USART.
  37. Trong khi côø hieäu TXIF ñoùng vai troø chæ thò traïng thaùi thanh ghi TXREG thì côø hieäu TRMT (TXSTA ) coù nhieäm vuï theå hieän traïng thaùi thanh ghi TSR. Khi thanh ghi TSR roãng, bit TRMT seõ ñöôïc set. Bit naøy chæ ñoïc vaø khoâng coù ngaét naøo ñöôïc gaén vôùi traïng thaùi cuûa noù. Moät ñieåm caàn chuù yù nöõa laø thanh ghi TSR khoâng coù trong boâ nhôù döõ lieäu vaø chæ ñöôïc ñieàu khieån bôûi CPU. Khoái truyeàn döõ lieäu ñöôïc cho pheùp hoaït ñoäng khi bit TXEN (TXSTA ) ñöôïc set. Quaù trình truyeàn döõ lieäu chæ thöïc söï baét ñaàu khi ñaõ coù döõ lieäu trong thanh ghi TXREG vaø xung truyeàn baud ñöôïc taïo ra. Khi khoái truyeàn döõ lieäu ñöôïc khôûi ñoäng laàn ñaàu tieân, thanh ghi TSR roãng. Taïi thôøi ñieåm ñoù, döõ lieäu ñöa vaøo thanh ghi TXREG ngay laäp töùc ñöôïc load vaøo thanh ghi TSR vaø thanh ghi TXREG bò roãng. Luùc naøy ta coù theå hình thaønh moät chuoãi döõ lieäu lieân tuïc cho quaù trình truyeàn döõ lieäu. Trong quaù trình truyeàn döõ lieäu neáu bit TXEN bò reset veà 0, quaù trình truyeàn keát thuùc, khoái truyeàn döõ lieäu ñöôïc reset vaø pin RC6/TX/CK chuyeån ñeán traïng thaùi high-impedance. Trong tröôøng hôïp döõ lieäu caàn truyeàn laø 9 bit, bit TX9 (TXSTA ) ñöôïc set vaø bit döõ lieäu thöù 9 seõ ñöôïc löu trong bit TX9D (TXSTA ). Neân ghi bit döõ lieäu thöù 9 vaøo tröôùc, vì khi ghi 8 bit döõ lieäu vaøo thanh ghi TXREG tröôùc coù theå xaûy ra tröôøng hôïp noäi dung thanh ghi TXREG seõ ñöôïc load vaøo thanh ghi TSG tröôùc, nhö vaäy döõ lieäu truyeàn ñi seõ bò sai khaùc so vôùi yeâu caàu. Toùm laïi, ñeå truyeàn döõ lieäu theo giao dieän USART baát ñoàng boä, ta caàn thöïc hieän tuaàn töï caùc böôùc sau: 1. Taïo xung truyeàn baud baèng caùch ñöa caùc giaù trò caàn thieát vaøo thanh ghi RSBRG vaø bit ñieàu khieån möùc toác ñoä baud BRGH. 2. Cho pheùp coång giao dieän noái tieáp noái tieáp baát ñoàng boä baèng caùch clear bit SYNC vaø set bit PSEN. 3. Set bit TXIE neáu caàn söû duïng ngaét truyeàn. 4. Set bit TX9 neáu ñònh daïng döõ lieäu caàn truyeàn laø 9 bit. 5. Set bit TXEN ñeå cho pheùp truyeàn döõ lieäu (luùc naøy bit TXIF cuõng seõ ñöôïc set). 6. Neáu ñònh daïng döõ lieäu laø 9 bit, ñöa bit döõ lieäu thöù 9 vaøo bit TX9D. 7. Ñöa 8 bit döõ lieäu caàn truyeàn vaûo thanh ghi TXREG. 8. Neáu söû duïng ngaét truyeàn, caàn kieåm tra laïi caùc bit GIE vaø PEIE (thanh ghi INTCON). Caùc thanh ghi lieân quan ñeán quaù trình truyeàn döõ lieäu baèng giao dieän USART baát ñoàng boä: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp taát caû caùc ngaét. Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø hieäu TXIF.
  38. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét truyeàn TXIE. Thanh ghi RCSTA (ñòa chæ 18h): chöùa bit cho pheùp coång truyeàn döõ lieäu (hai pin RC6/TX/CK vaø RC7/RX/DT). Thanh ghi TXREG (ñòa chæ 19h): thanh ghi chöùa döõ lieäu caàn truyeàn. Thanh ghi TXSTA (ñòa chæ 98h): xaùc laäp caùc thoâng soá cho giao dieän. Thanh ghi SPBRG (ñòa chæ 99h): quyeát ñònh toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.12.1.1.2 NHAÄN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART BAÁT ÑOÀNG BOÄ Döõ lieäu ñöôïc ñöa vaøo töø chaân RC7/RX/DT seõ kích hoaït khoái phuïc hoài döõ lieäu. Khoái phuïc hoài döõ lieäu thöïc chaát laø moät boä dòch döõ lieäu ctoác ñoä cao va coù taàn soá hoaït ñoäng gaáp 16 laàn hoaëc 64 laàn taàn soá baud. Trong khi ñoù toác ñoä dòch cuûa thanh thanh ghi nhaän döõ lieäu seõ baèng vôùi taàn soá baud hoaëc taàn soá cuûa oscillator. Hình 2.18 Sô ñoà khoái cuûa khoái nhaän döõ lieäu USART. Bit ñieàu khieån cho pheùp khoái nhaän döõ lieäu laø bit RCEN (RCSTA ). Thaønh phaàn quan troïng nhaát cuûa khoái nhaän döõ lieäu laø thsnh ghi nhaän döõ lieäu RSR (Receive Shift Register). Sau khi nhaän dieän bit Stop cuûa döõ lieäu truyeàn tôùi, döõ lieäu nhaän ñöôïc trong thanh ghi RSR seõ ñöôïc ñöa vaøo thanh ghi RCGER, sau ñoù côø hieäu RCIF (PIR1 ) seõ ñöôïc set vaø ngaét nhaän ñöôïc kích hoaït. Ngaét naøy ñöôïc ñieàu khieån bôûi bit RCIE (PIE1 ). Bit côø hieäu RCIF laø bit chæ ñoïc vaø khoâng theå ñöôïc taùc ñoäng bôûi chöông trình. RCIF chæ reset veà 0 khi döõ lieäu nhaän vaøo ôû thanh ghi RCREG ñaõ ñöôïc ñoïc vaø khi ñoù thanh ghi RCREG roãng. Thanh ghi RCREG laø thanh ghi
  39. coù boä ñeäm keùp (double-buffered register) vaø hoaït ñoäng theo cô cheá FIFO (First In First Out) cho pheùp nhaän 2 byte vaø byte thöù 3 tieáp tuïc ñöôïc ñöa vaøo thanh ghi RSR. Neáu sau khi nhaän ñöôïc bit Stop cuûa byte döõ lieäu thöù 3 maø thanh ghi RCREG vaãn coøn ñaày, côø hieäu baùo traøn döõ lieäu (Overrun Error bit) OERR(RCSTA ) seõ ñöôïc set, döõ lieäu trong thanh ghi RSR seõ bò maát ñi vaø quaù trình ñöa döõ lieäu töø thanh ghi RSR vaøo thanh ghi RCREG seõ bò giaùn ñoaïn. Trong tröôøng hôïp naøy caàn laáy heát döõ lieäu ôû thanh ghi RSREG vaøo tröôùc khi tieáp tuïc nhaän byte döõ lieäu tieáp theo. Bit OERR phaûi ñöôïc xoùa baèng phaàn meàm vaø thöïc hieän baèng caùch clear bit RCEN roài set laïi. Bit FERR (RCSTA ) seõ ñöôïc set khi phaùt hieän bit Stop duûa döõ lieäu ñöôïc nhaän vaøo. Bit döõ lieäu thöù 9 seõ ñöôïc ñöa vaøo bit RX9D (RCSTA ). Khi ñoïc döõ lieäu töø thanh ghi RCREG, hai bit FERR vaø RX9D seõ nhaän caùc giaù trò môùi. Do ñoù caàn ñoïc döõ lieäu töø thanh ghi RCSTA tröôùc khi ñoïc döõ lieäu töø thanh ghi RCREG ñeå traùnh bò maát döõ lieäu. Toùm laïi, khi söû duïng giao dieän nhaän döõ lieäu USART baát ñoàng boä caàn tieán haønh tuaàn töï caùc böôùc sau: 1. Thieát laäp toác ñoä baud (ñöa giaù trò thích hôïp vaøo thanh ghi SPBRG vaø bit BRGH. 2. Cho pheùp coång giao tieáp USART baát ñoàng boä (clear bit SYNC vaø set bit SPEN). 3. Neáu caàn söû duïng ngaét nhaän döõ lieäu, set bit RCIE. 4. Neáu döõ lieäu truyeàn nhaän coù ñònh daïng laø 9 bit, set bit RX9. 5. Cho pheùp nhaän döõ lieäu baèng caùch set bit CREN. 6. Sau khi döõ lieäu ñöôïc nhaän, bit RCIF seõ ñöôïc set vaø ngaét ñöôïc kích hoaït (neáu bit RCIE ñöôïc set). 7. Ñoïc giaù trò thanh ghi RCSTA ñeå ñoïc bit döõ lieäu thöù 9 vaø kieåm tra xem quaù trình nhaän döõ lieäu coù bò loãi khoâng. 8. Ñoïc 8 bit döõ lieäu töø thanh ghi RCREG. 9. Neáu quaù trình truyeàn nhaän coù loãi xaûy ra, xoùa loãi baèng caùch xoùa bit CREN. 10. Neáu söû duïng ngaét nhaän caàn set bit GIE vaø PEIE (thanh ghi INTCON). Caùc thanh ghi lieân quan ñeán quaù trình nhaän döõ lieäu baèng giao dieän USART baát ñoàng boä: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): chöùa caùc bit cho pheùp toaøn boä caùc ngaét (bit GIER vaø PEIE). Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø hieäu RCIE. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét RCIE. Thanh ghi RCSTA (ñòa chæ 18h): xaùc ñònh caùc trang thaùi trong quaù trình nhaän döõ lieäu. Thanh ghi RCREG (ñòa chæ 1Ah): chöùa döõ lieäu nhaän ñöôïc. Thanh ghi TXSTA (ñòa chæ 98h): chöùa caùc bit ñieàu khieån SYNC vaø BRGH. Thanh ghi SPBRG (ñòa chæ 99h): ñieàu khieån toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2.
  40. 2.12.1.1.2 USART ÑOÀNG BOÄ Giao dieän USART ñoàng boä ñöôïc kích hoaït baèng caùch set bit SYNC. Coång giao tieáp noái tieáp vaãn laø hai chaân RC7/RX/DT, RC6/TX/CK vaø ñöôïc cho pheùp baèng caùch set bit SPEN. USART cho pheùp hai cheá ñoä truyeàn nhaän döõ lieäu laø Master mode vaø Slave mode. Master mode ñöôïc kích hoaït baèng caùch set bit CSRC (TXSTA ), Slave mode ñöôïc kích hoaït baèng caùch clear bit CSRC. Ñieåm khaùc bieät duy nhaát giöõa hai cheá ñoä naøy laø Master mode seõ laáy xung clock ñoàng boä töø boä tao xung baud BRG coøn Slave mode laáy xung clock ñoàng boä töø beân ngoaøi qua chaân RC6/TX/CK. Ñieàu naøy cho pheùp Slave mode hoaït ñoäng ngay caû khi vi ñieàu khieån ñang ôû cheá ñoä sleep. 2.12.1.2.1 TRUYEÀN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ MASTER MODE Töông töï nhö giao dieän USART baât ñoàng boä, thaønh phaàn quan troïng nhaát cuûa hoái truyeàn döõ lieäu laø thanh ghi dòch TSR (Transmit Shift Register). Thanh ghi naøy chæ ñöôïc ñieàu khieån bôûi CPU. Döõ lieäu ñöa vaøo thanh ghi TSR ñöôïc chöùa trong thanh ghi TXREG. Côø hieäu cuûa khoái truyeàn döõ lieäu laø bit TXIF (chæ thò trang thaùi thanh ghi TXREG), côø hieäu naøy ñöôïc gaén vôùi moät ngaét vaø bit ñieàu khieån ngaét naøy laø TXIE. Côø hieäu chæ thò traïng thaùi thanh ghi TSR laø bit TRMT. Bit TXEN cho pheùp hay khoâng cho pheùp truyeàn döõ lieäu. Caùc böôùc caàn tieán haønh khi truyeàn döõ lieäu qua giao dieän USART ñoàng boä Master mode: 1. Taïo xung truyeàn baud baèng caùch ñöa caùc giaù trò caàn thieát vaøo thanh ghi RSBRG vaø bit ñieàu khieån möùc toác ñoä baud BRGH. 2. Cho pheùp coång giao dieän noái tieáp noái tieáp ñoàng boä baèng caùch set bit SYNC, PSEN vaø CSRC. 3. Set bit TXIE neáu caàn söû duïng ngaét truyeàn. 4. Set bit TX9 neáu ñònh daïng döõ lieäu caàn truyeàn laø 9 bit. 5. Set bit TXEN ñeå cho pheùp truyeàn döõ lieäu. 6. Neáu ñònh daïng döõ lieäu laø 9 bit, ñöa bit döõ lieäu thöù 9 vaøo bit TX9D. 7. Ñöa 8 bit döõ lieäu caàn truyeàn vaøo thanh ghi TXREG. 8. Neáu söû duïng ngaét truyeàn, caàn kieåm tra laïi caùc bit GIE vaø PEIE (thanh ghi INTCON). Caùc thanh ghi lieân quan ñeán quaù trình truyeàn döõ lieäu baèng giao dieän USART ñoàng boä Master mode: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp taát caû caùc ngaét. Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø hieäu TXIF.
  41. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét truyeàn TXIE. Thanh ghi RCSTA (ñòa chæ 18h): chöùa bit cho pheùp coång truyeàn döõ lieäu (hai pin RC6/TX/CK vaø RC7/RX/DT). Thanh ghi TXREG (ñòa chæ 19h): thanh ghi chöùa döõ lieäu caàn truyeàn. Thanh ghi TXSTA (ñòa chæ 98h): xaùc laäp caùc thoâng soá cho giao dieän. Thanh ghi SPBRG (ñòa chæ 99h): quyeát ñònh toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.12.1.2.2 NHAÄN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ MASTER MODE Caáu truùc khoái truyeàn döõ lieäu laø khoâng ñoåi so vôùi giao dieän baát ñoàng boä, keå caû caùc côø hieäu, ngaét nhaän vaø caùc thao taùc treân caùc thaønh phaàn ñoù. Ñieåm khaùc bieät duy nhaát laø giao dieän naøy cho pheùp hai cheá ñoä nhaän söõ lieäu, ñoù laø chæ nhaän 1 word döõ lieäu (set bit SCEN) hay nhaän moät chuoãi döõ lieäu (set bit CREN) cho tôùi khi ta clear bit CREN. Neáu caû hai bit ñeàu ñöôïc set, bit ñieàu khieån CREN seõ ñöôïc öu tieân. Caùc böôùc caàn tieán haønh khi nhaän döõ lieäu baèng giao dieän USART ñoàng boä Master mode: 1. Thieát laäp toác ñoä baud (ñöa giaù trò thích hôïp vaøo thanh ghi SPBRG vaø bit BRGH). 2. Cho pheùp coång giao tieáp USART baát ñoàng boä (set bit SYNC, SPEN vaø CSRC). 3. Clear bit CREN vaø SREN. 4. Neáu caàn söû duïng ngaét nhaän döõ lieäu, set bit RCIE. 5. Neáu döõ lieäu truyeàn nhaän coù ñònh daïng laø 9 bit, set bit RX9. 6. Neáu chæ nhaän 1 word döõ lieäu, set bit SREN, neáu nhaän 1 chuoãi word döõ lieäu, set bit CREN. 7. Sau khi döõ lieäu ñöôïc nhaän, bit RCIF seõ ñöôïc set vaø ngaét ñöôïc kích hoaït (neáu bit RCIE ñöôïc set). 8. Ñoïc giaù trò thanh ghi RCSTA ñeå ñoïc bit döõ lieäu thöù 9 vaø kieåm tra xem quaù trình nhaän döõ lieäu coù bò loãi khoâng. 9. Ñoïc 8 bit döõ lieäu töø thanh ghi RCREG. 10. Neáu quaù trình truyeàn nhaän coù loãi xaûy ra, xoùa loãi baèng caùch xoùa bit CREN. 11. Neáu söû duïng ngaét nhaän caàn set bit GIE vaø PEIE (thanh ghi INTCON). Caùc thanh ghi lieân quan ñeán quaù trình nhaän döõ lieäu baèng giao dieän USART ñoàng boä Master mode: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): chöùa caùc bit cho pheùp toaøn boä caùc ngaét (bit GIER vaø PEIE). Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø hieäu RCIE.
  42. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét RCIE. Thanh ghi RCSTA (ñòa chæ 18h): xaùc ñònh caùc trang thaùi trong quaù trình nhaän döõ lieäu. Thanh ghi RCREG (ñòa chæ 1Ah): chöùa döõ lieäu nhaän ñöôïc. Thanh ghi TXSTA (ñòa chæ 98h): chöùa caùc bit ñieàu khieån SYNC vaø BRGH. Thanh ghi SPBRG (ñòa chæ 99h): ñieàu khieån toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.12.1.2.3 TRUYEÀN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ SLAVE MODE Quaù trình naøy khoâng coù söï khaùc bieät so vôùi Master mode khi vi ñieàu khieån hoaït ñoäng ôû cheá ñoä bình thöôøng. Tuy nhieân khi vi ñieàu khieån ñang ôû traïng thaùi sleep, söï khaùc bieät ñöôïc theå hieän roõ raøng. Neáu coù hai word döõ lieäu ñöôïc ñöa vaøo thanh ghi TXREG tröôùc khi leänh sleep ñöôïc thöïc thi thì quaù trình sau seõ xaûy ra: 1. Word döõ lieäu ñaàu tieân seõ ngay laäp töùc ñöôïc ñöa vaøo thanh ghi TSR ñeå truyeàn ñi. 2. Word döõ lieäu thöù hai vaãn naèm trong thanh ghi TXREG. 3. Côø hieäu TXIF seõ khoâng ñöôïc set. 4. Sau khi word döõ lieäu ñaàu tieân ñaõ dòch ra khoûi thanh ghi TSR, thanh ghi TXREG tieáp tuïc truyeàn word thöù hai vaøo thanh ghi TSR vaø côø hieäu TXIF ñöôïc set. 5. Neáu ngaét truyeàn ñöôïc cho pheùp hoaït ñoäng, ngaét naøy seõ ñaùnh thöùc vi ñieàu khieån vaø neáu toaøn boä caùc ngaét ñöôïc cho pheùp hoaït ñoäng, boä ñeám chöông trình seõ chæ tôùi ñòa chæ chöùa chöông trình ngaét (0004h). Caùc böôùc caàn tieán haønh khi truyeàn döõ lieäu baèng giao dieän USART ñoàng boä Slave mode: 1. Set bit SYNC, SPEN vaø clear bit CSRC. 2. Clear bit CREN vaø SREN. 3. Neáu caàn söû duïng ngaét, set bit TXIE. 4. Neáu ñònh daïng döõ lieäu laø 9 bit, set bit TX9. 5. Set bit TXEN. 6. Ñöa bit döõ lieäu thöù 9 vaøo bit TX9D tröôùc (neáu ñònh daïng döõ lieäu laø 9 bit). 7. Ñöa 8 bit döõ lieäu vaøo thanh ghi TXREG. 8. Neáu ngaét truyeàn ñöôïc söû duïng, set bit GIE vaø PEIE (thanh ghi INTCON). Caùc thanh ghi lieân quan ñeán quaù trình truyeàn döõ lieäu baèng giao dieän USART ñoàng boä Slave mode: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): cho pheùp taát caû caùc ngaét. Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø hieäu TXIF.
  43. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét truyeàn TXIE. Thanh ghi RCSTA (ñòa chæ 18h): chöùa bit cho pheùp coång truyeàn döõ lieäu (hai pin RC6/TX/CK vaø RC7/RX/DT). Thanh ghi TXREG (ñòa chæ 19h): thanh ghi chöùa döõ lieäu caàn truyeàn. Thanh ghi TXSTA (ñòa chæ 98h): xaùc laäp caùc thoâng soá cho giao dieän. Thanh ghi SPBRG (ñòa chæ 99h): quyeát ñònh toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.12.1.2.4 NHAÄN DÖÕ LIEÄU QUA CHUAÅN GIAO TIEÁP USART ÑOÀNG BOÄ SLAVE MODE Söï khaùc bieät cuûa Slave mode so vôùi Master mode chæ theå hieän roõ raøng khi vi ñieàu khieån hoaït ñoäng ôû cheá ñoä sleep. Ngoaøi ra cheá ñoä Slave mode khoâng quan taâm tôùi bit SREN. Khi bit CREN (cho pheùp nhaän chuoãi döõ lieäu) ñöôïc set tröôùc khi leänh sleep ñöôïc thöïc thi, 1 word döõ lieäu vaãn ñöôïc tieáp tuïc nhaän, sau khi nhaän xong bit thanh ghi RSR seõ chuyeån döõ lieäu vaøo thanh ghi RCREG vaø bit RCIF ñöôïc set. Neáu bit RCIE (cho pheùp ngaét nhaän) ñaõ ñöôïc set tröôùc ñoù, ngaét seõ ñöôïc thöïc thi vaø vi ñieàu khieån ñöôïc “ñaùnh thöùc, boä ñeám chöông trình seõ chæ ñeán ñòa chæ 0004h vaø chöông trình ngaét seõ ñöôïc thöïc thi. Caùc böôùc caàn tieán haønh khi nhaän döõ lieäu baèng giao dieän USART ñoàng boä Slave mode: 1. Cho pheùp coång giao tieáp USART baát ñoàng boä (set bit SYNC, SPEN clear bit CSRC). 2. Neáu caàn söû duïng ngaét nhaän döõ lieäu, set bit RCIE. 3. Neáu döõ lieäu truyeàn nhaän coù ñònh daïng laø 9 bit, set bit RX9. 4. Set bit CREN ñeå cho pheùp quaù trình nhaän döõ lieäu baét ñaàu. 5. Sau khi döõ lieäu ñöôïc nhaän, bit RCIF seõ ñöôïc set vaø ngaét ñöôïc kích hoaït (neáu bit RCIE ñöôïc set). 6. Ñoïc giaù trò thanh ghi RCSTA ñeå ñoïc bit döõ lieäu thöù 9 vaø kieåm tra xem quaù trình nhaän döõ lieäu coù bò loãi khoâng. 7. Ñoïc 8 bit döõ lieäu töø thanh ghi RCREG. 8. Neáu quaù trình truyeàn nhaän coù loãi xaûy ra, xoùa loãi baèng caùch xoùa bit CREN. 9. Neáu söû duïng ngaét nhaän caàn set bit GIE vaø PEIE (thanh ghi INTCON). Caùc thanh ghi lieân quan ñeán quaù trình nhaän döõ lieäu baèng giao dieän USART ñoàng boä Slave mode: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): chöùa caùc bit cho pheùp toaøn boä caùc ngaét (bit GIER vaø PEIE).
  44. Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø hieäu RCIE. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét RCIE. Thanh ghi RCSTA (ñòa chæ 18h): xaùc ñònh caùc trang thaùi trong quaù trình nhaän döõ lieäu. Thanh ghi RCREG (ñòa chæ 1Ah): chöùa döõ lieäu nhaän ñöôïc. Thanh ghi TXSTA (ñòa chæ 98h): chöùa caùc bit ñieàu khieån SYNC vaø BRGH. Thanh ghi SPBRG (ñòa chæ 99h): ñieàu khieån toác ñoä baud. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.12.2 MSSP MSSP ( Master Synchronous Serial Port) laø giao dieän ñoàng boä noái tieáp duøng ñeå giao tieáp vôùi caùc thieát bò ngoaïi vi (EEPROM, ghi dòch, chuyeån ñoåi ADC, ) hay caùc vi ñieàu khieån khaùc. MSSP coù theå hoaït ñoäng döôùi hai daïng giao tieáp: SPI (Serial Pheripheral Interface). I2C (Inter-Intergrated Circuit). Caùc thanh ghi ñieàu khieån giao chuaån giao tieáp naøy bao goàm thanh ghi traïng thaùi SSPSTAT vaø hai thanh ghi ñieàu khieån SSPSON vaø SSPSON2. Tuøy theo chuaån giao tieáp ñöôïc söû duïng (SPI hay I2C) maø chöùc naêng caùc thanh ghi naøy ñöôïc theå hieän khaùc nhau. 2.12.2.1 SPI Chuaån giao tieáp SPI cho pheùp truyeàn nhaän ñoàng boä. Ta caàn söõ duïng 4 pin cho chuaån giao tieáp naøy: Hình 2.19 Sô ñoà khoái MSSP (giao dieän SPI) RC5/SDO: ngoõ ra döõ lieäu daïng noái tieáp (Serial Data output). RC4/SDI/SDA: ngoõ vaøo döõ lieäu daïng noái tieáp (Serial Data Input). RC3/SCK/SCL: xung ñoàng boä noái tieáp (Serial Clock). RA5/AN4/SS/C2OUT: choïn ñoái töôïng giao tieáp (Serial Select) khi giao tieáp ôû cheá ñoä Slave mode. Caùc thanh ghi lieân quan ñeán MSSP khi hoaït ñoäng ôû chuaån giao tieáp SPI bao goàm:
  45. Thanh ghi ñieàu khieån SSPCON, thanh ghi naøy cho pheùp ñoïc vaø ghi. Thanh ghi traïng thaùi SSPSTAT, thanh ghi naøy chæ cho pheùp ñoïc vaø ghi ôû 2 bit treân, 6 bit coøn laïi chæ cho pheùp ñoïc. Thanh ghi ñoùng vai troø laø buffer truyeàn nhaän SSPBUF, döõ lieäu truyeàn ñi hoaëc nhaän ñöôïc seõ ñöôïc ñöa vaøo tranh ghi naøy. SSPBUF khoâng coù caáu truùc ñeäm hai lôùp (doubled- buffer), do ñoù döõ lieäu ghi vaøo thanh ghi SSPBUF seõ laäp töùc ñöôïc ghi vaøo thanh ghi SSPSR. Thanh ghi dòch döõ lieäu SSPSR duøng ñeå dòch döõ lieäu vaøo hoaëc ra. Khi 1 byte döõ lieäu ñöôïc nhaän hoaøn chænh, döõ lieäu seõ töø thanh ghi SSPSR chuyeån qua thanh ghi SSPBUF vaø côø hieäu ñöôïc set, ñoàng thôøi ngaét seõ xaûy ra. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. Khi söû duïng chuaån giao tieáp SPI tröôùc tieân ta caàn thieát laäp caùc cheá ñoä cho giao dieän baèng caùch ñöa caùc giaù trò thích hôïp vaøo hai thanh ghi SSPCON vaø SSPSTAT. Caùc thoâng soá caàn thieát laäp bao goàm: Master mode hay Slave mode. Ñoái vôùi Master mode, xung clock ñoàng boä seõ ñi ra töø chaân RC3/SCK/SCL. Ñoái vôùi Slave mode, xung clock ñoàng boä seõ ñöôïc nhaän töø beân ngoaøi qua chaân RC3/SCK/SCL. Caùc cheá ñoä cuûa Slave mode. Möùc logic cuûa xung clock khi ôû trang thaùi taïm ngöng quaù trình truyeàn nhaän (Idle). Caïnh taùc ñoäng cuûa xung clock ñoàng boä (caïnh leân hay caïnh xuoáng). Toác ñoä xung clock (khi hoaït ñoäng ôû Master mode). Thôøi ñieåm xaùc ñònh möùc logic cuûa döõ lieäu (ôû giöõa hay ôû cuoái thôøi gian 1 bit döõ lieäu ñöôïc ñöa vaøo). Master mode, Slave mode vaø caùc cheá ñoä cuûa Slave mode ñöôïc ñieàu khieån bôûi caùc bit SSPM3:SSPM0 (SSPCON ). Xem chi tieát ôû phuï luïc 2. MSSP bao goàm moät thanh ghi dòch döõ lieäu SSPSR vaø thanh ghi ñeäm döõ lieäu SSPBUF. Hai thanh ghi naøy taïo thaønh boä ñeäm döõ lieäu keùp (doubled-buffer). Döõ lieäu seõ ñöôïc dòch vaøo hoaëc ra qua thanh ghi SSPSR, bit MSB ñöôïc dòch tröôùc. Ñaây laø moät trong nhöõng ñieåm khaùc bieät giöõ hai giao dieän MSSP vaø USART (USART dòch bit LSB tröôùc). Trong quaù trình nhaän döõ lieäu, khi döõ lieäu ñöa vaøo töø chaân RC4/SDI/SDA trong thanh ghi SSPSR ñaõ saün saøng (ñaõ nhaän ñuû 8 bit), döõ lieäu seõ ñöôïc ñöa vaøo thanh ghi SSPBUF, bit chæ thò traïng thaùi boä ñeäm BF (SSPSTAT ) seõ ñöôïc set ñeå baùo hieäu boä ñeäm ñaõ ñaày, ñoàng thôøi côø ngaét SSPIF (PIR1 ) cuõng ñöôïc set. Bit BF seõ töï ñoäng reset veà 0 khi döõ lieäu trong thanh ghi SSPBUF ñöôïc ñoïc vaøo. Boä ñeäm keùp cho pheùp ñoïc tieáp byte tieáp theo tröôùc khi byte döõ lieäu tröôùc ñoù ñöôïc ñoïc vaøo. Tuy nhieân ta neân ñoïc tröôùc döõ lieäu töø thanh ghi SSPBUF tröôùc khi nhaän byte döõ lieäu tieáp theo. Quaù trình truyeàn döõ lieäu cuõng hoaøn toaøn töông töï nhöng ngöôïc laïi. Döõ lieäu caàn truyeàn seõ ñöôïc ñöa vaøo thanh ghi SSPBUF ñoàng thôøi ñöa vaøo thanh ghi SSPSR, khi ñoù côø hieäu BF
  46. ñöôïc set. Döõ lieäu ñöôïc dòch töø thanh ghi SSPSR vaø ñöa ra ngoaøi qua chaân RC5/SDO. Ngaét seõ xaûy ra khi quaù trình dòch döõ lieäu hoaøn taát. Tuy nhieân döõ lieäu tröôùc khi ñöôïc ñöa ra ngoaøi phaûi ñöôïc cho pheùp bôûi tín hieäu töø chaân . Chaân naøy ñoùng vai troø choïn ñoái töôïng giao tieáp khi SPI ôû cheá ñoä Slave mode. Khi quaù trình truyeàn nhaän döõ lieäu ñang dieãn ra, ta khoâng ñöôïc pheùp ghi döõ lieäu vaøo thanh ghi SSPBUF. Thao taùc ghi döõ lieäu naøy seõ set bit WCON (SSPCON ). Moät ñieàu caàn chuù yù nöõa laø thanh ghi SSPSR khoâng cho pheùp truy xuaát tröïc tieáp maø phaûi thoâng qua thanh ghi SSPBUF. Coång giao tieáp cuûa giao dieän SPI ñöôïc ñieàu khieån bôûi bit SSPEN (SSPSON ). Beân caïnh ñoù caàn ñieàu khieån chieàu xuaát nhaäp cuûa PORTC thoâng qua thanh ghi TRISC sao cho phuø hôïp vôùi chieàu cuûa giao dieän SPI. Cuï theå nhö sau: RC4/SDI/SDA seõ töï ñoäng ñöôïc ñieàu khieån bôûi khoái giao iteáp SPI. RS5/SDO laø ngoõ ra döõ lieäu, do ñoù caàn clear bit TRISC . Khi SPI ôû daïng Master mode, caàn clear bit TRISC ñeå cho pheùp ñöa xung clock ñoàng boä ra chaân RC3/SCK/SCL. Khi SPI ôû daïng Slave mode, caàn set bit TRISC ñeå cho pheùp nhaän xung clock ñoàng boä töø beân ngoaøi qua chaân RC3/SCK/SCL. Set bit TRISC ñeå cho pheùp chaân nhaän tín hieäu ñieàu khieån truy xuaát döõ lieäu khi SPI ôû cheá ñoä Slave mode. Sô ñoà keát noái cuûa chuaån giao tieáp SPI nhö sau: Hình 2.20 Sô ñoà keát noái cuûa chuaån giao tieáp SPI. Theo sô ñoà keát noái naøy, khoái Master seõ baét ñaàu quaù trình truyeàn nhaän döõ lieäu baèng caùch göûi tín hieäu xung ñoàng boä SCK. Döõ lieäu seõ dòch töø caû hai thanh ghi SSPSR ñöa ra ngoaøi neáu coù moät caïnh cuûa xung ñoàng boä taùc ñoäng vaø ngöng dòch khi coù taùc ñoäng cuûa caïnh coøn laïi.
  47. Caû hai khoái Master vaø Slave neân ñöôïc aán ñònh chung caùc qui taéc taùc ñoäng cuûa xung clock ñoàng boä ñeå döõ lieäu coù theå dòch chuyeån ñoàng thôøi. 2.12.2.1.1 SPI MASTER MODE. ÔÛ cheá ñoä Master mode, vi ñieàu khieån coù quyeàn aán ñònh thôøi ñieåm trao ñoåi döõ lieäu (vaø ñoái töôïng trao ñoåi döõ lieäu neáu caàn) vì noù ñieàu khieån xung clock ñoàng boä. Döõ lieäu seõ ñöôïc truyeàn nhaän ngay thôøi ñieåm döõ lieäu ñöôïc ñöa vaøo thanh ghi SSPBUF. Neáu chæ caàn nhaän döõ lieäu, ta coù theå aán ñònh chaân SDO laø ngoõ vaøo (set bit TRISC ). Döõ lieäu seõ ñöôïc dòch vaøo thanh ghi SSPSR theo moät toác ñoä ñöôïc ñònh saün cho xung clock ñoàng boä. Sau khi nhaän ñöôïc moät byte döõ lieäu hoaøn chænh, byte döõ lieäu seõ ñöôïc ñöa daøo thanh ghi SSPBUF, bit BF ñöôïc set vaø ngaét xaûy ra. Khi leänh SLEEP ñöôïc thöïc thi trong quaù trình truyeàn nhaän, traïng thaùi cuûa quaù trình seõ ñöôïc giöõ nguyeân vaø tieáp tuïc sau khi vi ñieàu khieån ñöôïc ñaùnh thöùc. Giaûn ñoà xung cuûa Master mode vaø caùc taùc ñoäng cuûa caùc bit ñieàu khieån ñöôïc trình baøy trong hình veõ sau: Hình 2.21 Giaûn ñoà xung SPI ôû cheá ñoä Master mode.
  48. 2.12.2.1.2 SPI SLAVE MODE ÔÛ cheá ñoä naøy SPI seõ truyeàn vaø nhaän döõ lieäu khi coù xung ñoàng boä xuaát hieän ôû chaân SCK. Khi truyeàn nhaän xong bit döõ lieäu cuoái cuøng, côø ngaét SSPIF seõ ñöôïc set. Slave mode hoaït ñoäng ngay caû khi vi ñieàu khieån ñang ôû cheá ñoä sleep, vaø ngaét truyeàn nhaän cho pheùp “ñaùnh thöùc” vi ñieàu khieån. Khi chæ caàn nhaän döõ lieäu, ta coù theå aán ñònh RC5/SDO laø ngoõ vaøo (set bit TRISC ). Slave mode cho pheùp söï taùc ñoäng cuûa chaân ñieàu khieån (SSPCON = 0100). Khi chaân ôû möùc thaáp, chaân RC5/SDO ñöôïc cho pheùp xuaát döõ lieäu vaø khi ôû möùc cao, döõ lieäu ra ôû chaân RC5/SDO bò khoùa, ñoàng thôøi SPI ñöôïc reset (boä ñeám bit döõ lieäu ñöôïc gaùn giaù trò 0). Hình 2.22 Giaûn ñoà xung chuaån giao tieáp SPI (Slave mode). Caùc thanh ghi lieân quan ñeán chuaån giao tieáp SPI bao goàm: Thanh ghi INTCON (ñòa chæ 0Bh, 8Bh, 10Bh, 18Bh): chöùa bit cho pheùp toaøn boä caùc ngaét (GIE vaø PEIE). Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa ngaét SSPIE. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét SSPIE.
  49. Thanh ghi TRISC (ñòa chæ 87h): ñieàu khieån xuaát nhaäp PORTC. Thanh ghi SSPBUF (ñòa chæ 13h): thanh ghi ñeäm döõ lieäu. Thanh ghi SSPCON (ñòa chæ 14h): ñieàu khieån chuaån giao tieáp SPI. Thanh ghi SSPSTAT (ñòa chæ 94h): chöùa caùc bit chæ thò traïng thaùi chuaån giao tieáp SPI. Thanh ghi TRISA (ñòa chæ 85h):ñieàu khieån xuaát nhaäp chaân . Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. 2.12.2.2 I2C Ñaây laø moät daïng khaùc cuûa MSSP. Chuaån giao tieáp I2C cuõng coù hai cheá ñoä Master, Slave vaø cuõng ñöôïc keát noái vôùi ngaét. I2C seõ söû duïng 2 pin ñeå truyeàn nhaän döõ lieäu: RC3/SCK/SCL: chaân truyeàn daãn xung clock. RC4/SDI/SDA: chaân truyeàn daãn döõ lieäu. Caùc khoái cô baûn trong sô ñoà khoái cuûa I2C khoâng coù nhieàu khaùc bieät so vôùi SPI. Tuy nhieân I2C coøn coù theâm khoái phaùt hieän bit Start vaø bit Stop cuûa döõ lieäu (Start and Stop bit detect) vaø khoái xaùc ñònh ñòa chæ (Match detect). Caùc thanh ghi lieân quan ñeán I2C bao goàm: Thanh ghi SSPCON vaø SSPCON2: Hình 2.23 Sô ñoà khoái MSSP (I2Cslave ñieàu khieån MSSP. mode). Thanh ghi SSPSTAT: thanh ghi chöùa caùc traïng thaùi hoaït ñoäng cuûa MSSP. Thanh ghi SSPBUF: buffer truyeàn nhaän noái tieáp. Thanh ghi SSPSR: thanh ghi dòch duøng ñeå truyeàn nhaän döõ lieäu. Thanh ghi SSPADD: thanh ghi chöùa ñòa chæ cuûa giao dieän MSSP. Caùc thanh ghi SSPCON, SSPCON2 cho pheùp ñoïc vaø ghi. Thanh ghi SSPSTAT chæ cho pheùp ñoïc vaø ghi ôû 2 bit ñaàu, 6 bit coøn laïi chæ cho pheùp ñoïc. Thanh ghi SSPBUF chöùa döõ lieäu seõ ñöôïc truyeàn ñi hoaëc nhaän ñöôïc vaø ñoùng vai troø nhö moät thanh ghi ñeäm cho thanh ghi dòch döõ lieäu SSPSR. Thanh ghi SSPADD chöùa ñòa chæ cuûa thieát bò ngoaïi vi caàn truy xuaát döõ lieäu cuûa I2C khi hoaït ñoäng ôû Slave mode. Khi hoaït ñoäng ôû Master mode, thanh ghi SSPADD chöùa giaù trò taïo ra toác ñoä baud cho xung clock duøng ñeå truyeàn nhaän döõ lieäu.
  50. Trong quaù trình nhaän döõ lieäu, sau khi nhaän ñöôïc 1 byte döõ lieäu hoaøn chænh, thanh ghi SSPSR seõ chuyeån döõ lieäu vaøo thanh ghi SSPBUF. Thanh ghi SSPSR khoâng ñoïc vaø ghi ñöôïc, quaù trình truy xuaát thanh ghi naøy phaûi thoâng qua thanh ghi SSPBUF. Trong quaù trình truyeàn döõ lieäu, döõ lieäu caàn truyeàn khi ñöôïc ñöa vaøo thanh ghi SSPBUF cuõng seõ ñoàng thôøi ñöa vaøo thanh ghi SSPSR. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2. I2C coù nhieàu cheá ñoä hoaït ñoäng vaø ñöôïc ñieàu khieån bôûi caùc bit SSPCON , bao goàm: I2C Master mode, xung clock = fosc/4*(SSPADD+1). I2C Slave mode, 7 bit ñòa chæ. I2C Slave mode, 10 bit ñòa chæ. I2C Slvae mode, 7 bit ñòa chæ, cho pheùp ngaét khi phaùt hieän bit Start vaø bit Stop. I2C Slave mode, 10 bit ñòa chæ, cho pheùp ngaét khi phaùt hieän bit Start vaø bit Stop. I2C Firmware Control Master mode. Ñòa chæ truyeàn ñi seõ bao goàm caùc bit ñòa chæ vaø moät bit ñeå xaùc ñònh thao taùc (ñoïc hay ghi döõ lieäu) vôùi ñoái töôïng caàn truy xuaát döõ lieäu. Khi löïa choïn giao dieän I2C vaø khi set bit SSPEN, caùc pin SCL vaø SDA seõ ôû traïng thaùi cöïc thu hôû. Do ñoù trong tröôøng hôïp caàn thieát ta phaûi söû duïng ñieän trôû keùo leân ôû beân ngoaøi vi ñieàu khieån, beân caïnh ñoù caàn aán ñònh caùc giaù trò phuø hôïp cho caùc bit TRISC (bit ñieàu khieån xuaát nhaäp caùc chaân SCL vaø SDA). 2.12.2.2.1 I2C SLAVE MODE. Vieäc tröôùc tieân laø phaûi set caùc pin SCL vaø SDA laø input (set bit TRISC ). I2C cuûa vi ñieàu khieån seõ ñöôïc ñieàu khieån bôûi moät vi ñieàu khieån hoaëc moät thieát bò ngoaïi vi khaùc thoâng qua caùc ñòa chæ. Khi ñòa chæ naøy chæ ñeán vi ñieàu khieån, thì taïi thôøi ñieåm naøy vaø taïi thôøi ñieåm döõ lieäu ñaõ ñöôïc truyeàn nhaän xong sau ñoù, vi ñieàu khieån seõ taïo ra xung ñeå baùo hieäu keát thuùc döõ lieäu, giaù trò trong thanh ghi SSPSR seõ ñöôïc ñöa vaøo thanh ghi SSPBUF. Tuy nhieân xung seõ khoâng ñöôïc taïo ra neáu moät trong caùc tröôøng hôïp sau xaûy ra: Bit BF (SSPSTAT ) baùo hieäu buffer ñaày ñaõ ñöôïc set tröôùc khi quaù trình truyeàn nhaän xaûy ra. Bit SSPOV (SSPCON ) ñöôïc set tröôùc khi quaù trình truyeàn nhaän xaûy ra (SSPOV ñöôïc set trong tröôøng hôïp khi moät byte khaùc ñöôïc nhaän vaøo trong khi döõ lieäu trong thanh ghi SSPBUF tröôùc ñoù vaãn chöa ñöôïc laáy ra). Trong caùc tröôøng hôïp treân, thanh ghi SSPSR seõ khoâng ñöa giaù trò vaøo thanh ghi SSPBUF, nhöng bit SSPIF (PIR1 )seõ ñöôïc set. Ñeå quaù trình truyeàn nhaän döõ lieäu ñöôïc tieáp tuïc, caàn ñoïc döõ lieäu töø thanh ghi SSPBUF vaøo tröôùc, khi ñoù bit BF seõ töï ñoäng ñöôïc xoùa, coøn bit SSPOV phaûi ñöôïc xoùa baèng chöông trình.
  51. Khi MSSP ñöôïc kích hoaït, noù seõ chôø tín hieäu ñeå baét ñaàu hoaït ñoäng. Sau khi nhaân ñöôïc tín hieäu baét ñaàu hoaït ñoäng (caïnh xuoáng ñaàu tieân cuûa pin SDA), döõ lieäu 8 bit seõ ñöôïc dòch vaøo thanh ghi SSPSR. Caùc bit ñöa vaøo seõ ñöôïc laáy maãu taïi caïnh leân cuûa xung clock. Giaù trò nhaän ñöôïc töø thanh ghi SSPSR seõ ñöôïc so saùnh vôùi giaù trò trong thanh ghi SSPADD taïi caïnh xuoáng cuûa xung clock thöù 8. Neáu keát quaû so saùnh baèng nhau, töùc laø I2C Master chæ ñònh ñoái töôïng giao tieáp laø vi ñieàu khieån ñang ôû cheá ñoä Slave mode (ta goïi hieän töôïng naøy laø address match), bit BF vaø SSPOV seõ ñöôïc xoùa veà 0 vaø gaây ra caùc taùc ñoäng sau: 1. Giaù trò trong thanh ghi SSPSR ñöôïc ñöa vaøo thanh ghi SSPBUF. 2. Bit BF töï ñoäng ñöôïc set. 3. Moät xung ñöôïc taïo ra. 4. Côø ngaét SSPIF ñöôïc set (ngaét ñöôïc kích hoaït neáu ñöôïc cho pheùp tröôùc ñoù) taïi caïnh xuoáng cuûa xung clock thöù 9. Khi MSSP ôû cheá ñoä I2C Slave mode 10 bit ñòa chæ, vi ñieàu khieån caàn phaûi nhaän vaøo 10 bit ñòa chæ ñeå so saùnh. Bit (SSPSTAT ) phaûi ñöôïc xoùa veà 0 ñeå cho pheùp nhaän 2 byte ñòa chæ. Byte ñaàu tieân coù ñònh daïng laø ‘11110 A9 A8 0‘ trong ñoù A9, A8 laø hai bit MSB cuûa 10 bit ñòa chæ. Byte thöù 2 laø 8 bit ñòa chæ coøn laïi. Quaùtrình nhaän daïng ñòa chæ cuûa MSSP ôû cheá ñoä I2C Slave mode 10 bit ñòa chæ nhö sau: 1. Ñaàu tieân 2 bit MSB cuûa 10 bit ñòa chæ ñöôïc nhaän tröôùc, bit SSPIF, BF vaø UA (SSPSTAT ) ñöôïc set (byte ñòa chæ ñaàu tieân coù ñònh daïng laø ‘11110 A9 A8 0’) . 2. Caäp nhaät vaøo 8 bit ñòa chæ thaáp cuûa thanh ghi SSPADD, bit UA seõ ñöôïc xoùa bôûi vi ñieàu khieån ñeå khôûi taïo xung clock ôû pin SCL sau khi quaù trình caäp nhaät hoaøn taát. 3. Ñoïc giaù trò thanh ghi SSPBUF (bit BF seõ ñöôïc xoùa veà 0) vaø xoùa côø ngaét SSPIF. 4. Nhaän 8 bit ñòa chæ cao, bit SSPIF, BF vaø UA ñöôïc set. 5. Caäp nhaät 8 bit ñòa chæ ñaõ nhaän ñöôïc vaøo 8 bit ñòa chæ cao cuûa thanh ghi SSPADD, neáu ñòa chæ nhaän ñöôïc laø ñuùng (address match), xung clock ôû chaân SCL ñöôïc khôûi taïo vaø bit UA ñöôïc set. 6. Ñoïc giaù trò thanh ghi SSPBUF (bit BF seõ ñöôïc xoùa veà 0) vaø xoùa côø ngaét SSPIF. 7. Nhaän tín hieäu Start. 8. Nhaän byte ñòa chæ cao (bit SSPIF vaø BF ñöôïc set). 9. Ñoïc giaù trò thanh ghi SSPBUF (bit BF ñöôïc xoùa veà 0) vaø xoùa côø ngaét SSPIF. Trong ñoù caùc böôcù 7,8,9 xaûy ra trong quaù trình truyeàn döõ lieäu ôû cheá ñoä Slave mode. Xem giaûn ñoà xung cuûa I2C ñeå coù ñöôïc hình aûnh cuï theå hôn veà caùc böôùc tieán haønh trong quaù trình nhaän daïng ñòa chæ.
  52. Xeùt quaù trình nhaän döõ lieäu ôû cheá ñoä Slave mode, caùc bit ñòa chæ seõ ñöôïc I2C Master ñöa vaøo tröôùc. Khi bit trong caùc bit ñòa chæ coù giaù trò baèng 0 (bit naøy ñöôïc nhaän daïng sau khi caùc bit ñòa chæ ñaõ ñöôïc nhaän xong) vaø ñòa chæ ñöôïc chæ ñònh ñuùng (address match), bit cuûa thanh ghi SSPSTAT ñöôïc xoùa veà 0 vaø ñöôøng döõ lieäu SDI ñöôïc ñöa veà möùc logic thaáp (xung ). Khi bit SEN (SSPCON ) ñöôïc set, sau khi 1 byte döõ lieäu ñöôïc nhaän, xung clock töø chaân RC3/SCK/SCL seõ ñöôïc ñöa xuoáng möùc thaáp, muoán khôûi taïo laïi xung clock ta set bit CKP (SSPCON ). Ñieàu naøy seõ laøm cho hieän töôïng traøn döõ lieäu khoâng xaûy ra vì bit SEN cho pheùp ta ñieàu khieån ñöôïc xung clock dòch döõ lieäu thoâng qua bit CKP (tham khaûo giaûn ñoà xung ñeå bieát theâm chi tieát). Khi hieän töôïng traøn döõ lieäu xaûy ra, bit BF hoaëc bit SSPOV seõ ñöôïc set. Ngaét seõ xaûy ra khi moät byte döõ lieäu ñöôïc nhaän xong, côø ngaét SSPIF seõ ñöôïc set vaø phaûi ñöôïc xoùa baèng chöông trình. Hình 2.24 Giaûn ñoà xung cuûa I2C Slave mode 7 bit ñòa chæ trong quaù trình nhaän döõ lieäu (bit SEN = 0).
  53. Hình 2.25 Giaûn ñoà xung cuûa I2C Slave mode 10 bit ñòa chæ trong quaù trình nhaän döõ lieäu (bit SEN = 0). Hình 2.26 Giaûn ñoà xung cuûa I2C Slave mode 7 bit ñòa chæ trong quaù trình nhaän döõ lieäu (bit SEN = 1).
  54. Hình 2.27 Giaûn ñoà xung cuûa I2C Slave mode 10 bit ñòa chæ trong quaù trình nhaän döõ lieäu (bit SEN = 1). Xeùt quaù trình truyeàn döõ lieäu, khi bit trong caùc bit döõ lieäu mang giaù trò 1 vaø ñòa chæ ñöôïc chæ ñònh ñuùng (address match), bit cuûa thanh ghi SSPSTAT seõ ñöôïc set. Caùc bit ñòa chæ ñöôïc nhaän tröôùc vaø ñöa vaøo thanh ghi SSPBUF. Sau ñoù xung ñöôïc taïo ra, xung clock ôû chaân RC3/SCK/SCL ñöôïc ñöa xuoáng möùc thaáp baát chaáp traïng thaùi cuûa bit SEN. Khi ñoù I2C Master seõ khoâng ñöôïc ñöa xung clock vaøo I2C Slave cho ñeán khi döõ lieäu ôû thanh ghi SSPSR ôû traïng thaùi wsaün saûng cho quaù trình truyeàn döõ lieäu (döõ lieäu ñöa vaøo thanh ghi SSPBUF seõ ñoàng thôøi ñöôïc ñöa vaøo thanh ghi SSPSR). Tieáp theo cho pheùp xung ôû pin RC3/SCK/SCL baèng caùch set bit CKP (SSPCON ). Töøng bit cuûa byte döõ lieäu seõ ñöôïc dòch ra ngoaøi taïi moãi caïnh xuoáng cuûa xung clock. Nhö vaäy döõ lieäu seõ saün saøng ôû ngoõ ra khi xung clock ôû möùc logic cao, giuùp cho I2C Master nhaän ñöôïc döõ lieäu taïi moãi caïnh leân cuûa xung clock. Nhö vaäy trong quaù trình truyeàn döõ lieäu bit SEN khoâng ñoùng vai troø quan troïng nhö trong quaù trình nhaän döõ lieäu. Taïi caïnh leân xung clock thöù 9, döõ lieäu ñaõ ñöôïc dòch hoaøn toaøn vaøo I2C Master, xung seõ ñöôïc taïo ra ôû I2C Master, ñoàng thôøi pin SDA seõ ñöôïc giöõ ôû möùc logic cao. Trong tröôøng hôïp xung ñöôïc choát bôûi I2C Slave, thanh ghi SSPSTAT seõ ñöôïc reset. I2C Slave
  55. seõ chôø tín hieäu cuûa bit Start ñeå tieáp tuïc truyeàn byte döõ lieäu tieáp theo (ñöa byte döõ lieäu tieáp theo vaøo thanh ghi SSPBUF vaø set bit CKP. Ngaét MSSP xaûy ra khi moät byte döõ lieäu keát thuùc quaù trình truyeàn, bit SSPIF ñöôïc set taïi caïnh xuoáng cuûa xung clock thöù 9 vaø phaûi ñöôïc xoùa baèng chöông trình ñeå ñaûm baûo seõ ñöôïc set khi byte döõ lieäu tieáp theo truyeàn xong. Hình 2.28 Giaûn ñoà xung cuûa I2C Slave mode 7 bit ñòa chæ trong quaù trình truyeàn döõ lieäu. Hình 2.29 Giaûn ñoà xung cuûa I2C Slave mode 10 bit ñòa chæ trong quaù trình truyeàn döõ lieäu.
  56. Quaù trình truyeàn nhaän caùc bit ñòa chæ cho pheùp I2C Master choïn löïa ñoái töôïng I2C Slave caàn truy xuaát döõ lieäu. Beân caïnh ñoù I2C coøn cung caáp theâm moät ñòa chæ GCA (General Call Address) cho pheùp choïn taát caû caùc I2C Slave. Ñaây laø moät trong 8 ñòa chæ ñaëc bieät cuûa protocol I2C. Ñòa chæ naøy ñöôïc ñònh daïng laø moät chuoãi ‘0’ vôùi =0 vaø ñöôïc cho pheùp baèng caùch set bit GCEN (SSPCON2 ). Khi ñoù ñòa chæ nhaän vaøo seõ ñöôïc so saùnh vôùi thanh ghi SSPADD vaø vôùi ñòa chæ GCA. Hình 2.30 Giaûn ñoà xung cuûa I2C Slave khi nhaän ñòa chæ GCA. Quaù trình nhaän daïng ñòa chæ GCA cuõng töông töï nhö khi nhaän daïng caùc ñòa chæ khaùc vaø khoâng coù söï khaùc bieät roõ raøng khi I2C hoaït ñoäng ôû cheá ñoä ñòa chæ 7 bit hay 10 bit. 2.12.2.2.2 I2C MASTER MODE I2C Master mode ñöôïc xaùc laäp baèng caùch ñöa caùc giaù trò thích hôïp vaøo caùc bit SSPM cuûa thanh ghi SSPCON vaø set bit SSPEN. ÔÛ cheá ñoä Master, caùc pin SCK vaø SDA seõ ñöôïc ñieàu khieån bôûi phaàn cöùng cuûa MSSP.
  57. Hình 2.31 Sô ñoà khoái MSSP (I2C Master mode). I2C Master ñoùng vai troø tích cöïc trong quaù trình giao tieáp vaø ñieàu khieån caùc I2C Slave thoâng qua vieäc chuû ñoäng taïo ra xung giao tieáp vaø caùc ñieàu kieän Start, Stop khi truyeàn nhaän döõ lieäu. Moät byte döõ lieäu coù theå ñöôïc baét ñaàu baèng ñieàu kieän Start, keát thuùc baèng ñieàu kieän Stop hoaëc baét ñaàu vaø keát thuùc vôùi cuøng moät ñieàu kieän khôûi ñoäng laëp laïi (Repeated Start Condition). Xung giao tieáp noái tieáp seõ ñöôïc taïo ra töø BRG (Baud Rate Generator), giaù trò aán ñònh taàn soá xung clock noái tieáp ñöôïc laáy töø 7 bit thaáp cuûa thanh ghi SSPADD. Khi döõ lieäu ñöôïc ñöa vaøo thanh ghi SSPBUF, bit BF ñöôïc set vaø BRG töï ñoäng ñeám ngöôïc veà 0 vaø döøng laïi, pin SCL ñöôïc giöõ nguyeân traïng thaùi tröôùc ñoù.Khi döõ lieäu tieáp theo ñöôïc ñöa vaøo, BRG seõ caàn moät khoaûng thôøi gian TBRG töï ñoäng reset laïi giaù trò ñeå tieáp tuïc quaù trình ñeám ngöôïc. Moãi voøng leänh (coù thôøi gian TCY ) BRG seõ giaûm giaù trò 2 laàn. Hình 2.32 Sô ñoà khoái BRG (Baud Rate Benerator) cuûa I2C Master mode. Caùc giaù trò cuï theå cuûa taàn soá xung noái tieáp do BRG taïo ra ñöôïc lieät keâ trong baûng sau:
  58. Trong ñoù giaù trò BRG laø giaù trò ñöôïc laáy töø 7 bit thaáp cuûa thanh ghi SSPADD. Do I2C ôû cheá ñoä Master mode, thanh ghi SSPADD seõ khoâng ñöôïc söû duïng ñeå chöùa ñòa chæ, thay vaøo ñoù chöùc naêng cuûa SSPADD laø thanh ghi chöùa giaù trò cuûa BRG. Ñeå taïo ñöôïc ñieàu kieän Start, tröôùc heát caàn ñöa hai pin SCL vaø SDA leân möùc logic cao vaø bit SEN (SSPCON2 ) phaûi ñöôïc set. Khi ñoù BRG seõ töï ñoäng ñoïc giaù trò 7 bit thaáp cuûa thanh ghi SSPADD vaø baét ñaàu ñeám. Sau khoaûng thôøi gian TBRG, pin SDA ñöôïc ñöa xuoáng möùc logic thaáp. Traïng thaùi pin SDA ôû möùc logic thaáp vaø pin SCL ôû möùc logic cao chính laø ñieàu kieän Start cuûa I2C Master mode. Khi ñoù bit S (SSPSTAT ) seõ ñöôïc set. Tieáp theo BRG tieáp tuïc laáy giaù trò töø thanh ghi SSPADD ñeå tieáp tuïc quaù trình ñeám, bit SEN ñöôïc töï ñoäng xoùa vaø côø ngaét SSPIF ñöôïc set. Trong tröôøng hôïp pin SCL vaø SDA ôû traïng thaùi logic thaáp, hoaëc laø trong quaù trình taïo ñieàu kieän Start, pin SCL ñöôïc ñöa veà traïng thaùi logic thaáp tröôùc khi pin SDA ñöôïc ñöa veà trang thaùi logic thaáp, ñieàu kieän Start seõ khoâng ñöôïc hình thaønh, côø ngaét BCLIF seõ ñöôïc set vaø I2C seõ ôû traïng thaùi taïm ngöng hoaït ñoäng (Idle). Hình 2.33 Giaûn ñoà xung I2C Master mode trong quaù trình taïo ñieàu kieän Start.
  59. Tín hieäu Stop seõ ñöôïc ñöa ra pin SDA khi keát thöùc döõ lieäu baèng caùch set bit PEN (SSPCON2 ). Sau caïnh xuoáng cuûa xung clock thöù 9 vaø vôùi taùc ñoäng cuûa bit ñieàu khieån PEN, pin SDA cuõng ñöôïc ñöa xuoáng möùc thaáp, BRG laïi baét ñaàu quaù trình ñeám. Sau moät khoaûng thôøi gian TBRG, pin SCL ñöôïc ñöa leân möùc logic cao vaø sau moät khoaûng thôøi gian TBRG nöõa pin SDA cuõng ñöôïc ñöa leân möùc cao. Ngay taïi thôøi ñieåm ñoù bit P (SSPSTAT ) ñöôïc set, nghóa laø ñieàu kieän Stop ñaõ ñöôïc taïo ra. Sau moät khoaûng thôøi gian TBRG nöõa, bit PEN töï ñoäng ñöôïc xoùa vaø côø ngaét SSPIF ñöôïc set. Hình 2.34 Giaûn ñoà xung I2C Master mode trong quaù trình taïo ñieàu kieän Stop. Ñeå taïo ñöôïc dieàu kieän Start laëp laïi lieân tuïc trong quaù trình truyeàn döõ lieäu, tröôùc heát caàn set bit RSEN (SSPCON2 ). Sau khi set bit RSEN, pin SCL ñöôïc ñöa xuoáng möùc logic thaáp, pin SDA ñöôïc ñöa leân möùc logic cao, BRG laáy giaù trò töø thanh ghi SSPADD vaøo ñeå baéty ñaàu quaù trình ñeám. Sau khoaûng thôøi gian TBRG, pin SCL cuõng ñöôïc ñöa leân möùc logic cao trong khoaûng thôøi gian TBRG tieáp theo. Trong khoaûng thôøi gian TBRG keá tieáp, pin SDA laïi ñöôïc ñöa xuoáng möùc logic thaáp trong khi SCL vaãn ñöôïc giöõ ôû möùc logic cao. Ngay thôøi ñieåm ñoù bit S (SSPSTAT ) ñöôïc set ñeå baùo hieäu ñieàu kieän Start ñöôïc hình thaønh, bit RSEN töï ñoäng ñöôïc xoùa vaø côø ngaét SSPIF seõ ñöôïc set sau moät khoaûng thôøi gian TBRG nöõa. Luùc naøy ñòa chæ cuûa I2C Slave coù theå ñöôïc ñöa vaøo thanh ghi SSPBUF, sau ñoù ta chæ vieäc ñöa tieáp ñòa chæ hoaëc döõ lieäu tieáp theo vaøo thanh ghi SSPBUF moãi khi nhaän ñöôïc tín hieäu töø I2C Slave, I2C Master seõ töï ñoäng taïo tín hieäu Start laëp laïi lieân tuïc cho quaù trình truyeàn döõ lieäu lieân tuïc. Caàn chuù yù laø baát cöù moät trình töï naøo sai trong quaù trình taïo ñieàu kieän Start laëp laïi seõ laøm cho bit BCLIF ñöôïc set vaø I2C ñöôïc ñöa veà traïng thaùi “Idle”.
  60. Hình 2.35 Giaûn ñoà xung I2C Master mode trong quaù trình taïo ñieàu kieän Start lieân tuïc. Xeùt quaù trình truyeàn döõ lieäu, xung clock seõ ñöôïc ñöa ra töø pin SCL vaø döõ lieäu ñöôïc ñöa ra töø pin SDA. Byte döõ lieäu ñaàu tieân phaûi laø byte ñòa chæ xaùc ñònh I2C Slave caàn giao tieáp vaø bit (trong tröôøng hôïp naøy = 0). Ñaàu tieân caùc giaù trò ñòa chæ seõ ñöôïc ñöa vaøo thanh ghi SSPBUF, bit BF töï ñoäng ñöôïc set leân 1 vaø boä ñeám taïo xung clock noái tieáp BRG (Baud Rate Generator) baét ñaàu hoaït ñoäng. Khi ñoù töøng bit döõ lieäu (hoaëc ñòa chæ vaø bit ) seõ ñöôïc dòch ra ngoaøi theo töøng caïnh xuoáng cuûa xung clock sau khi caïnh xuoáng ñaàu tieân cuûa pin SCL ñöôïc nhaän dieän (ñieàu kieän Start), BRG baét ñaàu ñeám ngöôïc veà 0. Khi taát caû caùc bit cuûa byte döõ lieäu ñöôïc ñaõ ñöôïc ñöa ra ngoaøi, boä ñeám BRG mang giaù trò 0. Sau ñoù, taïi caïnh xuoáng cuûa xung clock thöù 8, I2C Master seõ ngöng taùc ñoäng leân pin SDA ñeå chôø ñôïi tín hieäu töø I2C Slave (tín hieäu xung ). Taïi caïnh xuoáng cuûa xung clock thöù 9, I2C Master seõ laáy maãu tín hieäu töø pin SDA ñeå kieåm tra xem ñòa chæ ñaõ ñöôïc I2C Slave nhaän daïng chöa, traïng thaùi ñöôïc ñöa vaøo bit ACKSTAT (SSPCON2 ). Cuõng taïi thôøi ñieåm caïnh xuoáng cuûa xung clock thöù 9, bit BF ñöôïc töï ñoäng clear, côø ngaét SSPIF ñöôïc set vaø BRG taïm ngöng hoaït ñoäng cho tôùi khi döõ lieäu hoaëc ñòa chæ tieáp theo ñöôïc ñöa vaøo thanh ghi SSPBUF, döõ lieäu hoaëc ñòa chæ seõ tieáp tuïc ñöôïc truyeàn ñi taïi caïnh xuoáng cuûa xung clock tieáp theo.
  61. Hình 2.36 Giaûn ñoà xung I2C Master mode trong quaù trình truyeàn döõ lieäu. Xeùt quaù trình nhaän döõ lieäu ôû cheá ñoä I2C Master mode. Tröôùc tieân ta caàn set bit cho pheùp nhaän döõ lieäu RCEN (SSPCON2 ). Khi ñoù BRG baét ñaàu quaù trình ñeám, döõ lieäu seõ ñöôïc dòch vaøo I2C Master qua pin SDA taïi caïnh xuoáng cuûa pin SCL. Taïi caïnh xuoáng cuûa xung clock thöù 8, bit côø hieäu cho pheùp nhaän RCEN töï ñoäng ñöôïc xoùa, döõ lieäu trong thanh ghi SSPSR ñöôïc ñöa vaøo thanh ghi SSPBUF, côø hieäu BF ñöôïc set, côø ngaét SSPIF ñöôïc set, BRG ngöng ñeám vaø pin SCL ñöôïc ñöa veà möùc logic thaáp. Khi ñoù MSSP ôû traïng thaùi taïm ngöng hoaït ñoäng ñeå chôø ñôïi leänh tieáp theo. Sau khi ñoïc giaù trò thanh ghi SSPBUF, côø hieäu BF töï ñoäng ñöôïc xoùa. Ta coøn coù theå göûi tín hieäu baèng caùch set bit ACKEN (SSPCON2 ).
  62. Hình 2.37 Giaûn ñoà xung I2C Master mode trong quaù trình nhaän döõ lieäu. 2.13 COÅNG GIAO TIEÁP SONG SONG PSP (PARALLEL SLAVE PORT) Ngoaøi caùc coång noái tieáp vaø caùc giao ñieän noái tieáp ñöôïc trình baøy ôû phaàn treân, vi ñieàu khieån PIC16F877A coøn ñöôïc hoã trôï moät coång giao tieáp song song vaø chuaån giao tieáp song song thoâng qua PORTD vaø PORTE. Do coång song song chæ hoaït ñoäng ôû cheá ñoä Slave mode neân vi ñieàu khieån khi giao tieáp qua giao dieän naøy seõ chòu söï ñieàu khieån cuûa thieát bò beân ngoaøi thoâng qua caùc pin cuûa PORTE, trong khi döõ lieäu seõ ñöôïc ñoïc hoaëc ghi theo daïng baát ñoàng boä thoâng qua 8 pin cuûa PORTD. Bit ñieàu khieån PSP laø PSPMODE (TRISE ). PSPMODE ñöôïc set seõ thieát laäp chöùc naêng caùc pin cuûa PORTE laø caùc pin cho pheùp ñoïc döõ lieäu ( ), cho pheùp ghi döõ lieäu ( ) vaø pin choïn vi ñieàu khieån ( ) phuïc vuï cho vieäc truyeàn nhaän döõ lieäu song song thoâng qua bus döõ lieäu 8 bit cuûa PORTD. PORTD luùc naøy ñoùng vai troø laø thanh ghi choát döõ lieäu 8 bit, ñoàng thôøi taùc ñoäng cuûa thanh ghi TRISD cuõng seõ ñöôïc boû qua do PORTD luùc naøy chòu söï ñieàu khieån cuûa caùc thieát bò beân ngoaøi. PORTE vaãn chòu söï taùc ñoäng cuûa thanh ghi TRISE, do ñoù caàn xaùc laäp traïng thaùi caùc pin PORTE laø input baèng caùch set caùc bit TRISE . Ngoaøi ra caàn ñöa giaù trò thích hôïp caùc bit PCFG3:PCFG0 (thanh ghi
  63. ADCON1 ) ñeå aán ñònh caùc pin cuûa PORTE laø caùc pin I/O daïng digital (PORTE coøn laø caùc pin chöùc naêng cuûa khoái ADC). Khi caùc pin vaø cuøng ôû möùc thaáp, döõ lieäu töø beân ngoaøi seõ ñöôïc ghi leân PORTD. Khi moät trong hai pin treân chuyeån leân möùc logic cao, côø hieäu baùo döõ lieäu trong buffer ñaõ ñaày BIF (TRISE ) ñöôïc set vaø côø ngaét PSPIF (PIR1 ) ñöôïc set ñeå baùo hieäu keát thuùc ghi döõ lieäu. Bit BIF chæ ñöôïc xoùa veà 0 khi döõ lieäu vöøa nhaän ñöôïc ôû PORTD ñöôïc ñoïc vaøo. Bit baùo hieäu döõ lieäu nhaän ñöôïc trong buffer bò traøn IBOV (TRISE ) seõ ñöôïc set khi vi ñieàu khieån nhaän tieáp döõ lieäu tieáp theo trong khi chöa ñoïc vaøo döõ lieäu ñaõ nhaän ñöôïc tröôùc ñoù. Khi caùc pin vaø cuøng ôû möùc logic thaáp, bit baùo hieäu buffer truyeàn döõ lieäu ñaõ ñaày BOF (TRISE ) seõ ñöôïc xoùa ngay laäp töùc ñeå baùo hieäu PORTD ñaõ saün saøng cho quaù Hình 2.38 Sô ñoà khoái cuûa PORTD vaø trình ñoïc döõ lieäu. Khi moät trong hai pin treân PORTE khi hoaït ñoäng ôû cheá ñoä PSP Slave chuyeån sang möùc logic cao, côø ngaét PSPIF mode. seõ ñöôïc set ñeå baùo hieäu quaù trình ñoïc döõ lieäu hoaøn taát. Bit BOF vaãn ñöôïc giöõ ôû möùc logic 0 cho ñeán khi döõ lieäu tieáp theo ñöôïc ñöa vaøo PORTD. Caàn chuù yù laø ngaét SSPIF ñöôïc ñieàu khieån bôûi bit PSPIE (PIE1 ) vaø phaûi ñöôïc xoùa baèng chöông trình. Caùc thanh ghi lieân quan ñeán PSP bao goàm: Thanh ghi PORTD (ñòa chæ 08h): chöùa döõ lieäu caàn ñoïc hoaëc ghi. Thanh ghi PORTE (ñòa chæ 09h): chöùa giaù trò caùc pin PORTE. Thanh ghi TRISE (ñòa chæ 89h): chöùa caùc bit ñieàu khieån PORTE vaø PSP. Thanh ghi PIR1 (ñòa chæ 0Ch): chöùa côø ngaét PSPIF. Thanh ghi PIE1 (ñòa chæ 8Ch): chöùa bit cho pheùp ngaét PSP. Thanh ghi ADCON1 (ñòa chæ 9Fh): ñieàu khieån khoái ADC taïi PORTE. Chi tieát veà caùc thanh ghi seõ ñöôïc trình baøy cuï theå ôû phuï luïc 2.