Pic_ Bai Giang

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Pic_ Bai Giang as PDF for free.

More details

  • Words: 14,957
  • Pages: 343
PIC microcontroller Microchip

GVGD: NTAT

GIÔÙI THIEÄU VEÀ PIC16F84 Caáu truùc PIC16F84 thuoäc vi ñieàu khieån 8 bit coù caáu truùc RISC( Reduce Instruction Set Computer). Caáu truùc toång quaùt cuûa noù ñöôïc bieåu dieãn döôùi daïng caùc khoái sau :

Cấu trúc RISC

Chính ñieàu naøy ñaõ taêng toác ñoä xöû lyù cuûa vi ñieàu khieån leân moät caùch ñaùng keå. Caùc vi ñieàu khieån coù caáu truùc phaàn cöùng kieåu Harvards thì ñöôïc goïi laø vi ñieàu khieån RISC. RISC laø vieát taét cuûa thuaät ngöõ “Reduce Instruction Set Computer”.

PIC16f84 coù caáu truùc RISC neân coù taäp leänh ñöôïc tinh giaûm (35 leänh). Taát caû caùc leänh naøy ñeàu ñöôïc thöïc thi trong moät chu kyø maùy,tröø caùc leänh nhaûy vaø reõ nhaùnh. PIC16F84 coù toång coäng 18 chaân, teân goïi vaø chöùc naêng töøng chaân nhö sau Chaân1: RA2, chaân thöù hai cuûa port A Chaân 2: RA3, chaân thöù ba cuûa port A Chaân 3: RA4, chaân thöù tö cuûa port A. Ngoaøi ra, chaân naøy coù coù chöùc naêng laø moät boä ñònh thôøi( TOCK1) Chaân 4: MCLR ngoõ reset vaø caáp aùp laäp trình cho vi ñieàu khieån. Chaân 5: Vss chaân noái ñaát cuûa nguoàn. Chaân 6: RB0, chaân soá 0 cuûa port B. Ngoaøi ra noù coøn laø ngoõ vaøo cuûa ngaét. Chaân 7: RB1, chaân soá 1 cuûa port B. Chaân 8: RB2, chaân soá 2 cuûa port B.

Chaân 9: RB3, chaân soá 3 cuûa port B. Chaân 10: RB4, chaân soá 4 cuûa port B. Chaân 11: RB5, chaân soá 5 cuûa port B. Chaân 12: RB6, chaân soá 6 cuûa port B. Chaân 13: RB7, chaân soá 7 cuûa port B. Chaân 14: Vdd, chaân caáp nguoàn cho vi ñieàu khieån. Chaân 15: OSC2,chaân noái vôùi boä dao ñoäng. Chaân 16: OSC1, chaân noái vôùi boä dao ñoäng. Chaân 17: RA2, chaân soá 2 cuûa port A. Chaân 18: RA1, chaân soá 1 cuûa port A.

Boä taïo xung

Reset Caùc nhieàu caùch ñeå Reset laïi vi ñieàu khieån, trong ñoù coù hai caùch chính laø Reset khi vöøa caáp nguoàn ( Power On Reset _ POR ), vaø Reset bôûi chaân MCLR.

CÁC THANH GHI 1. Thanh ghi traïng thaùi (status register)

Bit 7_ IRP ( Register bank Select bit ): laø bit thöù 8 cuûa thanh ghi STATUS laøm nhieäm vuï ñònh ñòa chæ giaùn tieáp cho RAM noäi. IRP = 1: bank 2 vaø 3 IRP = 0 bank 1 vaø 0 ( töø ñòa chæ 00h ñeán FFh). Bit 6:5 _ RP1: RP0 ( Register Bank Select Bits ): Hai bit naøy duøng ñeå choïn bank thanh ghi. 01 = Bank 1 00 = Bank 0

CÁC THANH GHI 1. Thanh ghi traïng thaùi (status register)

Bit 4 _TO (Time – out ): bit naøy ñöôïc set baèng 1 moãi khi WDT bò traøn. 1 = Chöa traøn 0 = Bò traøn Bit 3_ PD ( Power – down bit ) bit naøy ñöôïc set moãi khi vi ñieàu khieån ñöôïc caáp nguoàn, khi baét ñaàu chaïy, sau khi reset, vaø sau khi thöïc hieän leänh CLRWDT Bit 2_ Z ( Zero bit ) Duøng ñeå chæ keát quaû ra 0, ñöôïc set moãi khi keát quaû traû veà cuûa moät pheùp toaùn soá hoïc hay luaän lyù coù giaù trò laø 0.

CÁC THANH GHI 1. Thanh ghi traïng thaùi (status register)

Bit 1_ DC ( Digit Carry ) Bò aûnh höôûng bôûi caùc pheùp toaùn coäng, tröø. Đöôïc set khi tröø moät soá cho moät soá lôùn hôn, vaø ñöôïc reset trong tröôøng hôïp ngöôïc laïi. Bit 0_ C (Carry ) aûnh höôûng bôûi caùc leänh ADDWF, ADDLW, SUBLW, SUBWF.

Ví dụ Bcf STATUS, RP0 ;Clear bit PR0 để chọn bank 0. Bsf STATUS, RP0 ;set bit PR0 để chọn bank1.

Ví dụ BANK0 macro Bcf STATUS, RP0 ;Chọn bank 0 endm BANK1 macro Bsf STATUS, RP0 ;Chọn bank 1 endm

CÁC THANH GHI 1. PortB vaø TrisB Port B goàm 8 chaân. Thanh ghi töông öùng cho vieäc xaùc ñònh chieàu döõ lieäu laø TRISB.

bsf

STATUS, RP0

;Bank1

movlw 0x0F

;Xác định chân vào/ra

movwf TRISB

;Ghi vào thanh ghi TRISB

bcf

STATUS, RP0

;Bank0

bsf

PORTB, 4

;PORTB <7:4>=0

bsf

PORTB, 5

bsf

PORTB, 6

bsf

PORTB, 7

Moãi chaân trong Port B ñeàu coù saün moät ñieän trôû keùo leân coù giaù trò nhoû ôû ngay beân trong (duøng noái leân möùc logic 1 ) ñöôïc kích hoaït baèng caùch reset bit thöù 7 RBPU trong thanh ghi OPTION. Caùc ñieän trôû keùo leân naøy töï ñoäng taét khi caùc chaân cuûa port ñöôïc ñònh nghóa laø caùc ngoõ xuaát. Khi vi ñieàu khieån baét ñaàu hoaït ñoäng, caùc ñieän trôû naøy khoâng ñöôïc kích hoaït. Caùc chaân töø RB4 ñeán RB7 cuûa port B coù theå gaây ra ngaét khi traïng thaùi cuûa noù thay ñoåi töø möùc 0 leân möùc 1 vaø ngöôïc laïi. Chæ coù nhöõng chaân naøo ñöôïc ñònh nghóa laø ngoõ nhaäp môùi coù theå gaây ra ngaét ñöôïc.

2. PortA và TrisA Port A coù 5 chaân xuaát nhaäp, thanh ghi töông öùng cuûa noù laø TRISA coù ñòa chæ 85h. Cuõng gioáng nhö port B, vieäc set moät bit trong thanh ghi TRISA seõ ñònh nghóa bit töông öùng trong port A laø xuaát hay laø nhaäp. Chaân RA4 cuûa port A chæ coù theå döøng ñeå nhaäp. Ñoàng thôøi laø nguoàn xung ngoaøi cho boä ñònh thôøi TMR0.

bsf

STATUS, RP0

movlw b'11111100' movwf TRISA bcf STATUS, RP0

;Bank1 ;Xác định chân vào/ra ;Ghi vào thanh ghi TRISA ;Bank0

3. Các thanh ghi SFR Ñaây laø caùc thanh ghi coù chöùc naêng ñaëc bieät, chieám 12 oâ nhôù ñaàu tieân trong caùc bank 0 vaø bank 1.

4. Bộ đếm chương trình (PC) Boä ñeám chöông trình (PC) laø moät thanh ghi 13 bit, chöùa ñòa chæ cuûa caùc leänh caàn thöïc thi, được xaùc ñònh baèng caùch keát hôïp cuûa thanh ghi 5 bit PCLATCH cho 5 bit cao caû ñòa chæ vôùi thanh ghi 8 bit PCL cho 8 bit thaáp cuûa ñòa chæ. Baèng caùch taêng daàn noäi dung cuûa PC, vi ñieàu khieån seõ töøng böôùc thöïc hieän caùc leänh coù trong chöông trình.

5. Thanh ghi điều khiển ngắt INTCON Thanh ghi ñieàu khieån ngaét (INTCON) ñöôïc truy xuaát baèng caùch choïn bank töông öùng. Noù coù chöùc naêng cho pheùp hay laø caám xaûy ra ngaét, vaø xaùc ñònh caùc nguyeân nhaân ngaét.

Bit 7_ GIE ( Global Interupt Enable bit ): Ñaây laø bit cho pheùp hay khoâng cho pheùp ngaét. Neáu GIE = 1: Caùc ngaét ñöôïc cho pheùp. Neáu GIE = 0: Caùc ngaét bò caám. Bit 6 EEIE ( EPPROM Write Complete Interupt Enable bit ): Bit cho pheùp ngaét gaây ra taïi nôi keát thuùc cuûa vieäc vieát chöông trình con vaøo EPPROM. Bit 5 TOIE ( TMR0 Overflow Interupt Enable bit ): Bit cho pheùp kích hoaït ngaét gaây ra bôûi söï traøn cuûa TMR0.

Bit 4 INTE( INT External Interupt Enable bit ): Bit cho pheùp ngaét gaây ra bôûi ngaét ngoaøi taït chaân RB0/INT. Bit 3 RBIE ( RB port change Interupt Enable bit ) Cho pheùp ngaét xaûy ra khi coù söï thay ñoåi traïng thaùi treân caùc chaân RB4 ñeán RB7. Bit 2 TOIF ( TMR0 Overflow Interupt Flag bit ): Côø baùo traøn cuûa TMR0. Bit naøy phaûi ñöôïc xoaù baèng phaàn meàm ñeå coù theå söû duïng ngaét naøy tieáp theo.

Bit 1 INTF ( INT External Interupt Flag bit ): Côø baùo khi xaûy ra ngaét ngoaøi. Bit 0 RBIF ( RB Port Change Interupt Flag bit ): Bit xaùc ñònh söï thay ñoåi treân caùc chaân töø RB4 ñeán RB7. Bit naøy cuõng caàn phaûi ñöôïc xoaù trong chöông trình con ngaét ñeå coù theå ñaùp öùng caùc ngaét tieáp theo xaûy ra sau ñoù.

6. Thanh ghi OPTION

Bit 7 RBPU ( PORTB Pull up Enable bit ) Ñaây laø bit kích hoaït hay taét ñieän trôû noäi keùo leân coù trong caùc chaân cuûa port B. 1 = Kích hoaït 0 = Voâ hieäu

Bit 6 INTEDG ( Interupt Edge Select bit ) Neáu söï kieän ngaét ñöôïc cho pheùp, bit naøy seõ xaùc ñònh xem ngaét xaûy ra khi coù söï thay ñoåi cuûa tín hieäu taïi caïnh leân hay caïnh xuoáng. 1 = Caïnh leân 0 = Caïnh xuoáng Bit 5_ T0CS( TMR0 Clock Source Select bit ) Bit naøy seõ xaùc ñònh xem boä ñònh thôøi seõ taêng taïi moãi ¼ xung kích cuûa boä dao ñoäng, hoaëc laø taêng daàn thoâng qua xung kích töø beân ngoaøi thoâng qua chaân RA4/ T0CKI. 1 = Xung töø beân ngoaøi 0 = ¼ xung beân trong

Bit 4 T0SE ( TMR0 Source Edge Select bit ) Neáu söû duïng TMR0 nhö laø moät boä ñeám xung beân ngoaøi thoâng qua chaân RA4 thì bit naøy seõ xaùc ñònh xem boä ñeám seõ taêng taïi caïnh leân hay caïnh xuoáng cuûa xung kích. 1 = Caïnh xuoáng 0 = Caïnh leân Bit 3 PSA ( Presscaler Assignment bit ) Bit naøy seõ xaùc ñònh tæ leä giöõa TMR0 vaø WDT. 1 = Tæ leä gaùn cho WDT. 0 = Tæ leä ñöôïc gaùn cho TMR0.

Bit 0: 2 PS0, PS1, PS2 ( Presscaler Assignment bit ) Trong tröôøng hôïp söû duïng xung thaïch anh 4 MHz, thì moät chu kyø leänh toán 1us. Caùc bit PS0, PS1, PS2 seõ xaùc ñònh khoaûng thôøi gian giöõa moãi laàn taêng cuûa TMR0 hay WDT.

7. Thanh ghi EECON1

Bit 4 EEIF (EEPROM Write Operation Interupt Flag bit) Bit duøng ñeå baùo cho vi ñieàu khieån bieát quaù trình ghi döõ lieäu vaøo EPPROM ñaõ keát thuùc. Khi keát thuùc quaù trình ghi, thì bit naøy seõ töï ñoäng set leân 1. Ngöôøi laäp trình caàn phaûi xoaù bit naøy baêng phaàn meàm ñeå noù coù theå nhaän bieát ñöôïc moät söï keát thuùc cuûa vieäc ghi tieáp theo. 1 = Ghi keát thuùc 0 = Ghi chöa xong, hoaëc chöa baét ñaàu ghi

Bit 3 WRERR (Write EPPROM Error Flag ) Baùo loãi neáu gaëp trong quaù trình ghi vaøo EPPROM. Bit naøy chæ ñöôïc set leân khi quaù trình ghi vaøo EPPROM bò ngaét bôûi moät tín hieäu reset hoaëc bò traøn WDT khi WDT ñöôïc kích hoaït. 1 = Coù loãi xaûy ra 0 = Khoâng coù loãi Bit 2 WREN ( EPPROM Write Enable bit ): Bit cho pheùp ghi vaøo EPPROM. Neáu bit naøy khoâng ñöôïc set leân thì vi ñieàu khieån seõ khoâng cho pheùp ghi vaøo EPPROM.

Bit 1 WR (Write Control bit ): Vieäc set bit naøy leân seõ khôûi taïo vieäc ghi döõ lieäu töø thanh ghi EEDATA ñeán moät ñòa chæ cuï theå thoâng qua thanh ghi EEDR. 1 = Khôûi taïo ghi 0 = Khoâng khôûi taïo Bit 0 RD ( Read Control bit ): Bit duøng ñeå ñieàu khieån vieäc khôûi taïo quaù trình chuyeån döõ lieäu töø moät ñòa chæ ñaõ ñöôïc ñònh nghóa trong EEDR ñeán thanh ghi EEDATA. 1 = Khôûi taïo 0 = Khoâng khôûi taïo

Tổ chức bộ nhớ Pic 16F84 có 2 loại bộ nhớ: Bộ nhớ dữ liệu (EEprom) Bộ nhớ chương trình (Flash) Boä nhôù chöông trình (FLASH), tăng số lần nap chương trình. Dung löôïng cuûa boä nhôù chöông trình naøy laø 1024 doøng leänh vôùi ñoä daøi 14 bit, trong ñoù caùc vò trí töø 0h ñeán 4h ñöôïc duøng cho caùc vector reset vaø ngaét.

Định địa chỉ Địa chỉ ô nhớ trong RAM có thể được truy xuất bằng hai cách: Định địa chỉ trực tiếp. Định địa chỉ gián tiếp. Bsf STATUS, RP0 ;Bankl movlw 0xFF ;w=0xFF movwf TRISA

Movlw

0x0c

Movwf

FSR

Loop: clrf incf

FSR

btfss

FSR,4

goto

loop

Continue ….

INDF

;Kiểm tra bit thứ 4 =1 ?

Boä nhôù döõ lieäu bao goàm boä nhôù RAM vaø EPPROM. Boä nhôù EPPROM bao goàm 64 byte, noäi dung cuûa noù khoâng bò maát ñi neáu lôõ nhö maát nguoàn. EPPROM khoâng ñöôïc ñònh ñòa chæ tröïc tieáp, maø ñöôïc truy xuaát giaùn tieáp thoâng qua 2 thanh ghi laø EEADR vaø EEDATA. Bộ nhôù EPPROM ñöôïc duøng cho vieäc löu tröõ nhöõng thoâng soá quan troïng, neân khi laäp trình caàn phaûi tuaân theo moät soá quy taéc ñeå traùnh maéc loãi trong luùc vieát. Boä nhôù Ram coù ñòa chæ töø 0x0C ñeán 0x4F, bao goàm 68 oá nhôù 8 bit. Vieäc xaùc ñònh vò trí cuûa RAM cuõng ñöôïc thöïc hieän thoâng qua thanh ghi GPR

PIC16F84 coù moät boä nhôù döõ lieäu EPPROM vôùi dung löôïng 64 bytes coù ñòa chæ töø 00h ñeán 63h, coù theå ñöôïc ghi hay ñoïc. Ñaëc tính quan troïng nhaát cuûa noù chính laø döõ lieäu caát trong noù khoâng bò maát ñi khi bò maát nguoàn. Döõ lieäu coù theå löu trong EPPROM ñöôïc baûo toaøn ñeán 40 naêm. Boä nhôù EPPROM ñöôïc ñaët trong moät vuøng nhôù ñaëc bieät vaø coù theå ñöôïc truy xuaát thoâng qua caùc thanh ghi ñaëc bieät. Chuùng laø: EEDATA chöùa caùc döõ lieäu ñoïc vieát. EEADR chöùa ñòa chæ cuûa phaân vuøng EPPROM caàn truy xuaát. EECON1 chöùa caùc bit ñieàu khieån. EECON2 thanh ghi naøy khoâng toàn taïi veà maët vaät lyù, maø noù duøng ñeå baûo veä EPPROM khoûi nhöõng loãi laäp trình khoâng ñaùng coù.

Caùc taøi nguyeân khaùc Timer

PIC16F84 coù moät boä timer 8 bit, vaø nhö vaäy giaù trò toái ña maø timer ñeám laø 256 Sau moãi laàn timer ñeám ñeán 255, noù seõ töï reset giaù trò veà 0 vaø baét ñaàu ñeám laïi töø ñaàu. Taïi thôøi ñieåm timer chuyeån giaù trò töø 255 veà 0, bit T0IF trong thanh ghi INTCON seõ ñöôïc set leân 1. Neáu nhö caùc ngaét ñöôïc cho pheùp xaûy ra, thì con troû chöông trình seõ nhaûy ñeán chöông trình con phuïc vuï ngaét. Beân caïnh vieäc nhaän xung noäi, giaù trò cuûa timer cuõng coù theå taêng leân nhôø vaøo vieäc nhaän xung töø beân ngoaøi thoâng qua chaân RA4/ TOCKI, vaø khi ñoù timer hoaït ñoäng nhö moät boä ñeám.

Caùc taøi nguyeân khaùc Ngaét ngoaøi treân chaân RB0/INT Ñöôïc kích hoaït bôûi tín hieäu caïnh leân (neáu bit INTEDG = 1 trong thanh ghi OPTION ) hoaëc bôûi tín hieäu caïnh xuoáng ( neáu INTEDG = 0 ). Khi coù tín hieäu xuaát hieän treân chaân INT, bit INTF seõ ñöôïc set trong thanh ghi INTCON. Bit naøy phaûi ñöôïc xoaù ñi trong chöông trình phuïc vuï ngaét ñeå ngaét khoâng xaûy ra nöõa khi quay laïi chöông trình chính. Ngaét do söï traøn cuûa boä ñeám TMR0 Khi TMR0 bò traøn, noù seõ set bit TOIF leân 1. Ñaây laø moät chöùc naêng quan troïng. Ngaét do cô cheá naøy coù theå ñöôïc cho pheùp hay caám baèng caùch set/ reset bit T0IE.

Caùc taøi nguyeân khaùc Ngaét do söï thay ñoåi traïng thaùi treân caùc chaân RB4:RB7. Söï thay ñoåi traïng thaùi treân caùc chaân RB4: RB7 seõ set bit RBIF (INTCON< 0 > ) leân 1, töø ñoù kích hoaït ngaét xaûy ra. Ñeå caùc chaân naøy nhaän ñöôïc söï thay ñoåi traïng thaùi cuûa tín hieäu, thì chuùng phaûi ñöôïc ñònh nghóa laø caùc ngoõ nhaäp. Neáu moät trong caùc chaân naøy ñöôïc ñònh nghóa laø ngoõ xuaát, thì ngaét seõ khoâng xaûy ra. Neáu ñònh nghóa taát caû chuùng ñeàu laø ngoõ xuaát, thì traïng thaùi hieän thôøi cuûa chuùng seõ ñöôïc so saùnh vôùi giaù trò cuõ ñöôïc löu ôû laàn ñoïc cuoái cuøng töø port B.

Caùc taøi nguyeân khaùc Khôûi taïo ngaét Ñeå coù theå ñöôïc chöùc naêng ngaét cuûa vi ñieàu khieån, thì ñaàu tieân phaûi thöïc hieän caùc leänh khôûi taïo ban ñaàu baèng caùch xaùc ñònh caùc bit töông öùng trong thanh ghi ñieàu khieån ngaét INTCON.

Ví dụ: Chương trình sử dụng ngắt Org

ISR_ADDR

Btfsc

INTCON, GIE

Goto

ISR_ADDR

PUSH Btfsc Goto Btfsc Goto Btfsc Goto

INTCON, RBIF ; Kiểm tra chân 4,5,6,7 port B có thay đổi ISR_PortB INTCON, INTF ; Ngắt ngoài diễn ra ISR_RB0 INTCON, T0IF ; Timer 0 ISR_TMR0

ISR_PortB …. goto END ISR

ISR_RB0 …. goto END

ISR

………………….. END_ISR POP RETFIE

; trở về và set lai bit GIE

LẬP TRÌNH HỢP NGỮ CHO PIC 16F84 1. Biểu diễn số trong trình biên dịch Trong hợp ngữ MPLAB, các số có thể biểu diễn dưới dạng thập phân, thập lục phân, hoặc nhị phân.. Chúng ta sẽ minh hoạ điều này với số 240: .240 ;Decimal 0xF0 ;Thập lục phân B’11110000’ ;nhị phân Số thập phân được bắt đầu bằng một dấu chấm, số thập lục phân được bắt đầu bằng 0x, và số nhị phân bắt đầu bằng chữ b với dấu nháy đơn.

2. Các yếu tố của hợp ngữ: -Nhãn -Lệnh -Toán tử -Các chỉ dẫn -Lời chú thích Nhãn: Nhãn biểu thị địa chỉ của lệnh theo sau. Khi có sự rẽ nhánh đến lệnh này, nhãn được dùng trong trường toán hạng của lệnh rẽ nhánh hoặc nhảy.

Mã gợi nhớ lệnh: Mã gợi nhớ lệnh hoặc chỉ dẫn của trình hợp ngữ theo sau trường nhãn. Cách thức mà chúng ta viết lệnh được gọi là cú pháp. Trong ví dụ sau, chúng ta có thể nhận ra lỗi trong khi viết bởi vì lệnh movlp và gotto không tồn tại trong vi xử lý PIC16F84. Lệnh viết đúng: Movlw H’01FF’ Goto Start Lệnh viết sai: Movlp H’01FF’ Gotto Start

Toán hạng: Toán hạng theo sau mã gợi nhớ. Toán hạng chứa địa chỉ hoặc dữ liệu mà lệnh sẽ sử dụng. Toán hạng là nhân tố cho lệnh đang thực thi, thường là các thanh ghi, biến hoặc hằng. Lời chú thích: Lời chú thích là một chuỗi ký tự mà người lập trình viết để làm cho chương trình rõ ràng, được đặt sau lệnh và bắt đầu bằng dấu chấm phẩy(;).

Tập lệnh của PIC: Tập lệnh của PIC được xây dựng trên cơ sở ngôn ngữ Assemble. Tuy nhiên để người dùng dễ dàng tiếp cận và giúp cho quá trình lập trình trở nên đơn giản hơn, tập lệch của PIC được tối thiểu hoá còn 35 lệnh. Movlw Dạng lệnh: Movlw K Hoạt động: Ghi hằng số K vào thanh ghi W Giá trị của K từ 0 đến 255 Không tác động lên cờ Số chu kỳ:1 Số byte: 2

Movwf Dạng lệnh: Movwf f Hoạt động: Nội dung của thanh ghi W được chép sang thanh ghi F Giá trị của f từ 0 đến 127 Không tác động lên cờ Số chu kỳ:1 Số byte: 2

Movf Dạng lệnh: Movf f, d Hoạt động: Nội dung của thanh ghi f được lưu trữ vào thanh ghi d Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

Clrw Dạng lệnh: Clrw Hoạt động: Xoá thanh ghi W Tác động lên cờ :Z Số chu kỳ: 1 Số byte: 2

Clrf Dạng lệnh: Clrf f Hoạt động: Xoá thanh ghi f Thanh ghi f có giá trị từ 0 đến 127 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

Swapf Dạng lệnh: Swapf f, d Hoạt động: Nibbles thấp và nibbles cao của thanh ghi f được hoán đổi vị trí cho nhau. Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Không tác động lên cờ Số chu kỳ:1 Số byte: 2

Addlw Dạng lệnh: Addlw K Hoạt động: Nội dung của thanh ghi W được cộng với hằng số tám bit K, kết quả lưu vào thanh ghi W Tác động lên cờ:C,DC,Z Số chu kỳ:1 Số byte: 2

Addwf Dạng lệnh: Addwf f,d Hoạt động: (W) + (f) => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ: C,DC,Z Số chu kỳ:1 Số byte: 2

Sublw Dạng lệnh: Sublw K Hoạt động: K-(W) => W Hằng số K có giá trị tứ 0 đến 255 Tác động lên cờ:C,DC,Z Số chu kỳ:1 Số byte: 2

Subwf Dạng lệnh: Subwf f,d Hoạt động: (F) –(w) => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ:C,DC,Z Số chu kỳ:1 Số byte: 2

Andlw Dạng lệnh: Andlw K Hoạt động: (W) and k => W Hằng số K có giá trị tứ 0 đến 255 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

Andwf Dạng lệnh: Andwf f,d Hoạt động: (W) and F => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

Iorlw Dạng lệnh: IORLW Hoạt động: Hằng số K có giá trị tứ 0 đến 255 Hoạt động của lệnh:(W) OR (K) => W Hằng số K có giá trị tứ 0 đến 255 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

IORWF Dạng lệnh: IORWF f,d Hoạt động: (W) OR (F) => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

XORLW Dạng lệnh: XORLW K Hoạt động: Hằng số K có giá trị tứ 0 đến 255 Hoạt động của lệnh:(W) XOR (K) => W Hằng số K có giá trị tứ 0 đến 255 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

XORWF Dạng lệnh: XORWF f,d Hoạt động: (W) XOR (F) => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

INCF Dạng lệnh: INCF f,d Hoạt động: (F) + 1 => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

DECF Dạng lệnh: DECF f,d Hoạt động: (F) - 1 => d Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :Z Số chu kỳ:1 Số byte: 2

RLF Dạng lệnh: RLF f,d Hoạt động: Dich thanh ghi F sang trai 1 bit thông qua cờ c. Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :C Số chu kỳ:1 Số byte: 2

RRF Dạng lệnh: RRF f,d Hoạt động: Dich thanh ghi F sang phải 1 bit thông qua cờ C. Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :C Số chu kỳ:1 Số byte: 2

COMF Dạng lệnh: COMF f,d Hoạt động: Lấy bù nội dung của thanh ghi F. Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :C Số chu kỳ:1 Số byte: 2

BSF BCF Dạng lệnh: BSF f,b Dạng lệnh: BCF f,b Hoạt động: Hoạt động: Set bit b của thanh ghi f lên 1. Xoá bit b của thanh ghi f về 0. Giá trị của thanh ghi f từ 0 đến 127 Giá trị của thanh ghi f từ 0 đến 127 Giá trị của b từ 0 đến 7 Giá trị của b từ 0 đến 7 Không tác động lên cờ Không tác động lên cờ Số chu kỳ:1 Số chu kỳ:1 Số byte: 2 Số byte: 2

BTFSC Dạng lệnh: BTFSC f,b Hoạt động: - Nếu bit b trong thanh ghi f bằng 0,con trỏ chương trình sẽ nhảy đến lệnh kế tiếp. INCFSZ Dạng lệnh: INCFSZ f,d Hoạt động: Nếu d = 0 kết quả được lưu vào thanh ghi w Nếu d = 1 kết quả được lưu vào thanh ghi f Hoạt động của lệnh:(f) + 1 => d Giá trị của thanh ghi f từ 0 đến 127

GOTO Dạng lệnh: GOTO K Hoạt động: Nhảy vô điều kiện đến địa chỉ K. Giá trị của K từ 0 đến 2048 Không tác động lên cờ Số chu kỳ:1 Số byte: 4

CALL Dạng lệnh: CALL K Hoạt động: Gọi chương trình con Giá trị của K từ 0 đến 2048 Không tác động lên cờ Số chu kỳ:1 Số byte: 4

RETURN Dạng lệnh: RETURN Hoạt động: Lấy nội dung từ đỉnh của ngăn xếp lưu vào bộ đếm chương trình. Không tác động lên cờ Số chu kỳ:1 Số byte: 4

RETLW Dạng lệnh: RETLW K Hoạt động: (K) =>w ; TOS => PC Giá trị của thanh ghi F từ 0 đến 255 Không tác động lên cờ Số chu kỳ:1 Số byte: 4

RETFIE Dạng lệnh: RETFIE Hoạt động: TOS =>PC;1=>GIE Không tác động lên cờ Số chu kỳ:1 Số byte: 4

NOP Dạng lệnh: NOP Hoạt động: Không làm gì cả. Không tác động lên cờ Số chu kỳ:1 Số byte: 4

CLRW DT Dạng lệnh: CLRWDT Hoạt động: 0=> WDT 0=>WDT prescaler 1=> TO 1=>PD Tác động lên cờ:TO,PD Số chu kỳ:1 Số byte: 2

SLEEP Dạng lệnh: SLEEP Hoạt động: Chế độ dừng.

Cách nạp chương trình Giới thiệu phần mềm MPLAB MBLAP® là phần mềm được nhà sản xuất_Microchip cung cấp giúp người dùng lập trình cho PIC bằng ngôn ngữ Assemble. Phần mềm hỗ trợ đầy đủ các modul tiện ích giúp cho việc lập trình và nạp vào chip. Các modul của phần mềm gồm: Project: hỗ trợ công cụ quản lý 1 Project. Gồm các phần: Quản lý project Workspace: hỗ trợ soạn thảo lệnh Build: Dịch tập tin.Asm sang mã máy.Hex Debugger: Mô phỏng và sửa lỗi Programmer: hỗ trợ phần mềm nạp chip với các mạch nạp chuẩn: PICSTART Plus, MPLAB MP3, MPLAB ICD2, PRO MATE 2

Phần mềm nạp chip IC – PROG: Trong các ứng dụng này, phần mềm được dùng để nạp cho chip PIC16F84 là phần mềm IC-Prog. Đây là phần mềm hỗ trợ nạp chip vi điều khiển khá nhỏ gọn nhưng rất hiệu quả. Icprog không chỉ hỗ trợ nạp tất cả các chip vi điều khiển thuộc dòng PIC mà còn hỗ trợ các họ khác như: 59Cxx, 24Cxx, 93Cxx, BR, CXK… Mỗi loại vi điều khiển đều được phần mềm hổ trợ mạch nạp mà chúng ta có thể tham khảo tại trang web: http\\www.Icprog.Com

Một đặc điểm rất hay và tiện lợi của chương trình là nó có khả năng dịch ngược tập tin mã máy.Hex về dạng mã gợi nhớ .Asm khá chính xác. Điều đó giúp cho người lập trình có thể kiểm tra và sửa lỗi ngay khi nạp hay dùng lại mã lệnh đã được lưu trên chip (CP off_code protection)

Mach nạp JDM JDM được thiết kế theo phương pháp chuẩn nạp cho PIC16F84 (PIC16F84A) và PIC16C84 được nhà sản xuất Mircochip hướng dẫn. Mạch nạp khá đơn giản:

Mạch trên được thiết kế theo chuẩn COM 25 chân. Chúng ta có thể chuyển đổi tương đương các chân tương ứng sang chuẩn COM 9 chân theo bảng sau: Chöùc naêng

Chaân (25 chaân)

Chaân (9 chaân)

Teân goïi

2

3

Txd

Truyeàn döõ lieäu

RTS

Yeâu caàu gôûi. Boä truyeàn ñaït ñöôïc naøy leân cao khi saün saøng truyeàn döõ lieäu.

4

7

5

8

CTS

7

5

SG

20

4

DTR

Xoaù ñeå gôûi. Boä gôûi ñaët ñöôøng naøy leân möùc cao ñeå thoâng baùo cho boä truyeàn laø noù saün saøng nhaän döõ lieäu. Ñaát cuûa tín hieäu Ñaàu cuoái döõ lieäu saün saøng. Hoaït ñoäng gioáng nhö RTS nhöng ñöôïc kích hoaït bôûi boä nhaän khi muoán truyeàn döõ lieäu.

Mạch nạp PG2

Mạch nạp ICD2 Tham khảo CD included

Viết macro Tên macro

macro par1, par2,..

Lệnh 1

Lệnh 2 …

endm

Vd bank0

bank1

enableint

disableint

macro

; Macro bank0

bcf STATUS, RP0

; Reset RP0 bit = Bank0

endm

; End of macro

macro

; Macro bank1

bsf STATUS, RP0

; Set RP0 bit = Bank1

endm

; End of macro

macro

ngắt; Cho phép toàn cục

bsf INTCON, 7

; Set the bit

endm

; End of macro

macro

;

Tắt cho phép ngắt toàn cục

bcf INTCON, 7

; Reset the bit

endm

; End of macro

Vd input

macro par1, par2

; Macro input

bank1

; truy cập thanh ghi TRIS

bsf par1, par2 bank0

; Chọn bank 0

endm

; End of macro

output macro par1, par2 bank1

; Macro output ; truy cập thanh ghi TRIS

bcf par1, par2 bank0 endm Vd:

; Chọn bank 0 ; End of output TRISB, 7 macro ; chân RB7 xuất

Subprograms Label set of instructions set of instructions set of instructions return or retlw

Ví dụ

PIC 16F877 z z z z z z

40 pins IC 8 K Word (14 bits) Program memory 368 Bytes data memory 256 Bytes EEPROM Ook hier slechts 35 instructies. Speciale functies: z z z z z

10 channel 8-bit analog input SPI serial port USART serial communication Brown-out detection In-circuit programmable

Chuẩn điện áp ngõ va 0-5 V

ỨNG DỤNG Ví dụ 1: Công tắc on/off

#include ; Pin Declarations #define SW2 #define LED ; Variable Declarations cblock 0x20 Temp endc

PORTA,0 PORTD,7

#include



org 0x00 goto Initialize org 0x05 Initialize bsf STATUS,RP0 bcf TRISD,7 bsf TRISA,0 ; oscillator frequency movlw b'01110000' movwf OSCCON

; RD7 output ; RA0 input ; 8Mhz

; Thiet lap thanh ghi thoi gian movlw b'10000110' Prescaler 1:128 movwf OPTION_REG ; Tat bo so sanh movlw 0x07 movwf CMCON0 ; Tat kenh analog clrf ANSEL bcf

STATUS,RP0

bcf

LED

; tat PORTB keo len, TMR0

; tat so sanh

; ve bank 0 ; xoa LED

Main btfsc SW2 goto Main movlw 0x80 xorwf PORTD,f TT1

; Kiem tra sw2 nhan ; Dung cong xor de dao trang thai ; toggle RD7 on and off ; Cho sw2 nha ra

btfss SW2 goto TT1 clrf TMR0 ; khi nha xoa co TMR0 and the va co ngat TMR0 bcf INTCON,T0IF ; in preparation to time 16ms

TT2

; kiem tra sw2 khong dc nhan 16ms truoc btfss SW2 ; cho lan nhan tiep theo goto TT1 ; neu sw2 duoc nhan thi ve TT1 btfss INTCON,T0IF ; Neu khong tiep tuc dem 16mm goto TT2 ; Time = TMR0_max * TMR0 prescaler * (1/(Fosc/4)) = 256*128*0.5E-6 = 16.4ms goto Main END

Ví dụ 2: Dùng bộ so sánh

#include #definePOT #define SENSE #define LED

PORTA,0 PORTA,3 PORTD,7

; Khai bao bien cblock 0x20 OnCntr ; Khai bao tre OffCntr endc

#include org 0x00 Initialize bsf STATUS,RP0 ; Dinh nghia cac chan bcf TRISD,7 bsf TRISA,0 bsf TRISA,3 ; set thach anh noi movlw b'01110000' movwf OSCCON ; Set thong so TMR0 MOVLW B'10000000' MOVWF OPTION_REG ; thiet lap bo so sanh movlw b'00010100' movwf CMCON0 ; Tat kenh analog clrf ANSEL bcf

STATUS,RP0

; set bank 1 ; RD7 output ; RA0 input ; RA3 input ; 8Mhz ;Tat dien tro keo len ;TMR0 Prescaler 1:1 ; chon 2 bo so sanh doc lap

; ve lai bank 0

Main btfss INTCON,T0IF truoc khi chay bo so sanh goto Main bcf INTCON,T0IF banksel btfss goto btfsc goto

CMCON0 CMCON0, C1OUT ; LEDon CMCON0, C1OUT LEDoff

; cho Timer 0 tran

LEDon clrf clrf incf btfsc gian thi sang led bsf goto

STATUS OffCntr OnCntr,f STATUS,Z

; Bank 0 ; Xoa counter de tat LED ; Kich hoat counter de on LED ; Neu bo so sanh ko doi trong khoang thoi

LED Main

LEDoff clrf clrf incf btfsc gian thi tat led bcf goto END

STATUS OnCntr OffCntr,f STATUS,Z LED Main

; Bank 0 ; Xoa counter de tat LED ; Kich hoat counter de on LED ; Neu bo so sanh ko doi trong khoang thoi

PIC BASIC PROGRAMMING

ỨNG DỤNG Ví dụ 1

Trong mạch điều khiển, các Led được nối với chip qua các chân RB1, RB2, RB4, RB5, RB6. Buttom SW1 nối chân ngắt ngoài RB0/INT với mass, làm chức năng như nút Start. Khi ngắt ngoài được kích, chương trình sẽ rẽ nhánh đến chương trình con điều khiển Led để điều khiển Led nhấp nháy. Button SW2 nối chân kiểm tra điều kiện RA0 với mass, làm chức năng như nút Stop. Khi nút Stop được nhấn, làm cho chân RA0 xuống mức điện áp thấp, khi đó chương trình sẽ được thoát khỏi chương trình con điều khiển Led, trở về chương trình chính.

ỨNG DỤNG Ví dụ 2

ỨNG DỤNG Ví dụ 3 Các chân của LCD Modul LCD tuân theo qui cách giao tiếp chuẩn. Gồm 14 chân, có 8 đường dữ liệu, 3 đường điều khiển và 3 đường cấp nguồn bố trí trên 1 hàng.

Chaân soá

Teân

Chöùc naêng

1

Vss

Ñaát

2

VDD

Cöïc+ cuûa nguoàn

3

VEE

Töông phaûn (constrast)

4

RE

Choïn thanh ghi (Register Select)

5

R/W

Read/write

6

E

Cho pheùp (Enable)

7

D0

Bít döõ lieäu 0

8

D1

Bít döõ lieäu 1

9

D2

Bít döõ lieäu 2

10

D3

Bít döõ lieäu 3

11

D4

Bít döõ lieäu 4

12

D5

Bít döõ lieäu 5

13

D6

Bít döõ lieäu 6

14

D7

Bít döõ lieäu 7

Chân 4 (RS_Register Select) đây là 1 trong 3 ngõ vào điều khiển lệnh. Khi chân này được nối mass thì các dữ liệu truyền đến LCD được xử lý như các mệnh lệnh và các dữ liệu đọc ra chỉ trạng thái của nó. Bằng cách đưa chân này lên mức cao thì dữ liệu ký tự có thể xuất nhập trên modul này. Chân 5 (R/W_Read/Write), chân này cho phép lệnh hay dữ liệu ký tự được ghi vào modul khi nó được kéo xuống mức thấp. Khi được đưa lên cao, nó cho phép dữ liệu ký tự hay thông tin trạng thái được đọc từ các thanh ghi của modul.

Chân 6 (E_ Enable), ngõ vào này dùng để khởi động việc chuyển các dữ liệu ký tự hay các lệnh giữa modul và các đường dữ liệu. Khi ghi ra màn hình LCD, dữ liệu chỉ được chuyển khi có cạnh xuống của tín hiệu E này. Tuy nhiên khi đọc ra từ LCD, thì dữ liệu khả dụng sau khi có chuyển tiếp từ thấp lên cao và duy trì dữ liệu khả dụng đến khi tín hiệu E này xuống thấp 1 lần nữa. Các chân từ 7 đến 14 là 8 đường dữ liệu (D0 ÷ D7). Dữ liệu có thể được chuyển đến và lấy ra khỏi bộ hiển thị LCD theo dạng một byte hay dạng nửa byte 4 bit (nibble). Trong trường dùng trong ứng dụng này là dùng 4 bit vì chế độ này cần ít đường tín hiệu hơn.

Chú ý Summary of the PICs Built-in Peripherals SPI (Serial Peripheral Interface) uses 3 wires (data in, data out, clock), Master/Slave (can have multiple masters), very high speed (1.6 Mbps), and full speed simultaneous send and receive (full duplex). I2C (Inter IC) uses 2 wires (data and clock), Master/Slave. There are lots of cheap I2C chips available; typically < 100kbps. UART (Universal Asynchronous Receiver/Transmitter) with baud rates of 300bps to 115kbps, 8 or 9 bits, parity, start and stop bits, etc. Outputs 5V hence an RS232 level converter (e.g. MAX232) is required.

Timers, both 8 and 16 bits, many have prescalers and some have postscalers. In 14 bit cores they generate interrupts. External pins (clock in/clock out) can be used for counting events. Ports have two control registers: TRIS sets whether each pin is an input or an output and PORT sets their output bit levels. Note: Other peripherals may steal pins, so in this respect peripheral registers control ports as well. Most pints have 25mA source/sink (LED enabled), but not all pins, it is important to look up the datasheet. Floating input pints must be tied off (or set to outputs).

CCS http://www.hcilab.org/resources/icdu/icdu-howto.htm http://www.hcilab.org/resources/ccsc/ccsc-howto.htm http://www.hcilab.org/resources/ides_and_tools/ides_and_tools.htm Là các trang web hữu ích cho lập trình PIC

Cài đặt Sau khi cài MPLAB Æ cài CCS, crack…

CCS

CCS

Tập lệnh Khai báo lệnh

CCS

Tập lệnh

CCS

CCS CCS hỗ trợ lệnh hợp ngữ theo các dòng PIC

CCS CCS hỗ trợ lệnh hợp ngữ theo các dòng PIC

CCS

CCS

Vd:

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS (khai báo) Cấu trúc

CCS

CCS VD:

CCS

CCS Biểu diễn dạng dữ liệu

Toán tử

CCS

CCS

CCS – Tập lệnh C

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS

CCS Biên dịch

CCS Liên kết với MPLAB

Cài CCS như một Plug in của MPLAB Cài SETUP_MPLAB_PLUGIN

Cài CCS như một Plug in của MPLAB

Cài CCS như một Plug in của MPLAB

Cài CCS như một Plug in của MPLAB

Các ví dụ Sáng tắt led

#include<16F84a.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) main() { while(TRUE) { output_high(PIN_A1); delay_ms(100); output_low(PIN_A1); delay_ms(100); } }

Test RS 232 #include <16F877.h> #device PIC16F877 *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock = 4000000) #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) main() { while(TRUE) { putc('T'); // Transmit T putc('e'); // Transmit e putc('s'); // Transmit s putc('t'); // Transmit t putc('i'); // Transmit i putc('n'); // Transmit n putc('g'); // Transmit g putc('.'); // Transmit . putc('.'); // Transmit . putc('.'); // Transmit . delay_ms(1000); } }

Nhận Rs232 và gửi #include <16F877.h> #device PIC16F877 *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock = 4000000) #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) main() { while(TRUE) { putc(getc()); } }

Rs232 và ADC

Rs232 và ADC #include <16F877.h> #device PIC16F877 *=16 ADC=10 // ghi #device adc = 10 de dung adc 10-bit // default la 8 bits #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock = 4000000) #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) main() { long int adcValue; // luu bien 16-bit de doc ADC char adcHI,adcLO; // frame 8-bit luu real-time setup_adc_ports(A_ANALOG); // port A lam ADC setup_adc(ADC_CLOCK_INTERNAL); // Dung ADC clock noi set_adc_channel(0); delay_us(20); // Cho lay mau

while(TRUE) { adcValue = read_adc(); // Doc ADC /* Cat gia tri 16bit ADC thanh 2 frame 8 bit */ adcHI = (char)((adcValue >> 5)& 0x1f); // 0|0|0|d9|d8|d7|d6|d5 adcLO = (char)((adcValue & 0x1f)|0x80); // 1|0|0|d4|d3|d2|d1|d0 putc(adcHI); // Gui byte 1 (d9...d5) putc(adcLO); // Gui byte 2 (d4...d0) delay_ms(10); // delay de on dinh } }

Thay đổi baud rate dùng Dip-switch #include <16F877.h> #device PIC16F877 *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #byte PORTE = 0x09 #use delay(clock = 20000000) // 20MHz clock, change this value if using different clock speed. #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) #use fast_io(E) // truy cap truc tiep PortE (ko mat tgian voi TRISE) void SetBaudRate(); main() { set_tris_e(0x17); SetBaudRate();

// TRISE = 00010111; RE2,RE1 va RE0 TTL Inputs

while(TRUE) { putc('T'); // Transmit T putc('e'); // Transmit e putc('s'); // Transmit s putc('t'); // Transmit t putc('i'); // Transmit i putc('n'); // Transmit n putc('g'); // Transmit g putc('.'); // Transmit . putc('.'); // Transmit . putc('.'); // Transmit . delay_ms(1000); } }

void SetBaudRate() { switch(PORTE & 0x07) // doc dip switches va thay doi baud rate { case 0: set_uart_speed(4800); break; case 1: set_uart_speed(9600); break; case 2: set_uart_speed(14400); break; case 3: set_uart_speed(19200); break; case 4: set_uart_speed(32768); break; case 5: set_uart_speed(38400); break; case 6: set_uart_speed(57600); break; case 7: set_uart_speed(115200); break; } }

Nhận và gửi rs232 với baud rate thay đổi #include <16F877.h> #device PIC16F877 *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #byte PORTE = 0x09 #use delay(clock = 20000000) // 20MHz clock. #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) void SetBaudRate(); main() { set_tris_e(0x17); SetBaudRate(); while(TRUE) { putc(getc()); } }

void SetBaudRate() { switch(PORTE & 0x07) { case 0: set_uart_speed(4800); break; case 1: set_uart_speed(9600); break; case 2: set_uart_speed(14400); break; case 3: set_uart_speed(19200); break; case 4: set_uart_speed(32768); break; case 5: set_uart_speed(38400); break; case 6: set_uart_speed(57600); break; case 7: set_uart_speed(115200); break; } }

Biến đổi ADC 1 kênh rồi gửi ra RS232 #include <16F877.h> #device PIC16F877 *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #byte PORTE = 0x09 #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) #use fast_io(E) void SetBaudRate(); main() { long int adcValue; char adcHI,adcLO; set_tris_e(0x17); SetBaudRate(); setup_adc_ports(A_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); delay_us(20);

while(TRUE) { adcValue = read_adc(); // doc ADC adcHI = (char)((adcValue >> 5)& 0x1f); // 0|0|0|d9|d8|d7|d6|d5 adcLO = (char)((adcValue & 0x1f)|0x80); // 1|0|0|d4|d3|d2|d1|d0 putc(adcHI); putc(adcLO); delay_ms(1); }} void SetBaudRate() { switch(PORTE & 0x07) // Read dip switches and setup baud rate { case 0: set_uart_speed(4800); break; case 1: set_uart_speed(9600); break; case 2: set_uart_speed(14400); break; case 3: set_uart_speed(19200); break; case 4: set_uart_speed(32768); break; case 5: set_uart_speed(38400); break; case 6: set_uart_speed(57600); break; case 7: set_uart_speed(115200); break; }}

ADC 2 kênh, delay fixed, thay đổi baud rate

#include <16F877.h> #device PIC16F877 *=16 ADC=10 #fuses HS,NOWDT,NOPROTECT,NOLVP #byte PORTE = 0x09 // PortE lives in File 9 #use delay(clock = 20000000) #use rs232(baud=9600, xmit = PIN_C6, rcv = PIN_C7, parity = N, bits = 8) #use fast_io(E) // Fast access to PortE (don't fiddle with TRISE) void SetBaudRate(); main() { long int adcValue; // luu gia tri vien doi adc vao thanh ghi 16 bit char adcHI,adcLO; set_tris_e(0x17); // TRISE = 00010111; RE2,RE1 and RE0 TTL Inputs SetBaudRate(); setup_adc_ports(A_ANALOG); // RA0 - RA4 Analog, RE0 - RE2 digital setup_adc(ADC_CLOCK_DIV_32); set_adc_channel(0); delay_us(20); // delay lay mau

while(TRUE) { adcValue = read_adc(); // doc ADC /* cat 16 bit thanh 2 byte adcHI = (char)((adcValue >> 5)& 0x1f); adcLO = (char)((adcValue & 0x1f)|0x80); putc(adcHI); // gui Byte 1 (d9...d5) putc(adcLO); // gui Byte 2 (d4...d0) set_adc_channel(1); delay_us(20); // delay lay mau adcValue = read_adc(); // doc ADC

// 0|0|0|d9|d8|d7|d6|d5 // 1|0|0|d4|d3|d2|d1|d0

/* Kenh 2 */ adcHI = (char)(((adcValue >> 5)& 0x1f)|0x20); adcLO = (char)((adcValue & 0x1f)|0xA0); putc(adcHI); // gui Byte 1 (d9...d5) putc(adcLO); // gui Byte 2 (d4...d0) set_adc_channel(0); delay_ms(10); } }

// 0|0|1|d9|d8|d7|d6|d5 // 1|0|1|d4|d3|d2|d1|d0

void SetBaudRate() { switch(PORTE & 0x07) // doc dip switches { case 0: set_uart_speed(4800); break; case 1: set_uart_speed(9600); break; case 2: set_uart_speed(14400); break; case 3: set_uart_speed(19200); break; case 4: set_uart_speed(32768); break; case 5: set_uart_speed(38400); break; case 6: set_uart_speed(57600); break; case 7: set_uart_speed(115200); break; } }

ADC 8 bits

Kiểm tra

Dùng ADC chỉnh tốc độ nháy

Các chú ý Output_X(giatri); X là port, giatri trong khoảng 1 byte Vidu: Output_B(127); Input_X() Vidu: a=Input_B(); Port_B_pullups(a); // on/off điện trở nội kéo lên 1-on; 0-off Set_tris_X(giatri); // giatri la so 8 bit bit=0 chân ngõ vào và bit=1 là chân ngọ ra. Vidu: set_tris_B(0); //trisB=00000000 tất cả các chân port B ngõ ra set_tris_B(1); //trisB=00000001 B0 ngõ vào, còn lại ngõ ra set_tris_B(255); //trisB=11111111 tất cả các chân port B ngõ vào

Ví dụ ngắt dùng port B

Sáng tắt led nhiều dạng

Ví dụ ASM Ví dụ 1: org 0x000 start

movlw 0x00 tris

; nap W = 0x00 chọn port B output

myPortB

movlw b'10101010' movwf myPortB circle goto end

circle

; xuat port B ; done

Nút và đèn

SetUp

Main

Main2

ORG 0 BSF 03,5 CLRF 06 MOVLW 01 MOVWF 05 BCF 03,5 CLRF 06

; Bank 1 ; port B output ;Load W with 0000 0001 ; RA0 input ;Go to Bank 0 ;Blank the display

BTFSS 05,0 GOTO Main2 BSF 06,0 GOTO Main BCF 06,0 GOTO Main

;kiem tra ngo vao port A ;Nut khong duoc nhan ;Nut duoc nhan. Turn on LED ;Loop Main ;Nut khong duoc nhan. Turn off LED ;Loop Main

END

Led sáng 0.5 giây sau khi nhấn nút

Chốt LED

LED chay

Đếm nhị phân ngược/ xuôi

ADC

Led chạy 0-255 portB equ 0x06 count equ 0x0c nCountequ 0x0d mCount equ 0x0e ;---------------------------------------------------------------------org start

0x000

movlw 0x00 ; nap W =0x00 cho trisb chon port B output tris portB clrf portB ; xoa clrf count ; khoi tao counter to 0

get_cnt movf count, w movwf portB call pause call pause call pause call pause call pause incf count, f goto get_cnt

; nap count sang W ; move W sang port B ; goi delay

; goi 5 lan ~ 1 giay ; inc counter ; lap vo tan

pause movlw 0xff movwf mCount loadN movlw 0xff movwf nCount decN decfsz nCount, f goto decN decfsz mCount, f goto loadN return end

; set w = 255 ; mCount = w ; set w = 255 ; nCount = w ; nCount-; neu nCount != 0 thi repeat nCount-; khac giam Count ; if mCount != 0 thi ; reload nCount to 255 va tang ; khac exit

Viet theo C #include <16F84.H> #use delay(clock=4000000) main() { int i; for (i=0;i<256;i++) { output_b(i); // xuat I ra port b delay_ms(100); // delay } }

Đọc Dip Switch chuyển ra sáng LED myPortA equ 0x05 myPortB equ 0x06 ;---------------------------------------------------------------------org 0x000 start movlw 0xFF ; nap W =0xFF vao tris a lam port A input tris myPortA movlw 0x00 ; nap W =0x00 vao tris a lam port B output tris myPortB movf myPortA, w ; doc port A DIP va luu vao W movwf myPortB circle goto start ; lap vo han end

Thay đổi tốc độ nháy portB equ 0x06 count equ 0x0c tmr0 equ 0x01 ;---------------------------------------------------------------------start

org 0x000 clrwdt movlw b'11010111'

; xoa watchdog timer ; gan prescaler, clock noi ; chon chia 256

option movlw 0x00 ; set w = 0 tris portB ; port B output clrf portB ; port B muc thap

go

delay again

end

bsf call bcf call goto

portB, 0 delay portB, 0 delay go

; RB0 = 1, LED on ; RB0 = 0, LED off ; lap vo tan

clrf tmr0 ; xoa co TMR0, bat dau dem btfss tmr0, 7 ; neu bit 7 = 1 goto again ; khong =, check lai return ; khac exit delay

Serial port: PC to PIC serial Nhận ký tự từ máy tính xuất mã ascii ra port tmr0 equ 0x01 ; Timer/counter register status equ 0x03 ; Status word register portA equ 0x05 ; Port A register portB equ 0x06 ; Port B register intCon equ 0x0b ; Interrupt control register rcvReg equ 0x0c ; General purpose register count equ 0x0d ; General purpose register temp equ 0x0e ; General purpose register optReg equ 0x81 ; File register in Bank 1 trisA equ 0x85 ; File register in Bank 1 trisB equ 0x86 ; File register in Bank 1. rp0 equ 5 ;-------------------------------------------------------------------------org 0x000

start

doThis

bsf status, rp0 ; chuyen Bank 1 movlw b'00000101' ; A0, A2 input con lai output movwf trisA movlw b'00000000' ; Port B: tat ca output movwf trisB bcf status, rp0 ; tra ve Bank 0 clrf portB clrf rcvReg

call rcv4800 ; goi chuong trinh serial movf rcvReg,w ; nhan byte movwf portB ; xuat byte nhan ra 8 LEDs circle goto doThis ; ket thuc

Rcv4800 bcf intCon, 5 ; Disable ngat do tmr0 bcf intCon,7 ; Disable ngat toan cuc clrf tmr0 ; xoa timer/counter clrwdt ; xoa wdt cho prep prescaler bsf status, rp0 ; movlw b'11011000' ; set up timer/counter movwf optReg bcf status, rp0 movlw 0x08 ; khoi tao counter movwf count

sbit

time1

btfsc portA, 0 ; cho start bit goto sbit ; movlw 0x98 ; movwf tmr0 ; nap va bat dau timer/counter bcf intCon, 2 ; xoa co tran tmr0 btfss intCon, 2 ; tran? neu =1 bo dong tiep theo goto time1 ; No btfsc portA, 0 ; Start bit van muc thap? goto sbit ; False start, go back movlw 0x30 ; vong lap N cho timer movwf tmr0 ; start timer/counter bcf intCon, 2 ; xoa co tran tmr0

time2

btfss intCon, 2 ; Timer tran? goto time2 ; No movlw 0x30 ; gan N cho timer movwf tmr0 ; Start timer/counter bcf intCon, 2 ; xoa co tran tmr0 movf portA, w ; doc port A movwf temp ; luu rrf temp, f ; xoay bit 0 qua co carry rrf rcvReg, f ; xoay co carry qua rcvReg bit 7 decfsz count, f ; Shifted 8? goto time2 ; No time3 btfss intCon, 2 ; timer tran? goto time3 ; No return ; Yes, byte da nhan end

PC to PIC theo CCS #include <16F84.H> #define RS232_XMIT PIN_A1 #define RS232_RCV PIN_A0 #use delay(clock=4000000) // 4 MHz OSC #use rs232(baud=9600, xmit=RS232_XMIT, rcv=RS232_RCV) main() { int i;

while(1) { i = 65; // kiem tra ASCII 'A' ~ 65 do { putc(i); delay_ms(1000); // gui ký tu mot 1s i++; } while (i<=122); // kiem tra ASCII 'z' is 122 } } // ket thuc main

Hiển thị nhiệt độ dùng ADC

#include ;********************************************************************** STARTUP code goto Initialize PORT1

code

;********************************************************************************** ** ; Initialize - Initialize CCP1, comparators, internal oscillator, I/O pins, ; analog pins, motor parameters, variables ; ;********************************************************************************** ** Initialize clrf STATUS ; bank 0 bsf STATUS,RP0 ; we'll set up the bank 1 Special Function Registers first ; Configure I/O pins for project bsf TRISA,0 ; Set internal oscillator frequency movlw b'01110000' movwf OSCCON

; RA0 is an input ; 8Mhz

; Set TMR0 parameters MOVLW b'10000111' MOVWF OPTION_REG ; Turn off comparators movlw 0x07 movwf CMCON0 ; Set up Analog Channel(s) movlw b'00000001' movwf ANSEL movlw b'01010000' movwf ADCON1 bcf

STATUS,RP0

; Finish ADC set up movlw b'10000001' movwf ADCON0

; PORTB PULL-UP DISABLED ; TMR0 RATE 1:256 ; turn off comparators ; select AN0 as an analog channel (RA0) ; select A/D converstion clock Fosc/16 ; go back to bank 0 ; right justified, Vss and Vdd as refs, AN0 is on ; turn ADC module on

;********************************************************************************** ** ; Main - Calls the function to initialized the LCD registers, then reads the output ; from the temperature sensor, converts this value to degrees C, and displays ; this value on the LCD. Main call InitLCD ; Initialize LCD Special Function Registers ; Main program loop Loop btfss INTCON,T0IF goto Loop bcf INTCON,T0IF GetTemperature banksel ADCON0 bsf ADCON0,1 btfsc ADCON0,1 goto $-1 banksel ADRESH movf ADRESH,w banksel TempHigh movwf TempHigh banksel ADRESL movf ADRESL,w banksel TempLow movwf TempLow

; Wait for TMR0 to overflow at 32ms

; Do A-to-C conversion ; Wait for result before proceeding ; store high two bits in TempHigh

; store lower bits in TempLow

CheckForValidity bcf Flag,InvalidTemp ; clear flag that indicates temperature is invalid movf TempHigh,w ; Are bits 9 or 10 set? btfss STATUS,Z goto CheckForOverTemp ; Yes, then check for an over temperature condition CheckForUnderTemp ; No, then check for an under temperature condition movlw .22 If the the low order bits are under 22 then the temperature is under -40C subwf TempLow,w btfss STATUS,C bsf Flag,InvalidTemp goto EndCheck CheckForOverTemp movlw .1 ; make sure high order byte only has a 1 subwf TempHigh,w btfss STATUS,Z goto NotValid movlw .102 ; then check to make sure the low order byte isn't over 102 subwf TempLow,w btfsc STATUS,C

ConvertToTemperature ; Temperature = (AN0/2) - 50 "in Celcius" rrf TempHigh,f ; bit 10 is never set so it is ignored rrf TempLow,f bcf Flag,Negative movlw .50 ; Subtract 50 subwf TempLow,f btfsc STATUS,C ; is value negative? goto CheckAgainstStoredValue comf TempLow,f ; make a negative value unsigned bsf Flag,Negative CheckAgainstStoredValue movf TempLow,w ; check against the stored temperature value xorwf TempSave,w btfsc STATUS,Z ; if the value is the same then check for consistancy goto CheckForConsistancy clrf Counter ; else, save the temperature value movf TempLow,w movwf TempSave goto Loop

DisplayTemperature ; display the temperature call InitLCD ; clear the display first btfsc Flag,InvalidTemp ; If temperature is invalid then indicate that with "---" goto DisplayDashDashDash btfsc Flag,Negative ; If the Negative flag is set then display negative sign call DisplayNeg movf TempLow,w ; first convert the hexidecemal value to binary coded decimal call ConvertToBCD movwf TempBCD ; the ones and tens decimal values are returned in W movf TempBCD,w andlw 0x0F call DisplayDigit2 swapf TempBCD,w andlw 0x0F call DisplayDigit3 movlw 0x00 btfsc Flag,Overflow ; the hundred value is returned in Overflow flag movlw 0x01 call DisplayDigit4 movlw 0x0C ; Display C for Celcius in the first digit call DisplayDigit1 goto Loop

ConvertToBCD movwf Temp incf Temp,f clrf BCDValue bcf Flag,Overflow ConvertLoop decf Temp,f btfsc STATUS,Z goto EndConvertToBCD incf BCDValue,f movf BCDValue,w andlw 0x0F xorlw 0x0A btfss STATUS,Z goto ConvertLoop movlw 0x06

addwf BCDValue,f movf BCDValue,w andlw 0xF0 xorlw 0xA0 btfss STATUS,Z goto ConvertLoop movlw 0x60 addwf BCDValue,f bsf Flag,Overflow goto ConvertLoop EndConvertToBCD movf BCDValue,w return END

Đồng hồ số dùng timer

#include STARTUP code goto Initialize PORT1 code ; Initialize - Initialize CCP1, comparators, internal oscillator, I/O pins, ; analog pins, motor parameters, variables Initialize clrf STATUS ; bank 0 bsf STATUS,RP0 ; we'll set up the bank 1 Special Function Registers fist ; Configure I/O pins for project bsf TRISA,7 ; RA7 is an input bsf TRISA,6 ; RA6 is an input bsf TRISA,5 ; RA5 is an input bsf TRISA,4 ; RA4 is an input bsf TRISA,3 ; RA3 is an input ; Set internal oscillator frequency movlw b'01110000' ; 8Mhz movwf OSCCON

; Set TMR0 parameters movlw B'10000110' movwf OPTION_REG ; Turn off comparators movlw 0x07 movwf CMCON0 ; Turn off Analog clrf ANSEL bcf

STATUS,RP0

; Set up Timer 1 movlw b'00001011' movwf T1CON

;PORTB PULL-UP DISABLED ;TMR0 RATE 1:128 ; turn off comparators

; go back to bank 0 ; Use external oscillator

; Main - The main loop makes the time, displays the time, and responds to button ; presses from the user. ; ;***************************************************************************** ******* Main call InitLCD ; Initialize LCD Special Function Registers clrf Second ; Display 12:00 on startup clrf Minute movlw .12 movwf Hour clrf TimeBaseMultiple ; This variable is keep track of the number of 1/2 second intervals clrf Flag clrf StateSW2 clrf StateSW3 clrf StateSW4 bsf TMR1H,6 ; Make sure the first time around the code displays something

; Main program loop Loop call ServiceSwitches ; Looks for button presses an whether or not a switch debounce routine is currently being executed btfss TMR1H,6 ; 1/2 second will be our timebase (when bit 6 is set 1/2 second has passed goto Loop bcf TMR1H,6 incf TimeBaseMultiple,f ; Keep track of 1/2 second intervals (bit 0 is 1 at 1 second intervals, bit 1 is 1 at 2 second intervals, etc.) ; Every 1/2second do this call BlinkDot call DisplayTime dempending on mode

; toggle blink flag ; Display either seconds or Hour and Minutes

; Every 1 second do this btfsc TimeBaseMultiple,0 goto EndLoop call MakeTime ; Constuct the time (increment seconds, minutes, hours appropiately) EndLoop goto

Loop

DisplayTime call InitLCD ; Clear display momentarily btfsc Flag,Blink ; If the Blink flag is set then display the dot call Display3DP btfsc Flag,DisplayMode ; Display either seconds or Hour and Minutes depending on mode call DisplaySeconds btfss Flag,DisplayMode call DisplayHourAndMinutes return

;********************************************************************** ************** ; DisplaySeconds - Convert Seconds to Binary Coded Decimal (BCD) and then display. ; ;********************************************************************** ************** DisplaySeconds movf Second,w call ConvertToBCD movwf SecondBCD movf andlw call swapf andlw call return

SecondBCD,w 0x0F DisplayDigit1 SecondBCD,w 0x0F DisplayDigit2

; DisplayHourAndMinutes - Convert Hours and Minutes DisplayHourAndMinutes movf Minute,w call ConvertToBCD movwf MinuteBCD movf Hour,w call ConvertToBCD movwf HourBCD movf andlw call swapf andlw call movf andlw call swapf andlw call btfss call return

MinuteBCD,w 0x0F DisplayDigit1 MinuteBCD,w 0x0F DisplayDigit2 HourBCD,w 0x0F DisplayDigit3 HourBCD,w 0x0F DisplayDigit4 Flag,AMorPM DisplayA

to BCD and display.

MakeTime call IncrementSecond btfsc STATUS,Z then the zero flag is set call IncrementMinute btfsc STATUS,Z then the zero flag is set call IncrementHour return

; If seconds overflows (59 to 0) ; If minutes overflows (59 to 0)

IncrementSecond incf Second,f movf Second,w xorlw .60 btfsc STATUS,Z clrf Second return ; IncrementMinute - Increment minutes ; Output - Zero flag set if Minute rolls over from 59 to 0 IncrementMinute incf Minute,f movf Minute,w xorlw .60 btfsc STATUS,Z clrf Minute return

IncrementHour incf movf ToggleAMorPM xorlw btfss goto movlw xorwf Next movf xorlw btfss goto movlw movwf goto EndMakeHour return

Hour,f Hour,w .12 STATUS,Z Next 0x10 Flag,f Hour,w .13 STATUS,Z EndMakeHour 1 Hour EndMakeHour

; Change from AM to PM or vice versa

ConvertToBCD movwf Temp incf Temp,f clrf BCDValue ConvertLoop decf Temp,f btfsc STATUS,Z goto EndConvertToBCD incf BCDValue,f movf BCDValue,w andlw 0x0F xorlw 0x0A btfss STATUS,Z goto ConvertLoop movlw 0x06 addwf BCDValue,f goto ConvertLoop EndConvertToBCD movf BCDValue,w return

; ServiceSwitches - Checks for pressed switches. It a switch is pressed a flag ; is set to indicate the switch has been pressed. This initiates a routine that ; debounces the switch and also determines the functionality of the switch. The ; flag is only cleared when the routine is over ServiceSwitches btfss SW2 ; If SW2 is pressed set a flag to begin debounce routine bsf Flag,ServiceSW2 btfss SW3 ; If SW3 is pressed set a flag to begin debounce routine bsf Flag,ServiceSW3 btfss SW4 ; If SW4 is pressed set a flag to begin debounce routine bsf Flag,ServiceSW4 btfsc Flag,ServiceSW2 call SetHour btfsc Flag,ServiceSW3 call SetMinute btfsc Flag,ServiceSW4 when SW4 is pressed call ChangeDisplay EndServiceSwitches return

; Set the hour if SW2 is pressed ; Set the minute if SW3 is pressed ; Toggle between display modes

Điều khiển động cơ DC hồi tiếp encoder

#include STARTUP goto

code Initialize

PORT1 code Initialize clrf STATUS bsf STATUS,RP0 Function Registers fist ; Configure I/O pins for project bcf TRISD,7 bcf TRISD,2 bsf TRISC,5 bsf TRISA,4 bsf TRISA,0 ; Set internal oscillator frequency movlw b'01110000' movwf OSCCON

; bank 0 ; we'll set up the bank 1 Special

; RD7 is an output ; RD6 is an output ; RC5 is an input ; RA4 is an input ; RA0 is an input ; 8Mhz

; Set up A-to-D Module movlw b'00000001' movwf ANSEL movwf b'01010000' movwf ADCON1 ; Configure PR2 to movlw 0x3F movwf PR2 ; Set TMR0 parameters MOVLW B'10000111' MOVWF OPTION_REG ; Turn off comparators movlw 0x07 movwf CMCON0 bcf STATUS,RP0 ; Finish setting up A-to-D Module movlw b'00000001' movwf ADCON0 ; Turn off all interrupts clrf INTCON

; enable AN0 ; Fosc/16 ; 31.2 kHz PWM ;PORTB PULL-UP DISABLED ;TMR0 RATE 1:256 ; turn off comparators ; go back to bank 0 ; left justified, AN0 selected, module on ; Make sure interrupts are turn off

; Configure Capture Compare PWM Module 2 clrf CCPR2L movlw b'00001100' ; pwm mode movwf CCP2CON ; Turn on Timer 2 bsf T2CON,TMR2ON ; turn on PWM ; Turn on Timer 1 movlw b'00010111' ; set Timer 1 prescaler to 1:2, Select external clock source, Timer 1 on movwf T1CON clrf

PORTD

; Turn off Motor

;********************************************************************** ************** ; Main - Every 23.4ms POT1 is measured and moved into the dutycycle registers for ; CCP2. CCP2 drives the brushed dc motor, thereby controlling the speed. Timer 1 ; is clocked by the Optical Interrupter. Every 3/4 of a second the value in Timer 1 ; is converted to RPM and displayed as: RPM / 10^3. ; ;********************************************************************** ************** Main bsf ADCON0,GO_DONE ; start an A-to-D conversion call InitLCD ; Initialize LCD Special Function Registers clrf Counter clrf TMR1L clrf TMR1H

Loop btfss INTCON,T0IF ; TMR0 is preloaded so than this loop is exited every 23.4ms goto Loop ; RPM/10 = (number of counts every 23.ms) * 256 (this is a nice number to work with) bcf INTCON,T0IF movlw .73 movwf TMR0 call call btfsc call

SetMotorSpeed MeasureSpeed STATUS,C DisplaySpeed

goto

Loop

SetMotorSpeed movf ADRESH,w movwf DutyCycle bsf ADCON0,GO_DONE bsf P1 ; Turn on motor swapf DutyCycle,w ; bits 4 and 5 of CCP2CON andlw 0x30 iorlw 0x8D movwf CCP2CON rrf DutyCycle,f ; move most significant 6 bits of duty cycle into rrf DutyCycle,w ; CCPR2L andlw 0x3F movwf CCPR2L return

MeasureSpeed incf Counter,f 32 = 0.75 second) bcf STATUS,C btfss Counter,5 goto EndMeasureSpeed clrf Counter

; measure over 3^5 or 32 cycles (23.4ms * ; clear carry flag

bcf T1CON, TMR1ON ; turn off Timer 1 movf TMR1L,w ; Store Timer 1 in TimeL and TimeH movwf TimeL movf TMR1H,w movwf TimeH bsf T1CON,TMR1ON ; turn Timer 1 back on clrf TMR1L clrf TMR1H bsf STATUS,C ; Set carry flag to indicate its time to display a value EndMeasureSpeed return

DisplaySpeed bcf STATUS,C (0.75sec * 8 = 6 seconds = 1/10 of a minute) rlf TimeL,f rlf TimeH,f rlf TimeL,f rlf TimeH,f rlf TimeL,f rlf TimeH,f

; first multiply by 8

movf TimeL,w ; Now convert to BCD movwf L_byte movf TimeH,w movwf H_byte call ConvertToBCD ; This function was taken from AN526 (why write a function if you don't have too?!) ; It converts the RPM number to Binary Coded Decimal (BCD)

movf R2,w ; Example RPM = 4320 andlw 0x0F ; R2 contains 0x32 (remember we are displaying RPM/10) call DisplayDigit1 swapf R2,w andlw 0x0F call DisplayDigit2 movf R1,w ; R1 contains 0x04 andlw 0x0F call DisplayDigit3 call Display3DP ; Place a decimal point between the 4 and the 3. The display will read 4.32 return ; Therefor the display shows RPM / 10^3.

Điều khiển stepper motor

#include <stepperinc.inc> Initialize bsf bcf movlw movwf movlw movwf movlw movwf movwf movwf movlw movwf movlw movwf bcf

STATUS,RP0 TRISC,5 b'00001011' TRISD b'01110000' OSCCON b'00000001' ANSEL b'01010000' ADCON1 0x3F PR2 b'00000000' OPTION_REG STATUS,RP0

; bank 1 ; Output: RC5 ; Outputs: RD2,RD4-RD7 ; 8Mhz ; enable AN0 ; Fosc/16 ; 31.2 kHz PWM ; 1:2 prescaler for TMR0 ; bank 0

clrf clrf movlw movwf movlw movwf clrf clrf movlw movwf movwf bsf bsf

PORTD ; turn off windings PORTC b'00000001' ; left justified, AN0 selected, module on ADCON0 0x07 CMCON0 ; turn off comparators CCPR1L CCPR2L b'00001100' ; pwm mode CCP1CON CCP2CON T2CON,TMR2ON ; turn on PWM T1CON,TMR1ON ; turn on Timer 1

clrf clrf clrf clrf movlw movwf movwf clrf clrf

State Index Mode ADRESH 1 StepModeScaler Counter Speed ButtonState

; initialize motor state pointer and duty cycle ; index pointer

; initialize button state

Main btfss goto bcf

INTCON,T0IF Main INTCON,T0IF

; Wait 2.5ms

call btfsc incf

ButtonPress STATUS,C Mode,f

decfsz goto movf movwf decfsz goto

Counter,f ; This is the scaler for different stepping modes Main StepModeScaler,w Counter Speed,f ; Delay counter Main

; Call the button press debounce routine ; The carry flag is set if a button press just occurred ; Change to the next state when a button press

occurs.

comf btfsc sublw movwf bsf

ADRESH,w ; Set speed of motor STATUS,Z ; If zero, then make 255 1 Speed ; Store in speed variable ADCON0,GO_DONE ; start another ADC convertion

goto

ModeStateMachine

ModeStateMachine movlw high ModeTable movwf PCLATH movf Mode,w andlw 0x03 addlw low ModeTable btfsc STATUS,C incf PCLATH,f movwf PCL

; Select stepping mode

ModeTable goto goto goto clrf goto

SingleStep HalfStep MicroStep Mode ModeTable

SingleStep movlw 8 movwf StepModeScaler incf State,f movlw 0xFF movwf CCPR1L movwf CCPR2L movlw 0x30 iorwf CCP1CON,f iorwf CCP1CON,f SingleStateMachine pointer movlw high SingleJumpTable movwf PCLATH movf State,w andlw 0x03 addlw low SingleJumpTable btfsc STATUS,C incf PCLATH,f movwf PCL

; Increment motor state ; Turn off PWMs

; jump to motor state based on State

SingleJumpTable goto goto goto goto SingleState0 movlw movwf goto SingleState1 movlw movwf goto SingleState2 movlw movwf goto SingleState3 movlw movwf goto

SingleState0 SingleState1 SingleState2 SingleState3 CTRL1FWD PORTD Main CTRL2REV PORTD Main CTRL1REV PORTD Main CTRL2FWD PORTD Main

PWM demo C #include <16f877.h> #ORG 0x1F00,0x1FFF {} /* Reserve memory for bootloader for the 8k 16F876/7 */ #device PIC16F877 *=16 /* Allow RAM to expand beyond 256 bytes */ #device adc=10 /* Make sure that we are sampling on 10 bits. This directive is required for compiler version 2.7. */ /* Set the clock speed */ #use delay(clock=20000000) #fuses HS,NOPROTECT,NOWDT,BROWNOUT,PUT,NOLVP /* Directive for RS-232 interface */ #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) #include "input.c" #define VARIABLE_PERIOD 1 // If this symbol is defined, let the user select the // period and prescaler, otherwise, // if VARIABLE_PERIOD = 0, use fixed values.

main() { char selection; byte duty, period; byte prescale; // We use serial input to capture PWM parameters to make // an easy demo. setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM setup_ccp2(CCP_PWM); // Configure CCP1 as a PWM #if VARIABLE_PERIOD // This is default for ( ; ; ) { // Select value for the period (100% duty cycle) printf("Period (100%% duty cycle): "); period = gethex(); printf("\r\n");

// Set the prescaler do { // Select prescaler (t2div) printf("\r\nSelect prescaler:\r\n"); printf(" 1: Prescaler = 1\r\n"); printf(" 2: Prescaler = 4\r\n"); printf(" 3: Prescaler = 16\r\n"); printf("Selection: "); selection = getc(); putc(selection); printf("\r\n"); } while((selection < '1') || (selection > '3'));

// The cycle time will be (1 / clock) * 4 * t2div * (period + 1) // In this program, if period is 0x80 (or 128 decimal), with // a clock of 20000000: // For the three possible prescaler selections the cycle time is: // (1/20000000) * 4 * 1 * 128 = 25.6 us or 39 khz // (1/20000000) * 4 * 4 * 128 = 102.4 us or 9.8 khz // (1/20000000) * 4 * 16 * 128 = 409.6 us or 2.4 khz switch(selection) { case '1': prescale = 1; setup_timer_2(T2_DIV_BY_1, period, 1); break; case '2': prescale = 4; setup_timer_2(T2_DIV_BY_4, period, 1); break; case '3': prescale = 16; setup_timer_2(T2_DIV_BY_16, period, 1); break; }

#else period = 0x80; prescale = 4; setup_timer_2(T2_DIV_BY_4, period, 1); #endif printf("Frequency = %ld kHz\r\n", 5000 / period / prescale); while(TRUE) { printf("Enter duty cycle: "); duty = gethex(); printf("\r\n"); // Set the duty cycle set_pwm1_duty(duty); set_pwm2_duty(duty); if (duty == 0x10) { // If '10' is entered for duty, exit loop to be able to // select other values for period and prescaler break; }}}}

Tổng quan FPGA I) QUAÙ TRÌNH PHAÙT TRIEÅN Theo truyeàn thoáng , thieát keá soá (digital design) laø quaù trình thieát keá vaø ñaït ñöôïc caùc maïch ñieän theo phöông phaùp thuû coâng baèng caùch söû duïng caùc coâng cuï nhaäp sô ñoà maïch (schematic entry tool) . Quaù trình naøy coù nhieàu baát lôïi , ñaõ vaø ñang ñöôïc nhanh choùng thay theá baèng caùc phöông phaùp môùi . ¾ HDL

( hardware description language ) - ASIC ( application-specific intergrated circuit ) ¾FPGA (field-programmable gate-array).

Moät soá ưu điểm :

- Khaû naêng saûn xuaát taêng daãn ñeán caùc chu kyø phaùt trieån vôùi nhieàu ñaëc tröng hôn cuûa saûn phaåm seõ ngaén hôn vaø laøm giaûm thôøi gian ñöa ra thò tröôøng . - Giaûm caùc chi phí kyõ thuaät khoâng laëp laïi NRE(non-recurring engineering cost) - Cho pheùp taùi söû duïng thieát keá - Taêng tính linh ñoäng ñoái vôùi nhöõng thay ñoåi thieát keá - Thaêm doø nhanh hôn caùc kieán truùc thay theá . - Thaêm doø nhanh hôn caùc thö vieän coâng ngheä thay theá . - Cho pheùp söû duïng phaàn meàm toång hôïp ñeå raø soaùt moät caùch nhanh choùng khoaûng dieän tích thieát keá vaø ñònh thôøi , töï ñoäng taïo ra caùc maïch ñieän khaû kieåm tra (Testable circuit) . - Kieåm tra thieát keá toát hôn vaø deã daøng hôn .

Caùc vi maïch chuaån baùn saün treân thò tröôøng thöôøng coù chöùc naêng coá ñònh do nhöõng nhaø saûn xuaát ñònh nghóa . Traùi ngöôïc vôùi caùc linh kieän treân , ASIC vaø FPGA ñeàu laø nhöõng loaïi vi maïch maø chöùc naêng cuûa chuùng khoâng ñöôïc aán ñònh bôûi nhaø saûn xuaát . Chöùc naêng cuûa ASIC vaø FPGA seõ ñöôïc ñònh nghóa bôûi ngöôøi thieát keá cho töøng öùng duïng cuï theå . Trong tröôøng hôïp toång quaùt , ASIC seõ yeâu caàu quaù trình cheá taïo sau cuøng (final manufacturing process) ñeå taïo ra chöùc naêng theo yeâu caàu cuûa khaùch haøng, coøn FPGA thì khoâng .

FPGA (Field-programmable Gate Array – daûi coång laäp trình daïng tröôøng) laø coâng ngheä tích hôïp logic cho pheùp ngöôøi duøng thieát keá maïch ôû möùc coång logic hoaëc möùc thanh ghi (register). FPGA coøn ñöôïc goïi laø thieát bò coù khaû naêng taùi caáu hình (reconfigurable device), ñöôïc öùng duïng roäng raõi cho vieäc thieát keá caùc IC chuyeân duïng . Coâng ngheä FPGA cho pheùp thieát keá IC maø khoâng caàn daây chuyeàn coâng ngheä cheá taïo IC töø nhöõng taám baùn daãn .

FPGA laø 1 chip silicon chöùa trong noù raát nhieàu “khoái logic” coù theå caáu hình CLB(Configurable Logic Blocks) ñöôïc lieân keát vôùi nhau baèng caùc lieân keát khaû trình (Programmable Interconnect). Caùc khoái vaøo ra ñöôïc phaân boá xung quanh chip taïo thaønh caùc lieân keát vôùi beân ngoaøi . Beân trong khoái logic CLB coù baûng LUT (Look-Up Table) vaø caùc phaàn töû nhôù ( FlipFlop hoaëc boä choát) . Baûng LUT vôùi nhieàu ñaàu vaøo vaø 1 ñaàu ra taïo thaønh 1 maïch logic toå hôïp nhoû , coøn caùc phaàn töû nhôù daønh cho logic đồng bộ vaø tuần tự. 1 chip FPGA coù chöùa côõ haøng nghìn , chuïc nghìn thaäm chí leân ñeán haøng traêm nghìn CLB(Configurable Logic Blocks) , neân noù coù theå laøm ñöôïc raát nhieàu chöùc naêng phöùc taïp

Phaàn lôùn caùc saûn phaåm FPGA treân thò tröôøng hieän nay ñeàu döïa treân coâng ngheä SRAM vôùi 2 haõng saûn xuaát lôùn nhaát laø Xilinx vaø Altera . Doøng FPGA cao caáp cuûa Xilinx laø Virtex vôùi saûn phaåm môùi nhaát laø Virtex 5 (ra maét trung tuaàn thaùng 5/2006) coøn vôùi Altera aø Stratix 3 (thaùng 11/2006) . Ngoaøi ra coøn coù caùc haõng khaùc saûn xuaát FPGA nhöng vôùi muïc ñích chuyeân duïng (Atmel , Actel , Lattice…) Vieäc thieát keá FPGA döïa treân ngoân ngöõ laäp trình moâ taû phaàn cöùng HDL . Coù hai loaïi ngoân ngöõ raát ñöôïc öa chuoäng hieän nay laø VHDL vaø Verilog . Ngoaøi ra coøn coù ABEL(ñöôïc duøng töø laâu nhöng khoâng phoå bieán ) vaø SystemC . Vì vaäy haàu nhö caùc phaàn meàm thieát keá cuûa caùc haõng ñeàu hoã trôï caû hai ngoân ngöõ VHDL vaø Verilog .

Virtex-II Pro FPGAs Kieán truùc khaû trình cao caáp : + Xaây döïng treân coâng ngheä 130nm , 9 lôùp + Töø 3000 ñeán 99000 caùc phaàn töû logic + Clock coù toác ñoä treân döôùi 400MHz + Hieäu suaát cao tieâu thuï coâng suaát thaáp Söï löïa choïn : + 11 thieát bò , raát nhieàu goùi saûn xuaát + Theâm bôùt caùc ñaëc tính, maät ño , I/O

Caùc ñaëc tính môû roäng cuûa heä thoáng : + Nhuùng vaø boä nhôù phaân taùn . + Quaûn lyù clock nhaèm toång hôïp vaø ñoàng boä clock ñeå ñoùng môû chip .

+ Ñieàu khieån vaøo/ra soá vôùi XCITE vaø giaûm kích thöôùc bo maïch . + Toaøn boä hoaëc moät phaàn FPGA coù khaû naêng caáu hình laïi ñem laïi

cho baïn khaû naêng naâng caáp saûn phaåm .

Gheùp noái : + Coù theå coù tôùi 20 boä thu phaùt 2 chieàu - Caùc boä thu phaùt noái tieáp 2 chieàu RocketIO töø 622Mbps tôùi 3125Gbps cho thieát bò Virtex-II Pro + Cho pheùp gheùp noái song song vôùi caùc tín hieäu “Singleended” vaø “differential electrical I/O” + Caàu noái chuyeån ñoåi caùc chuaån khaùc nhau TeraMAC/s DPS + Coù theå nhuùng tôùi 444 boä nhaân 18x18 + Thö vieän thuaät toaùn DSP môû roäng + Caùc coâng cuï nhö MathWorks MATLAB™/Simulink™, Xilinx® System Generator for DSP, va Cadence SPW

Khaû naêng xöû lyù cao caáp : + Coù theå coù 2 vi xöû lyù loõi cöùng 400MHz , 600+ DMIPS IBM PowerPC 405 + Giaûi phaùp xöû lyù meàm vôùi loõi MicroBlaze™ Coâng cuï phaùt trieån thieát keá nhanh nhaát : + Caùc coâng cuï deã daøng cho vieäc laäp trình logic vaø nhuùng caùc phaàn meàm + Hôn 200 loõi IP saün coù cung caáp bôûi Xilinx vaø caùc ñoái taùc + Coâng cuï debug – Thôøi gian thöïc – Söû duïng ChipScope™ Pro Chi phí cho heä thoáng : + Coù theå giaûm tôùi 80% chi phí cho saûn xuaát soá löôïng lôùn vôùi giaûi phaùp Virtex-II Pro EasyPath ™ + Caét giaûm ñaùng keå chi phí heä thoáng khi söû duïng caùc ñaëc tính vaø caùc coâng cuï cuûa Virtex-II Pro , caùc thieát keá ñôn giaûn treân cuøng 1 bo maïch

ML300 Kit goàm coù hai board :ML300 CPU board vaø ML300 POWER I/O board – taäp hôïp nhöõng thieát bò ngoaïi vi ñöôïc söû duïng ñeå xaây döïng neân moät heä thoáng quanh Virtex-II Pro FPGA PowerPC 2VP7 Virtex-II Pro vaø nhöõng thaønh phaàn cô baûn thì naèm treân CPU board , trong khi phaàn lôùn phaàn nguoàn vaø nhöõng thieát bò I/O thì naèm treân I/O board. CPU BOARD POWER I/O - 2VP7 - DDR SDRAM - PCI/PMC - System ACE with CompactFlash - MGTs(multi-gigabit transceiver) - Serial/Parallel Ports - Card Bus

Power Connectors

Digital Connectors

- Switching Regulators - Linear Regulators - General Purpose I/O - Buttons - Switches - Prototyping Area - TFT Dispay - Touch Screen

ML300 CPU BOARD ML300 CPU Board ñaïi dieän cho boä naõo cuûa ML300 Hardware Platform . Noù bao goàm 2VP7 Virtex-II Pro vaø nhöõng boä phaän nhö : boä nhôù chính DDR SDRAM , nhöõng giao dieän truyeàn thoâng ña bit (MGT) , PCI/PMC , System ACE , nhöõng ngoõ keát noái nhö coång noái tieáp (serial) , coång song song (parallel) ,vaø nhieàu ngoaïi vi khaùc nöõa . Chuùng hoã trôï moät dieän roäng giuùp ngöôøi thieát keá coù theå tìm hieåu vaø phaùt trieån khaû naêng cuûa hoï Virtex – II Pro . Nhöõng thaønh phaàn vaø giao dieän treân ML300 CPU board : ƒ2VP7 Virtex-II Pro vôùi PowerPC 405 vaø 8 MGTs ƒHai ngoõ keát noái serial ATA (SATA) , moät cho host vaø moät cho thieát bò ƒInfiniBand / HSSDC2 ƒGigabit Ethernet Fiber (Caùp quang) ƒHeä thoáng ACE vaø kho löu tröõ baát bieán vôùi keát noái CompactFlash ƒ128M DDR SDRAM ƒHai coång noái tieáp ƒHai coång PS/2 söû duïng loaïi nhoû 6 pins

ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ ƒ

Coång song song IIC vaø SPI phuïc vuï cho vieäc söû duïng EEPROM,caûm bieán nhieät ñoä 10/100 Ethernet PHY Maøn hình hieån thò (TFT) 18 bits maøu ,ñoä phaân giaûi VGA (640x480) Caûm öùng (touchscreen) AÂm thanh (audio codec) vôùi line-in,line-out vaø headphone out Bus PCI 32bit,33-MHZ (3,3V vaø 5V) PCI mezzanine connectors (PMCs) PCI bridge ñeå keát noái 2 PC cards vaø FireWire

VIRTEX-II PRO PLATFORM FPGA Loaïi Virtex-II Pro Platform FPGA söû duïng treân board cuûa ML300 laø 2VP7, FF672 . Goàm: ¾Boä xöû lyù PowerPC 405 ¾8 boä truyeàn thoâng ña bit (MGTs) ¾396 ngoõ I/O ¾4 boä quaûn lyù xung soá (DCMs) ¾Khoaûng 5000 phaàn töû logic ¾Khoaûng 800Kb cho khoái SelectRAM (BRAM) ¾44 boä nhaân (multipliers) 18x18 ¾PowerPC 405 coù theå laøm vieäc ñöôïc ôû taàn soá 300MHz. Boä truyeàn thoâng ña bit (MGT) coù theå truyeàn taûi 3125Gigabits moãi giaây trong caû hai höôùng . 396 ngoõ I/O ñöôïc hoã trôï vôùi nhöõng I/O tieâu chuaån toác ñoä cao nhö LVDS, SSTL2, PCI. 8 boä quaûn lyù xung hoaït ñoäng trong khoaûng töø 24MHz tôùi 420MHz .

BANK

Available I/O

Interfaces

0( 2,5V )

40

PS/2 , Ethernet

1( 3,3V )

40

PCI

2( 3,3V )

59

PCI , PMC GIOP

3( 3,3V )

59

Audio , IIC , Touchscreen

4( 2,5V )

40

TFT , SPI , RS232

5( 2,5V )

40

System ACE , CPU Trace

6( 2,5V )

59

CPU debug , GIOP Buttons , DDR SDRAM

7( 2,5V )

59

DDR SDRAM , Parallel Port

Clocking Outputs to 2VP7 Signal Name

2VP7 Pin

PS2_1_CLK_IN

E16

PS2_1_CLK_OUT

D16

PS2_2_CLK_IN

D15

PS2_2_CLK_OUT

C15

PCI_PORT_CLK_PMC

G13

PCI_PORT_CLK_CB(CardBus Clock)

F13

FPGA_PMC_CONN4_IO61(PMC CONN 4 clock)

E13

AUDIO_BIT_CLK

N6

TOUCH_CLK

W5

TFT_FPGA_CLK

AC6

SPI_CLK

W12

CPO_TCK

AC20

TRC_CLK

AD23

Pinout of R14K-ST11 Gigabit Fiber Transceiver Pin Number

Symbol

Description

Logic family

GP

GP

Grounding Posts Connect to signal ground

N/A

1,11,21,31

TD+

Transmitter DATA In

LVPECL

2,12,22,32

VEETX

Transmitter Signal ground

N/A

3,13,23,33

TD-

Transmitter DATA In

LVPECL

4,14,24,34

VCCTX

Transmitter Power supply

N/A

5,15,25,35

SD

Signal Detect Satafactory Optical Input : Logic “1” Output Fault Condition : Logic “0” Output

LVTTL

6,16,26,36

TDIS

Transmit Disable

LVTTL

7,17,27,37

RD+

Receiver DATA Out

LVPECL

8,18,28,38

VCCRX

Receiver Power supply

N/A

9,19,29,39

RD-

Receiver DATA Out

LVPECL

10,20,20,40

VEERX

Receiver Signal ground

N/A

Keát noái giöõa 2VP7 vaø Serial ATA Connector 2VP7 Pin

Serial ATA Pin

SA1_TX_P

AF11

P120.6

SA1_TX_N

AF12

P120.5

SA1_TX_P

AF10

P120.2

SA1_TX_N

AF9

P120.3

SA2_TX_P

AF6

P119.2

SA2_TX_N

AF7

P119.3

SA2_TX_P

AF5

P119.6

SA2_TX_N

AF4

P119.5

Signal Name

PHAÀN MEÀM THIEÁT KEÁ GIÔÙI THIEÄU Chöông trình EDK 7.1i (Xilinx® Embedded Development Kit) laø version 2005 cuûa haõng Xilinx. EDK 7.1i laø moät chöông trình thaân thieän vôùi ngöoøi söû duïng, giuùp chuùng ta coù theå thieát laäp moät heä thoáng baèng nhöõng coâng cuï hoã trôï saün . Chöông trình ñieàu khieån ñöôïc hoã trôï ñeå ta coù theå vieát baèng C hoaëc C++. EDK 7.1i hoã trôï raát nhieàu chöùc naêng: Taïo heä thoáng phaàn cöùng cô baûn trong XPS (Xilinx Platform Studio); Taïo vaø ñöa vaøo söû duïng moät thieát bò ngoaïi vi ….EDK 7.1i phaûi chaïy treân neàn cuûa ISE 7.1i (nghóa laø muoán söû duïng EDK phaûi caøi ISE vôùi phieân baûn töông thích )

Taïo heä thoáng phaàn cöùng trong XPS(Xlinx Platform Studio) Khi chaïy chöông trình XPS, thì maøn hình seõ hieän thò ra nhö sau :

- Base System Builder Wizard : Cho pheùp ta khôûi taïo moät project môùi - Open A Recent Project : Môû moät project coù saün Ta choïn Base System Builder Wizard , sau ñoù OK :

Choïn BrowseÆ daãn ñeán thö muïc muoán ñaët project , sau ñoù chöông trình seõ töï taïo ra moät file system.xmp trong thö muïc ñoù ÆOK

ÔÛ böôùc tieáp theo naøy , ta seõ thaáy chöông trình cho 2 löïa choïn : -I would like to creat a new design : Cho pheùp ta taïo moät heä thoáng döïa treân nhöõng kit hoã trôï saün cuûa Xilinx nhö ML300 , ML310 , Spartan 3….. -I would like to load an existing .bsb setting file : Cho pheùp ta taïo moät board rieâng vôùi nhöõng phaàn cöùng vaø thieát bò ngoaïi vi hoã trôï saün cuûa phaàn meàm . Choïn “I would like to creat a new design” Æ OK

Tieáp theo laø moät loaït nhöõng löïa choïn veà I/O vaø thieát bò ngoaïi vi söû duïng trong project , neáu ta söû duïng caùi naøo thì löïa choïn caùi ñoù , coøn laïi coù theå boû qua . Ñaàu tieân choïn RS232_Uart1 vaø boû RS232_Uart2 Æ Next

Nhöng böôc tiep theo cung la nhöng löïa choïn ve cac giao dieän IO va thiet bò ngoaïi vi nhöng do ta khoâng söû duïng chuùng vì project naøy ta chæ söû duïng nuùt nhaán vaø ñeøn led neâ coù theå boû heát Æ Next cho ñeán khi thaáy maøn hình hieän ra

Boä nhôù cuûa chöông trình töø 16KB tôùi 128KB , thoâng thöôøng chæ coù theå chöùa ñöôïc nhöõng öùng duïng ñôn giaûn ,vôùi nhöõng öùng duïng ñoøi hoûi boä nhôù cao hôn thì ta phaûi söû duïng theâm boä nhôù ngoaøi tuyø töøng loaïi kit söû duïng maø coù caùc loaïi boä nhôù ngoaøi khaùc nhau . Trong ML300 kit thì hoã trôï DDR SDRAM vôùi 128MB töông öùng vôùi 1Gbits. Ta choïn 16KB vì ñaây laø project ñôn giaûn neân khoâng toán nhieàu boä nhôù Æ Next

Chöông trình seõ hieån thò ra hoäp thoaïi hoaøn taát thieát keá , noù coù nhöõng thoâng soá veà I/O vaø thieát bò ngoaïi vi maø ta vöøa choïn löïaÆGenerate

Choïn OK ñeå baét ñaàu vieäc thieát keá Project Giao dieän thieát keá cuûa XPS

VD; ñoaïn code ñôn giaûn veà vieäc duøng nuùt nhaán ñeå ñieàu khieån saùng taét cuûa ñeøn . int main (void) { XGpio_mSetDataDirection(XPAR_PUSH_BUTTONS_16BIT_BASEADDR, 1, 0x00000001); XGpio_mSetDataDirection(XPAR_LEDS_16BIT_BASEADDR, 1, 0x00000000); while (1) { Xuint32 data = ReadFromGPInput(XPAR_PUSH_BUTTONS_16BIT_BASEADDR); switch (data) { case 0 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 0);break; case 1 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 1);break; case 2 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 2);break; case 4 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 4);break; case 8 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 8);break; case 16 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 16);break; case 32 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 32);break; case 64 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 64);break; case 128 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 128);break; case 256 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 256);break; case 512 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 512);break; case 1024 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 1024);break; case 2048 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 2048);break; case 4096 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 4096);break; case 8192 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 8192);break; case 16384 : XGpio_mSetDataReg(XPAR_LEDS_16BIT_BASEADDR, 1, 16384);break; } } return 0; }

Sau khi khôûi taïo xong file Linker ScriptÆGenerateÆ Build Project ñeå bieân dòch file.c.

Xaây döïng ngoaïi vi theo ngöôøi duøng

Ñeå thöïc hieän vieäc naøy ta tieán haønh qua 7 böôùc : ¾ Söû duïng chöông trình XPS vôùi BSB(Base System Builder) taïo ra moät heä thoáng xöû lyù ban ñaàu ñeå sau naøy söû duïng vôùi ngoaïi vi ta taïo ra ¾ Söû duïng coâng cuï Creat and Import Peripheral Wizard (creat mode) trong EDK ñeå xaây döïng khuoân maãu HDL ban ñaàu , moâ phoûng BFM döïa treân nhöõng hoã trôï cuûa ISE veà file vaø driver ¾ Söû duïng coâng cuï Project Navigator cuûa ISE môû file.npl vöøa taïo ra ôû böôùc 2 ñeå xaây döïng caáu truùc haøm cuûa ngoaïi vi trong user_logic.vhd file vaø coù theå theâm vaøo nhöõng ñònh nghóa I/O vaøo phaàn treân cuûa file ¾ Söû duïng coâng cuï Creat and Import Peripheral Wizard (import mode) trong EDK ñeå taïo laïi giao dieän cho ngoaïi vi neáu caàn thieát ¾ Môû XPS duøng coâng cuï Add/Edit Core Dialog ñeå theâm vaøo thieát bò ngoaïi vi ta vöøa taïo xong vaøo heä thoáng ñaõ xaây döïng ôû böôùc 1 ¾ Duøng XPS hoaëc baát kyø coâng cuï höõu ích naøo ñeå xaây döïng software driver , neáu caàn thieát cho caû thieát bò ngoaïi vi ta vöøa taïo ¾ Söû duïng nhöõng coâng cuï khaùc trong EDK ñeå bieân dòch , download , chænh söûa heä thoáng xöû lyù vaø thieát bò ngoaïi vi vöøa taïo ñöôïc treân maïch phaùt trieån .

BÖÔÙC 1 : Ta thöïc hieän gioáng nhö phaàn II laø taïo heä thoáng xöû lyù söû duïng EDK BÖÔÙC 2 :

ÔÛ ñaây cho ta thaáy caáu truùc cuûa quaù trình taïo vaø ñöa vaøo söû duïng ngoaïi vi cuûa ngöôøi duøngÆNext

Choïn nhöõng yeáu toá caàn thieát cho giao dieän OPB IPIF ,vôùi nhöõng thieát bò thoâng thöôøng ta chæ caàn choïn S/W reset and Module Information Register , Uses Logic Interrupt Support(neáu muoán söû duïng ngaét) vaø Uses Logic S/W Register Support ÆNext

Löïa choïn nhöõng coång ñaïi dieän cho nhöõng tín hieäu caàn thieát cuûa ngoaïi vi nhö xung timer, chaân reset, chaân döõ lieäu, chaân ñòa chæ, interrupt….. ÆNext

BÖÔÙC 3 : Duøng phaàn meàm ISE 7.1i ñeå thöïc hieän -Sau khi thöïc hieän xong böôùc 2 thì trong thö muïc pcores (naèm beân trong thö muïc chöùa project ñaõ taïo ôû böôùc 1 ) seõ coù moät core cuûa ngoaïi vi maø ta vöøa taïo , sôû dó noù ñöôïc ñaët vaøo trong ñoù ñeå EDK coù theå deã daøng nhaän ra . Töông töï trong thö muïc drivers cuõng coù moät driver töông öùng cho ngoaïi vi -Söû duïng chöông trình Project Navigator ñeå môû file.npl trong thö muïc chöùa project theo ñöôøng daãn töông töï C:\thanh\pcores\opb_test_v1_00_a\devl\projnal\opb_test.npl Æ Yes -Double-click vaøo file opb_*.imp cuûa ngoaïi vi (Ví duï trong hình laø opb_test.imp)

Theâm vaøo nhöõng chaân maø ta muoán söû duïng vaøo phaàn port vôùi caáu truùc : < Teân port > : < in/out > < kieåu > ; VD : OPB_Clk : in std_logic; Led7doan : out std_logic_vector(0 to 7); ---port laø output vaø coù 8 bit töø 0 tôùi 7

Tuøy theo thieát bò ngoaïi vi maø ta söû duïng maø ra löïa choïn thích hôïp laø master hay slave ÆNext cho ñeán khi xuaát hieän giao dieän nhö hình

NGOÂN NGÖÕ VHDL GIÔÙI THIEÄU VHDL laø chöõ ñaàu cuûa ngoân ngöõ moâ taû phaàn cöùng VHSIC (VHSIC laø Very High Speed Integrated Circuits). Ñoù laø ngoân ngöõ moâ taû phaàn cöùng coù theå söû duïng maãu heä thoáng digital ôû nhieàu möùc yù töôûng töø thuaät toaùn ñeán coång logic. Söï phöùc taïp cuûa heä thoáng digital laø kieåu coù theå bieán ñoåi töø coång ñôn giaûn ñeán heä thoáng ñieän töû phöùc taïp. Heä thoáng digital coù theå moâ taû 1 caùch thöù tự, caàn phaûi coù kieåu roõ raøng trong caùcï moâ taû gioáng nhau .

CAÙC CHÖÙC NAÊNG : Sau ñaây laø caùc chöùc naêng chuû yeáu maø ngoân ngöõ cung caáp ñi ñoâi vôùi nhöõng ñieåm ñaëc tröng töø caùc ngoân ngöõ moâ taû phaàn cöùng khaùc nhau . + Ngoân ngöõ coù theå xem nhö laø nôi trao ñoåi trung gian giöõa caùc Vendor chip vaø ngöôøi söû duïng coâng cuï CAD . Caùc Vendor chip khaùc nhau coù theå moâ taû VHDL vôùi caùc thaønh phaàn thieát keá heä thoáng . Ngöôøi söû duïng cung caáp CAD coù theå söû duïng noù ñeå naém baét caùc haønh vi cuûa thieát keá taïi möùc cao cuûa söï tröøu töôïng quaù trình moâ phoûng . + Ngoân ngöõ coù theå söû duïng truyeàn tin trung gian giöõa caùc coâng cuï CAD vaø caùc CAE khaùc nhau . Ví duï , löôïc ñoà cuûa chöông trình coù theå söû duïng boä moâ taû thieát keá VHDL , coù theå söû duïng chuùng nhö laø input cho quaù trình moâ phoûng . + Ngoân ngöõ hoå trôï cho Hierarchy , 1 heä thoáng digital coù theå hieåu nhö laø taäp hôïp caùc thaønh phaàn keát noái chung quanh , moãi 1 thaønh phaàn vaøo coù theå hieåu nhö taäp hôïp cuûa caùc thaønh phaàn con keát noái chung quanh . + Ngoân ngöõ hoå trôï phöông phaùp thieát keá linh ñoäng töø treân xuoáng , töø döôùi leân hoaëc hoãn hôïp .

+ Ngoân ngöõ hoå trôï cho 3 loaïi moâ taû cô baûn khaùc nhau : caáu truùc , doøng döõ lieäu vaø haønh vi . Moät thieát keá coù theå ñöôïc bieåu dieãn trong moãi söï keát hôïp cuûa caùc loaïi moâ taû treân. + Noù hoå trôï caùc möùc yù töôûng roäng , töø yù töôûng moâ taû haønh vi tôùi moâ taû chính xaùc caùc möùc coång . + Tuøy caùc thieát keá coù theå coù kieåu söû duïng ngoân ngöõ vaø chuùng khoâng bò haïn cheá bôûi kích thöôùc cuûa thieát keá . + Ngoân ngöõ coù nhieàu phaàn töû taïo thaønh kieåu thieát keá theo phaïm vi , ví duï caùc component , caùc function , caùc procedure vaø caùc package . + Kieåm tra caùc caùch vieát söû duïng ngoân ngöõ gioáng nhau tôùi vieäc kieåm tra caùc kieåu VHDL khaùc . + Generic vaø attribute ñöôïc duøng trong moâ taû caùc thieát keá theo tham soá . + Moät kieåu khoâng caàn moâ taû haøm thieát keá nhöng coù theå chöùa caùc thoâng tin xung quanh baûn thieát keá trong phaïm vi söû duïng ñònh nghóa attribute , cuõng nhö toång hôïp dieän tích vaø vaän toác . + Moät ngoân ngöõ coù theå söû duïng moâ taû thö vieän caùc thaønh phaàn töø caùc vendor khaùc nhau . Töø caùc coâng cuï ñoù seõ khoâng khoù khaên trong vieäc hieåu caùc kieåu VHDL trong vieäc ñoïc caùc kieåu töø nhöõng traïng thaùi khaùc nhau cuûa vendor töø ngoân ngöõ chuaån . + Caùc kieåu vieát trong ngoân ngöõ naøy coù theå kieåm tra baèng vieäc moâ phoûng töø caùc ngöõ nghóa moâ phoûng ñaõ ñònh nghóa chính xaùc cho moãi caáu truùc cuûa ngoân ngöõ . + Caùc kieåu haønh vi thích öùng vôùi loaïi moâ taû toång hôïp , laø khaû naêng toång hôïp caùc moâ taû coång logic .

Ñoái vôùi moâ taû moät baøi toùan, VHDL cung caáp 5 kieåu khaùc nhau cuûa thieát keá goác, goïi laø design units .Bao goàm: 1. Entity declaration. 2. Architecture body. 3. Configuration declaration. 4. Package declaration. 5. Package body.

Related Documents

Bai Giang
June 2020 6
Bai Giang
November 2019 19
Bai Giang
November 2019 25
Bai-giang
November 2019 30
Bai 5 Bai Giang Thanh
April 2020 16
Pic_ Bai Giang
June 2020 0