343
PIC microcontroller PIC microcontroller Microchip GVGD: NTAT

PIC_ BAI GIANG

Embed Size (px)

Citation preview

Page 1: PIC_ BAI GIANG

PIC microcontrollerPIC microcontrollerMicrochip

GVGD: NTAT

Page 2: PIC_ BAI GIANG

GIÔÙI THIEÄU VEÀ PIC16F84Caáu truùcPIC16F84 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ãndöôùi daïng caùc khoái sau :

Page 3: PIC_ BAI GIANG

CCấấuu trtrúúcc RISCRISC

Chính ñieàu naøy ñaõ taêng toác ñoä xöû lyù cuûa vi ñieàu khieån leân moätcaù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”.

Page 4: PIC_ BAI GIANG

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ùcleä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ösauChaân1: RA2, chaân thöù hai cuûa port AChaân 2: RA3, chaân thöù ba cuûa port AChaân 3: RA4, chaân thöù tö cuûa port A. Ngoaøi ra, chaânnaø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.

Page 5: PIC_ BAI GIANG

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.

Page 6: PIC_ BAI GIANG

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ínhlaø Reset khi vöøa caáp nguoàn ( Power On Reset _ POR ), vaø Reset bôûichaân MCLR.

Page 7: PIC_ BAI GIANG

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ømnhieäm vuï ñònh ñòa chæ giaùn tieáp cho RAM noäi.

IRP = 1: bank 2 vaø 3IRP = 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 100 = Bank 0

Page 8: PIC_ BAI GIANG

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øn0 = Bò traøn

Bit 3_ PD ( Power – down bit ) bit naøy ñöôïc set moãi khi vi ñieàu khieån ñöôïc caápnguoà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 khikeát quaû traû veà cuûa moät pheùp toaùn soá hoïc hay luaän lyù coù giaù tròlaø 0.

Page 9: PIC_ BAI GIANG

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öø. Đöôïcset khi tröø moät soá cho moät soá lôùn hôn, vaø ñöôïc reset trong tröôøng hôïp ngöôïclaïi.Bit 0_ C (Carry ) aûnh höôûng bôûi caùc leänh ADDWF, ADDLW, SUBLW, SUBWF.

Page 10: PIC_ BAI GIANG

Ví dụBcf STATUS, RP0

;Clear bit PR0 để chọn bank 0.

Bsf STATUS, RP0

;set bit PR0 để chọn bank1.

BANK0 macroBcf STATUS, RP0 ;Chọn bank 0endm

BANK1 macroBsf STATUS, RP0 ;Chọn bank 1endm

Ví dụ

Page 11: PIC_ BAI GIANG

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.

Page 12: PIC_ BAI GIANG
Page 13: PIC_ BAI GIANG

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

Page 14: PIC_ BAI GIANG

Moãi chaân trong Port B ñeàu coù saün moät ñieän trôû keùoleâ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 trongthanh ghi OPTION.

Caùc ñieän trôû keùo leân naøy töï ñoäng taét khi caùc chaân cuûaport ñöôï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 rangaé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.

Page 15: PIC_ BAI GIANG

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 thanhghi 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ànxung ngoaøi cho boä ñònh thôøi TMR0.

Page 16: PIC_ BAI GIANG
Page 17: PIC_ BAI GIANG
Page 18: PIC_ BAI GIANG

bsf STATUS, RP0 ;Bank1

movlw b'11111100' ;Xác định chân vào/ramovwf TRISA ;Ghi vào thanh ghi TRISAbcf STATUS, RP0 ;Bank0

Page 19: PIC_ BAI GIANG

3. Các thanh ghi SFR

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

Page 20: PIC_ BAI GIANG
Page 21: PIC_ BAI GIANG

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 ghi5 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öïchieän caùc leänh coù trong chöông trình.

Page 22: PIC_ BAI GIANG

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ïnbank 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.

Page 23: PIC_ BAI GIANG

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 chopheù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øoEPPROM.

Bit 5 TOIE ( TMR0 Overflow Interupt Enable bit ): Bit cho pheùp kíchhoaït ngaét gaây ra bôûi söï traøn cuûa TMR0.

Page 24: PIC_ BAI GIANG

Bit 4 INTE( INT External Interupt Enable bit ): Bit cho pheùp ngaét gaâyra 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ûyra 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ûaTMR0. Bit naøy phaûi ñöôïc xoaù baèng phaàn meàm ñeå coù theå söû duïng ngaétnaøy tieáp theo.

Page 25: PIC_ BAI GIANG

Bit 1 INTF ( INT External Interupt Flag bit ): Côø baùo khi xaûy ra ngaétngoaø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ûyra sau ñoù.

Page 26: PIC_ BAI GIANG

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ït0 = Voâ hieäu

Page 27: PIC_ BAI GIANG

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 rakhi 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ân0 = 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ûaboä 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øi0 = ¼ xung beân trong

Page 28: PIC_ BAI GIANG

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áng0 = 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.

Page 29: PIC_ BAI GIANG

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 giangiöõa moãi laàn taêng cuûa TMR0 hay WDT.

Page 30: PIC_ BAI GIANG

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øoEPPROM ñ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ùc0 = Ghi chöa xong, hoaëc chöa baét ñaàu ghi

Page 31: PIC_ BAI GIANG

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æ ñöôïcset 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 ra0 = 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.

Page 32: PIC_ BAI GIANG

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 ghiEEDATA ñeán moät ñòa chæ cuï theå thoâng qua thanh ghi EEDR.1 = Khôûi taïo ghi0 = 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ïo0 = Khoâng khôûi taïo

Page 33: PIC_ BAI GIANG

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.

Page 34: PIC_ BAI GIANG

ĐĐịịnhnh đđịịaa chchỉỉ

Đị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 ;Banklmovlw 0xFF ;w=0xFFmovwf TRISA

Page 35: PIC_ BAI GIANG

Movlw 0x0c

Movwf FSR

Loop: clrf INDF

incf FSR

btfss FSR,4

goto loop

Continue

….

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

Page 36: PIC_ BAI GIANG

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átnguoàn. EPPROM khoâng ñöôïc ñònh ñòa chæ tröïc tieáp, maø ñöôïc truy xuaátgiaù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á quantroïng, neân khi laäp trình caàn phaûi tuaân theo moät soá quy taéc ñeå traùnhmaéc loãi trong luùc vieát. Boä nhôù Ram coù ñòa chæ töø 0x0C ñeán 0x4F, baogoàm 68 oá nhôù 8 bit. Vieäc xaùc ñònh vò trí cuûa RAM cuõng ñöôïc thöïc hieänthoâng qua thanh ghi GPR

Page 37: PIC_ BAI GIANG

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 quantroï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ùngcoù.

Page 38: PIC_ BAI GIANG

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

TimerPIC16F84 coù moät boä timer 8 bit, vaø nhö vaäy giaù trò toái ña maø timer ñeám laø 256Sau 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öôngtrình con phuïc vuï ngaét. Beân caïnh vieäc nhaän xung noäi, giaù trò cuûatimer cuõng coù theå taêng leân nhôø vaøo vieäc nhaän xung töø beân ngoaøi thoângqua chaân RA4/ TOCKI, vaø khi ñoù timer hoaït ñoäng nhö moät boä ñeám.

Page 39: PIC_ BAI GIANG

Caùc taøi nguyeân khaùcNgaé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 thanhghi OPTION ) hoaëc bôûi tín hieäu caïnh xuoáng ( neáu INTEDG = 0 ). Khicoù tín hieäu xuaát hieän treân chaân INT, bit INTF seõ ñöôïc set trong thanhghi 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êngquan troïng. Ngaét do cô cheá naøy coù theå ñöôïc cho pheùp hay caám baèngcaùch set/ reset bit T0IE.

Page 40: PIC_ BAI GIANG

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øynhaä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 ñònhnghó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.

Page 41: PIC_ BAI GIANG
Page 42: PIC_ BAI GIANG
Page 43: PIC_ BAI GIANG
Page 44: PIC_ BAI GIANG

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ûithöï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.

Page 45: PIC_ BAI GIANG
Page 46: PIC_ BAI GIANG

VVíí ddụụ: : ChươngChương trtrììnhnh ssửử ddụụngng ngngắắtt

Org ISR_ADDR

Btfsc INTCON, GIE

Goto ISR_ADDR

PUSHBtfsc INTCON, RBIF ; Kiểm tra chân 4,5,6,7 port B có thay đổiGoto ISR_PortBBtfsc INTCON, INTF ; Ngắt ngoài diễn raGoto ISR_RB0Btfsc INTCON, T0IF ; Timer 0Goto ISR_TMR0

ISR_PortB….goto END ISR

ISR_RB0….goto END ISR

…………………..

END_ISRPOP

RETFIE ; trở về và set lai bit GIE

Page 47: PIC_ BAI GIANG

LẬP TRÌNH HỢP NGỮ CHO

PIC 16F841. 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 ;Decimal0xF0 ;Thập lục phânB’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 đượcbắt đầu bằng 0x, và số nhị phân bắt đầu bằng chữ b với dấu nháy đơn.

Page 48: PIC_ BAI GIANG

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.

Page 49: PIC_ BAI GIANG

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à gottokhô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

Page 50: PIC_ BAI GIANG

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 chochương trình rõ ràng, được đặt sau lệnh và bắt đầu bằng dấu chấmphẩy(;).

Page 51: PIC_ BAI GIANG

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. Tuynhiê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.

MovlwDạng lệnh: Movlw KHoạt động:

Ghi hằng số K vào thanh ghi WGiá trị của K từ 0

đến 255Không tác động lên cờ

Số chu kỳ:1Số byte: 2

Page 52: PIC_ BAI GIANG

MovwfDạng lệnh: Movwf fHoạt động:

Nội dung của thanh ghi W đượcchép sang thanh ghi F

Giá trị của f từ 0 đến 127Không tác động lên cờ

Số chu kỳ:1Số byte: 2

MovfDạng lệnh: Movf f, dHoạt động:

Nội dung của thanh ghi f được lưutrữ vào thanh ghi d

Tác động lên cờ :ZSố chu kỳ:1Số byte: 2

Page 53: PIC_ BAI GIANG

ClrwDạng lệnh: ClrwHoạt động:

Xoá thanh ghi WTác động lên cờ :Z

Số chu kỳ: 1Số byte: 2

ClrfDạng lệnh: Clrf fHoạt động:

Xoá thanh ghi fThanh ghi f có giá trị từ 0

đến 127Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 54: PIC_ BAI GIANG

SwapfDạng lệnh: Swapf f, dHoạt động:

Nibbles thấp và nibbles cao của thanh ghi f được hoán đổi vị trí chonhau.

Nếu d = 0 kết quả được lưu vào thanh ghi WNế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ỳ:1Số byte: 2

Page 55: PIC_ BAI GIANG

AddlwDạng lệnh: Addlw KHoạ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ưuvào thanh ghi W

Tác động lên cờ:C,DC,ZSố chu kỳ:1Số byte: 2

Page 56: PIC_ BAI GIANG

AddwfDạng lệnh: Addwf f,dHoạt động:

(W) + (f) => dNế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 FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ: C,DC,Z

Số chu kỳ:1Số byte: 2

Page 57: PIC_ BAI GIANG

SublwDạng lệnh: Sublw KHoạt động:

K-(W) => WHằng số K có giá trị tứ 0

đến 255Tác động lên cờ:C,DC,Z

Số chu kỳ:1Số byte: 2

SubwfDạng lệnh: Subwf f,dHoạt động:

(F) –(w) => dNếu d = 0 kết quả được lưu

vào thanh ghi WNếu d = 1 kết quả được lưu

vào thanh ghi FGiá trị của thanh ghi F từ 0

đến 127Tác động lên cờ:C,DC,Z

Số chu kỳ:1Số byte: 2

Page 58: PIC_ BAI GIANG

AndlwDạng lệnh: Andlw KHoạ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ỳ:1Số byte: 2

Page 59: PIC_ BAI GIANG

AndwfDạng lệnh: Andwf f,dHoạt động:

(W) and F => d

Nếu d = 0 kết quả được lưu vào thanh ghi WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 60: PIC_ BAI GIANG

IorlwDạ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ờ :ZSố chu kỳ:1Số byte: 2

IORWF Dạng lệnh: IORWF f,dHoạt động:

(W) OR (F) => dNếu d = 0 kết quả được lưu

vào thanh ghi WNếu d = 1 kết quả được lưu

vào thanh ghi FGiá trị của thanh ghi F từ 0

đến 127Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 61: PIC_ BAI GIANG

XORLW Dạng lệnh: XORLW KHoạt động:

Hằng số K có giá trị tứ 0 đến 255 Hoạt động của lệnh:(W) XOR (K) => WHằng số K có giá trị tứ 0 đến 255 Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 62: PIC_ BAI GIANG

XORWF

Dạng lệnh: XORWF f,dHoạt động:

(W) XOR (F) => dNếu d = 0 kết quả được lưu vào thanh ghi WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 63: PIC_ BAI GIANG

INCFDạng lệnh: INCF f,dHoạt động:

(F) + 1 => dNếu d = 0 kết quả được lưu vào thanh ghi WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 64: PIC_ BAI GIANG

DECFDạng lệnh: DECF f,dHoạt động:

(F) - 1 => dNếu d = 0 kết quả được lưu vào thanh ghi WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :Z

Số chu kỳ:1Số byte: 2

Page 65: PIC_ BAI GIANG

RLFDạng lệnh: RLF f,dHoạ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 WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :C

Số chu kỳ:1Số byte: 2

Page 66: PIC_ BAI GIANG

RRFDạng lệnh: RRF f,dHoạ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 WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :C

Số chu kỳ:1Số byte: 2

Page 67: PIC_ BAI GIANG

COMFDạng lệnh: COMF f,dHoạ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 WNếu d = 1 kết quả được lưu vào thanh ghi FGiá trị của thanh ghi F từ 0 đến 127Tác động lên cờ :C

Số chu kỳ:1Số byte: 2

Page 68: PIC_ BAI GIANG

BSFDạng lệnh: BSF f,bHoạt động:

Set bit b của thanh ghi f lên 1.Giá trị của thanh ghi f từ 0 đến 127

Giá trị của b từ 0 đến 7Không tác động lên cờ

Số chu kỳ:1Số byte: 2

BCFDạng lệnh: BCF f,bHoạt động:

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 b từ 0 đến 7Không tác động lên cờ

Số chu kỳ:1Số byte: 2

Page 69: PIC_ BAI GIANG

BTFSCDạng lệnh: BTFSC f,bHoạ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.

INCFSZDạng lệnh: INCFSZ f,dHoạt động:

Nếu d = 0 kết quả được lưu vào thanh ghi wNếu d = 1 kết quả được lưu vào thanh ghi fHoạt động của lệnh:(f) + 1 => dGiá trị của thanh ghi f từ 0 đến 127

Page 70: PIC_ BAI GIANG

GOTODạng lệnh: GOTO KHoạt động:

Nhảy vô điều kiện đến địa chỉ K.Giá trị của K từ 0 đến 2048Không tác động lên cờ

Số chu kỳ:1Số byte: 4

CALLDạng lệnh: CALL K

Hoạt động:Gọi chương trình conGiá trị của K từ 0 đến 2048Không tác động lên cờ

Số chu kỳ:1Số byte: 4

Page 71: PIC_ BAI GIANG

RETURNDạng lệnh: RETURNHoạt động:

Lấy nội dung từ đỉnh của ngăn xếplưu vào bộ đếm chương trình.

Không tác động lên cờSố chu kỳ:1Số byte: 4

RETLWDạng lệnh: RETLW KHoạt động:

(K) =>w ; TOS => PCGiá trị của thanh ghi F từ 0 đến 255

Không tác động lên cờSố chu kỳ:1Số byte: 4

Page 72: PIC_ BAI GIANG

RETFIEDạng lệnh: RETFIE Hoạt động:

TOS =>PC;1=>GIEKhông tác động lên cờ

Số chu kỳ:1Số byte: 4

NOPDạng lệnh: NOPHoạt động:

Không làm gì cả.Không tác động lên cờ

Số chu kỳ:1Số byte: 4

Page 73: PIC_ BAI GIANG

CLRW DTDạng lệnh: CLRWDTHoạt động:

0=> WDT0=>WDT prescaler1=> TO1=>PDTác động lên cờ:TO,PD

Số chu kỳ:1Số byte: 2

SLEEPDạng lệnh: SLEEP

Hoạt động:Chế độ dừng.

Page 74: PIC_ BAI GIANG

Cách nạp chương trình

Giới thiệu phần mềm MPLABMBLAP® là phần mềm được nhà sản xuất_Microchip cung cấp giúpngườ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ý projectWorkspace: hỗ trợ soạn thảo lệnhBuild: Dịch tập tin.Asm sang mã máy.HexDebugger: Mô phỏng và sửa lỗiProgrammer: 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

Page 75: PIC_ BAI GIANG

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ấthiệu quả. Icprog không chỉ hỗ trợ nạp tất cả các chip vi điều khiển thuộcdò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

Page 76: PIC_ BAI GIANG

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ịchngượ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ạphay dùng lại mã lệnh đã được lưu trên chip (CP off_code protection)

Page 77: PIC_ BAI GIANG

Mach nạp JDMJDM đượ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:

Page 78: PIC_ BAI GIANG

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ântheo bảng sau:

Chaân (25 chaân) Chaân (9 chaân) Teân goïiChöùc naêng

2 3 Txd Truyeàn döõ lieäu

4 7 RTS

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

5 8 CTS

Xoaù ñeå gôûi. Boä gôûi ñaët ñöôøng naøy leânmöùc cao ñeå thoâng baùo cho boätruyeàn laø noù saün saøng nhaän döõlieäu.

7 5 SG Ñaát cuûa tín hieäu

20 4 DTR

Ñaàu cuoái döõ lieäu saün saøng. Hoaït ñoänggioáng nhö RTS nhöng ñöôïc kíchhoaït bôûi boä nhaän khi muoántruyeàn döõ lieäu.

Page 79: PIC_ BAI GIANG

MMạạchch nnạạpp PG2PG2

Page 80: PIC_ BAI GIANG
Page 81: PIC_ BAI GIANG
Page 82: PIC_ BAI GIANG

MMạạchch nnạạpp ICD2 ICD2

Tham khảo CD included

Page 83: PIC_ BAI GIANG

ViViếếtt macromacro

Tên macro macro par1, par2,..

Lệnh 1

Lệnh 2 …

endm

Page 84: PIC_ BAI GIANG

VdVdbank0 macro ; Macro bank0

bcf STATUS, RP0 ; Reset RP0 bit = Bank0

endm ; End of macro

bank1 macro ; Macro bank1

bsf STATUS, RP0 ; Set RP0 bit = Bank1

endm ; End of macro

enableint macro ngắt; Cho phép toàn cụcbsf INTCON, 7 ; Set the bit

endm ; End of macro

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

bcf INTCON, 7 ; Reset the bit

endm ; End of macro

Page 85: PIC_ BAI GIANG

VdVd

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 ; Macro output

bank1 ; truy cập thanh ghi TRIS

bcf par1, par2

bank0 ; Chọn bank 0

endm ; End of macroVd: output TRISB, 7 ; chân RB7 xuất

Page 86: PIC_ BAI GIANG

Subprograms

Label

set of instructions

set of instructions

set of instructions

return or retlw

Page 87: PIC_ BAI GIANG

Ví dụ

Page 88: PIC_ BAI GIANG
Page 89: PIC_ BAI GIANG
Page 90: PIC_ BAI GIANG

PIC 16F877PIC 16F877

40 pins IC8 K Word (14 bits) Program memory368 Bytes data memory256 Bytes EEPROMOok hier slechts 35 instructies.Speciale functies:

10 channel 8-bit analog inputSPI serial portUSART serial communicationBrown-out detectionIn-circuit programmable

Page 91: PIC_ BAI GIANG
Page 92: PIC_ BAI GIANG
Page 93: PIC_ BAI GIANG
Page 94: PIC_ BAI GIANG
Page 95: PIC_ BAI GIANG
Page 96: PIC_ BAI GIANG
Page 97: PIC_ BAI GIANG
Page 98: PIC_ BAI GIANG
Page 99: PIC_ BAI GIANG
Page 100: PIC_ BAI GIANG
Page 101: PIC_ BAI GIANG
Page 102: PIC_ BAI GIANG
Page 103: PIC_ BAI GIANG
Page 104: PIC_ BAI GIANG
Page 105: PIC_ BAI GIANG
Page 106: PIC_ BAI GIANG
Page 107: PIC_ BAI GIANG
Page 108: PIC_ BAI GIANG

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

Page 109: PIC_ BAI GIANG
Page 110: PIC_ BAI GIANG
Page 111: PIC_ BAI GIANG
Page 112: PIC_ BAI GIANG
Page 113: PIC_ BAI GIANG
Page 114: PIC_ BAI GIANG
Page 115: PIC_ BAI GIANG

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

Page 116: PIC_ BAI GIANG

#include <p16f917.inc>

; Pin Declarations#define SW2 PORTA,0#define LED PORTD,7

; Variable Declarationscblock 0x20

Tempendc

Page 117: PIC_ BAI GIANG

#include <LightLED.inc>

org 0x00goto Initialize

org 0x05

Initializebsf STATUS,RP0bcf TRISD,7 ; RD7 outputbsf TRISA,0 ; RA0 input

; oscillator frequencymovlw b'01110000' ; 8Mhzmovwf OSCCON

Page 118: PIC_ BAI GIANG

; Thiet lap thanh ghi thoi gianmovlw b'10000110' ; tat PORTB keo len, TMR0

Prescaler 1:128movwf OPTION_REG

; Tat bo so sanhmovlw 0x07movwf CMCON0 ; tat so sanh

; Tat kenh analog clrf ANSEL

bcf STATUS,RP0 ; ve bank 0

bcf LED ; xoa LED

Page 119: PIC_ BAI GIANG

Mainbtfsc SW2 ; Kiem tra sw2 nhangoto Mainmovlw 0x80 ; Dung cong xor de dao trang thaixorwf PORTD,f ; toggle RD7 on and off

TT1 ; Cho sw2 nha rabtfss SW2goto TT1clrf TMR0 ; khi nha xoa co TMR0 and the va

co ngat TMR0 bcf INTCON,T0IF ; in preparation to

time 16ms

Page 120: PIC_ BAI GIANG

TT2 ; kiem tra sw2 khong dc nhan 16ms truocbtfss SW2 ; cho lan nhan tiep theogoto TT1 ; neu sw2 duoc nhan thi ve TT1btfss INTCON,T0IF ; Neu khong tiep tuc dem 16mmgoto TT2

; Time = TMR0_max * TMR0 prescaler * (1/(Fosc/4)) = 256*128*0.5E-6 = 16.4ms

goto Main

END

Page 121: PIC_ BAI GIANG

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

Page 122: PIC_ BAI GIANG

#include <p16f917.inc>

#definePOT PORTA,0#define SENSE PORTA,3#define LED PORTD,7

; Khai bao biencblock 0x20

OnCntr ; Khai bao treOffCntr

endc

Page 123: PIC_ BAI GIANG

#include <DuskIndicator.inc>org 0x00

Initializebsf STATUS,RP0 ; set bank 1

; Dinh nghia cac chanbcf TRISD,7 ; RD7 outputbsf TRISA,0 ; RA0 inputbsf TRISA,3 ; RA3 input

; set thach anh noimovlw b'01110000' ; 8Mhzmovwf OSCCON

; Set thong so TMR0 MOVLW B'10000000' ;Tat dien tro keo lenMOVWF OPTION_REG ;TMR0 Prescaler 1:1

; thiet lap bo so sanhmovlw b'00010100'movwf CMCON0 ; chon 2 bo so sanh doc lap

; Tat kenh analogclrf ANSEL

bcf STATUS,RP0 ; ve lai bank 0

Page 124: PIC_ BAI GIANG

Mainbtfss INTCON,T0IF ; cho Timer 0 tran

truoc khi chay bo so sanhgoto Mainbcf INTCON,T0IF

banksel CMCON0btfss CMCON0, C1OUT ; goto LEDonbtfsc CMCON0, C1OUTgoto LEDoff

Page 125: PIC_ BAI GIANG

LEDonclrf STATUS ; Bank 0clrf OffCntr ; Xoa counter de tat LEDincf OnCntr,f ; Kich hoat counter de on LEDbtfsc STATUS,Z ; Neu bo so sanh ko doi trong khoang thoi

gian thi sang ledbsf LEDgoto Main

LEDoffclrf STATUS ; Bank 0clrf OnCntr ; Xoa counter de tat LED incf OffCntr,f ; Kich hoat counter de on LED btfsc STATUS,Z ; Neu bo so sanh ko doi trong khoang thoi

gian thi tat ledbcf LEDgoto Main

END

Page 126: PIC_ BAI GIANG

PIC BASIC PROGRAMMINGPIC BASIC PROGRAMMING

Page 127: PIC_ BAI GIANG
Page 128: PIC_ BAI GIANG
Page 129: PIC_ BAI GIANG
Page 130: PIC_ BAI GIANG
Page 131: PIC_ BAI GIANG
Page 132: PIC_ BAI GIANG
Page 133: PIC_ BAI GIANG

ỨNG DỤNGVí dụ 1

Page 134: PIC_ BAI GIANG

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ớimass, làm chức năng như nút Start. Khi ngắt ngoài được kích, chươngtrì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àmchứ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ươngtrình con điều khiển Led, trở về chương trình chính.

Page 135: PIC_ BAI GIANG

ỨNG DỤNGVí dụ 2

Page 136: PIC_ BAI GIANG
Page 137: PIC_ BAI GIANG

ỨNG DỤNGVí dụ 3Các chân của LCDModul 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.

Page 138: PIC_ BAI GIANG

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

Page 139: PIC_ BAI GIANG

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 modulnà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êncao, nó cho phép dữ liệu ký tự hay thông tin trạng thái được đọc từ cácthanh ghi của modul.

Page 140: PIC_ BAI GIANG

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ànhì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ể đượcchuyển đến và lấy ra khỏi bộ hiển thị LCD theo dạng một byte hay dạngnử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.

Page 141: PIC_ BAI GIANG

Chú ý

Summary of the PICs Built-in PeripheralsSPI (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.

Page 142: PIC_ BAI GIANG

Timers, both 8 and 16 bits, many have prescalers and some have postscalers. In 14 bit cores they generate interrupts. External pins (clockin/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).

Page 143: PIC_ BAI GIANG

CCSCCS

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 đặtSau khi cài MPLAB cài CCS, crack…

Page 144: PIC_ BAI GIANG

CCSCCS

Page 145: PIC_ BAI GIANG

CCSCCSTập lệnh

Khai báo lệnh

Page 146: PIC_ BAI GIANG

CCSCCSTập lệnh

Page 147: PIC_ BAI GIANG

CCSCCS

Page 148: PIC_ BAI GIANG

CCSCCS

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

Page 149: PIC_ BAI GIANG

CCSCCS

CCS hỗ trợ lệnhhợp ngữ theo cácdòng PIC

Page 150: PIC_ BAI GIANG

CCSCCS

Page 151: PIC_ BAI GIANG

CCSCCS

Vd:

Page 152: PIC_ BAI GIANG

CCSCCS

Page 153: PIC_ BAI GIANG

CCSCCS

Page 154: PIC_ BAI GIANG

CCSCCS

Page 155: PIC_ BAI GIANG

CCSCCS

Page 156: PIC_ BAI GIANG

CCSCCS

Page 157: PIC_ BAI GIANG

CCSCCS

Page 158: PIC_ BAI GIANG

CCSCCS

Page 159: PIC_ BAI GIANG

CCSCCS

Page 160: PIC_ BAI GIANG

CCSCCS

Page 161: PIC_ BAI GIANG

CCS CCS ((khaikhai bbááoo))

Cấu trúc

Page 162: PIC_ BAI GIANG

CCSCCS

Page 163: PIC_ BAI GIANG

CCSCCS

VD:

Page 164: PIC_ BAI GIANG

CCSCCS

Page 165: PIC_ BAI GIANG

CCSCCSBiểu diễn dạng dữ liệu

Page 166: PIC_ BAI GIANG

CCSCCSToán tử

Page 167: PIC_ BAI GIANG

CCSCCS

Page 168: PIC_ BAI GIANG

CCS CCS –– TTậậpp llệệnhnh CC

Page 169: PIC_ BAI GIANG

CCSCCS

Page 170: PIC_ BAI GIANG

CCSCCS

Page 171: PIC_ BAI GIANG

CCSCCS

Page 172: PIC_ BAI GIANG

CCSCCS

Page 173: PIC_ BAI GIANG

CCSCCS

Page 174: PIC_ BAI GIANG

CCSCCS

Page 175: PIC_ BAI GIANG

CCSCCS

Page 176: PIC_ BAI GIANG

CCSCCS

Page 177: PIC_ BAI GIANG

CCSCCS

Page 178: PIC_ BAI GIANG

CCSCCS

Page 179: PIC_ BAI GIANG

CCSCCS

Page 180: PIC_ BAI GIANG

CCSCCS

Page 181: PIC_ BAI GIANG

CCSCCS

Biên dịch

Page 182: PIC_ BAI GIANG

CCSCCSLiên kết với MPLAB

Page 183: PIC_ BAI GIANG

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

Cài SETUP_MPLAB_PLUGIN

Page 184: PIC_ BAI GIANG

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

Page 185: PIC_ BAI GIANG

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

Page 186: PIC_ BAI GIANG

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

Page 187: PIC_ BAI GIANG

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);}}

Page 188: PIC_ BAI GIANG
Page 189: PIC_ BAI GIANG
Page 190: PIC_ BAI GIANG

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 Tputc('e'); // Transmit eputc('s'); // Transmit sputc('t'); // Transmit tputc('i'); // Transmit iputc('n'); // Transmit nputc('g'); // Transmit gputc('.'); // Transmit .putc('.'); // Transmit .putc('.'); // Transmit .delay_ms(1000);

}}

Page 191: PIC_ BAI GIANG

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()); }

}

Page 192: PIC_ BAI GIANG

Rs232 và ADC

Page 193: PIC_ BAI GIANG

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 ADCsetup_adc(ADC_CLOCK_INTERNAL); // Dung ADC clock noiset_adc_channel(0);

delay_us(20); // Cho lay mau

Page 194: PIC_ BAI GIANG

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|d5adcLO = (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}

}

Page 195: PIC_ BAI GIANG

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); // TRISE = 00010111; RE2,RE1 va RE0 TTL InputsSetBaudRate();

Page 196: PIC_ BAI GIANG

while(TRUE){

putc('T'); // Transmit Tputc('e'); // Transmit eputc('s'); // Transmit sputc('t'); // Transmit tputc('i'); // Transmit iputc('n'); // Transmit nputc('g'); // Transmit gputc('.'); // Transmit .putc('.'); // Transmit .putc('.'); // Transmit .delay_ms(1000);

}}

Page 197: PIC_ BAI GIANG

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;

}}

Page 198: PIC_ BAI GIANG

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()); }

}

Page 199: PIC_ BAI GIANG

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;

}}

Page 200: PIC_ BAI GIANG

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);

Page 201: PIC_ BAI GIANG

while(TRUE){ adcValue = read_adc(); // doc ADC

adcHI = (char)((adcValue >> 5)& 0x1f); // 0|0|0|d9|d8|d7|d6|d5adcLO = (char)((adcValue & 0x1f)|0x80); // 1|0|0|d4|d3|d2|d1|d0putc(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;

}}

Page 202: PIC_ BAI GIANG

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

Page 203: PIC_ BAI GIANG

#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 bitchar adcHI,adcLO; set_tris_e(0x17); // TRISE = 00010111; RE2,RE1 and RE0 TTL InputsSetBaudRate();setup_adc_ports(A_ANALOG); // RA0 - RA4 Analog, RE0 - RE2 digitalsetup_adc(ADC_CLOCK_DIV_32); set_adc_channel(0);delay_us(20); // delay lay mau

Page 204: PIC_ BAI GIANG

while(TRUE){

adcValue = read_adc(); // doc ADC

/* cat 16 bit thanh 2 byteadcHI = (char)((adcValue >> 5)& 0x1f); // 0|0|0|d9|d8|d7|d6|d5adcLO = (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)

set_adc_channel(1);delay_us(20); // delay lay mau

adcValue = read_adc(); // doc ADC

Page 205: PIC_ BAI GIANG

/* Kenh 2 */adcHI = (char)(((adcValue >> 5)& 0x1f)|0x20); // 0|0|1|d9|d8|d7|d6|d5adcLO = (char)((adcValue & 0x1f)|0xA0); // 1|0|1|d4|d3|d2|d1|d0

putc(adcHI); // gui Byte 1 (d9...d5)putc(adcLO); // gui Byte 2 (d4...d0)

set_adc_channel(0);delay_ms(10);

}}

Page 206: PIC_ BAI GIANG

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;

}}

Page 207: PIC_ BAI GIANG

ADC 8 bits

Page 208: PIC_ BAI GIANG
Page 209: PIC_ BAI GIANG

Kiểm tra

Page 210: PIC_ BAI GIANG

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

Page 211: PIC_ BAI GIANG

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

Page 212: PIC_ BAI GIANG
Page 213: PIC_ BAI GIANG

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

Page 214: PIC_ BAI GIANG
Page 215: PIC_ BAI GIANG
Page 216: PIC_ BAI GIANG

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

Page 217: PIC_ BAI GIANG
Page 218: PIC_ BAI GIANG
Page 219: PIC_ BAI GIANG
Page 220: PIC_ BAI GIANG
Page 221: PIC_ BAI GIANG
Page 222: PIC_ BAI GIANG
Page 223: PIC_ BAI GIANG
Page 224: PIC_ BAI GIANG
Page 225: PIC_ BAI GIANG
Page 226: PIC_ BAI GIANG

Ví dụ ASMVí dụ 1:org 0x000

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

tris myPortB

movlw b'10101010'

movwf myPortB ; xuat port B

circle goto circle ; done

end

Page 227: PIC_ BAI GIANG

Nút và đèn

Page 228: PIC_ BAI GIANG

SetUp

Main

Main2

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

BTFSS 05,0GOTO Main2BSF 06,0GOTO MainBCF 06,0GOTO Main

END

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

;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

Page 229: PIC_ BAI GIANG

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

Page 230: PIC_ BAI GIANG
Page 231: PIC_ BAI GIANG
Page 232: PIC_ BAI GIANG

Chốt LED

Page 233: PIC_ BAI GIANG
Page 234: PIC_ BAI GIANG

LED chay

Page 235: PIC_ BAI GIANG
Page 236: PIC_ BAI GIANG
Page 237: PIC_ BAI GIANG

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

Page 238: PIC_ BAI GIANG
Page 239: PIC_ BAI GIANG
Page 240: PIC_ BAI GIANG

ADC

Page 241: PIC_ BAI GIANG
Page 242: PIC_ BAI GIANG
Page 243: PIC_ BAI GIANG

Led chạy 0-255

portB equ 0x06count equ 0x0cnCountequ 0x0dmCount equ 0x0e;----------------------------------------------------------------------

org 0x000

start movlw 0x00 ; nap W =0x00 cho trisb chon port B outputtris portBclrf portB ; xoaclrf count ; khoi tao counter to 0

Page 244: PIC_ BAI GIANG

get_cnt movf count, w ; nap count sang Wmovwf portB ; move W sang port Bcall pause ; goi delay call pausecall pausecall pausecall pause ; goi 5 lan ~ 1 giayincf count, f ; inc countergoto get_cnt ; lap vo tan

Page 245: PIC_ BAI GIANG

pause movlw 0xff ; set w = 255 movwf mCount ; mCount = w

loadN movlw 0xff ; set w = 255movwf nCount ; nCount = w

decN decfsz nCount, f ; nCount--goto decN ; neu nCount != 0 thi repeat nCount--decfsz mCount, f ; khac giam Countgoto loadN ; if mCount != 0 thi

; reload nCount to 255 va tangreturn ; khac exit end

Page 246: PIC_ BAI GIANG

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 bdelay_ms(100); // delay

}}

Page 247: PIC_ BAI GIANG

Đọc Dip Switch chuyển ra sáng LED

myPortA equ 0x05myPortB equ 0x06;----------------------------------------------------------------------

org 0x000start movlw 0xFF ; nap W =0xFF vao tris a lam port A input

tris myPortAmovlw 0x00 ; nap W =0x00 vao tris a lam port B outputtris myPortBmovf myPortA, w ; doc port A DIP va luu vao Wmovwf myPortB

circle goto start ; lap vo hanend

Page 248: PIC_ BAI GIANG

Thay đổi tốc độ nháy

portB equ 0x06count equ 0x0ctmr0 equ 0x01;----------------------------------------------------------------------

org 0x000start clrwdt ; xoa watchdog timer

movlw b'11010111' ; gan prescaler, clock noi; chon chia 256

optionmovlw 0x00 ; set w = 0tris portB ; port B outputclrf portB ; port B muc thap

Page 249: PIC_ BAI GIANG

go bsf portB, 0 ; RB0 = 1, LED oncall delaybcf portB, 0 ; RB0 = 0, LED offcall delaygoto go ; lap vo tan

delay clrf tmr0 ; xoa co TMR0, bat dau demagain btfss tmr0, 7 ; neu bit 7 = 1

goto again ; khong =, check laireturn ; khac exit delay

end

Page 250: PIC_ BAI GIANG

Serial port: PC to PIC serialNhận ký tự từ máy tính xuất mã ascii ra port

tmr0 equ 0x01 ; Timer/counter registerstatus equ 0x03 ; Status word registerportA equ 0x05 ; Port A registerportB equ 0x06 ; Port B registerintCon equ 0x0b ; Interrupt control registerrcvRegequ 0x0c ; General purpose registercount equ 0x0d ; General purpose registertemp equ 0x0e ; General purpose registeroptRegequ 0x81 ; File register in Bank 1trisA equ 0x85 ; File register in Bank 1trisB equ 0x86 ; File register in Bank 1.rp0 equ 5;--------------------------------------------------------------------------

org 0x000

Page 251: PIC_ BAI GIANG

start bsf status, rp0 ; chuyen Bank 1movlw b'00000101' ; A0, A2 input con lai outputmovwf trisAmovlw b'00000000' ; Port B: tat ca outputmovwf trisBbcf status, rp0 ; tra ve Bank 0clrf portBclrf rcvReg

doThis call rcv4800 ; goi chuong trinh serialmovf rcvReg,w ; nhan bytemovwf portB ; xuat byte nhan ra 8 LEDs

circle goto doThis ; ket thuc

Page 252: PIC_ BAI GIANG

Rcv4800 bcf intCon, 5 ; Disable ngat do tmr0 bcf intCon,7 ; Disable ngat toan cucclrf tmr0 ; xoa timer/counterclrwdt ; xoa wdt cho prep prescalerbsf status, rp0 ; movlw b'11011000' ; set up timer/countermovwf optRegbcf status, rp0movlw 0x08 ; khoi tao countermovwf count

Page 253: PIC_ BAI GIANG

sbit btfsc portA, 0 ; cho start bitgoto sbit ; movlw 0x98 ; movwf tmr0 ; nap va bat dau timer/counterbcf intCon, 2 ; xoa co tran tmr0

time1 btfss intCon, 2 ; tran? neu =1 bo dong tiep theogoto time1 ; Nobtfsc portA, 0 ; Start bit van muc thap?goto sbit ; False start, go backmovlw 0x30 ; vong lap N cho timermovwf tmr0 ; start timer/counter bcf intCon, 2 ; xoa co tran tmr0

Page 254: PIC_ BAI GIANG

time2 btfss intCon, 2 ; Timer tran?goto time2 ; Nomovlw 0x30 ; gan N cho timermovwf tmr0 ; Start timer/counterbcf intCon, 2 ; xoa co tran tmr0 movf portA, w ; doc port Amovwf temp ; luurrf temp, f ; xoay bit 0 qua co carry rrf rcvReg, f ; xoay co carry qua rcvReg bit 7decfsz count, f ; Shifted 8?goto time2 ; No

time3 btfss intCon, 2 ; timer tran?goto time3 ; Noreturn ; Yes, byte da nhan

end

Page 255: PIC_ BAI GIANG

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;

Page 256: PIC_ BAI GIANG

while(1) {i = 65; // kiem tra ASCII 'A' ~ 65do {

putc(i); delay_ms(1000); // gui ký tu mot 1si++;

} while (i<=122); // kiem tra ASCII 'z' is 122}

} // ket thuc main

Page 257: PIC_ BAI GIANG

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

Page 258: PIC_ BAI GIANG

#include <DisplayTemp.inc>

;**********************************************************************STARTUP code

goto Initialize

PORT1 code

;************************************************************************************; Initialize - Initialize CCP1, comparators, internal oscillator, I/O pins, ; analog pins, motor parameters, variables;;************************************************************************************Initialize

clrf STATUS ; bank 0bsf STATUS,RP0 ; we'll set up the bank 1 Special

Function Registers first

; Configure I/O pins for projectbsf TRISA,0 ; RA0 is an input

; Set internal oscillator frequencymovlw b'01110000' ; 8Mhzmovwf OSCCON

Page 259: PIC_ BAI GIANG

; Set TMR0 parametersMOVLWb'10000111' ; PORTB PULL-UP DISABLEDMOVWF OPTION_REG ; TMR0 RATE 1:256

; Turn off comparatorsmovlw 0x07movwf CMCON0 ; turn off comparators

; Set up Analog Channel(s) movlw b'00000001' ; select AN0 as an analog channel (RA0)movwf ANSELmovlw b'01010000' ; select A/D converstion clock Fosc/16movwf ADCON1

bcf STATUS,RP0 ; go back to bank 0

; Finish ADC set upmovlw b'10000001' ; right justified, Vss and Vdd as refs, AN0 is onmovwf ADCON0 ; turn ADC module on

Page 260: PIC_ BAI GIANG

;************************************************************************************; 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 loopLoop

btfss INTCON,T0IF ; Wait for TMR0 to overflow at 32msgoto Loopbcf INTCON,T0IF

GetTemperaturebanksel ADCON0 ; Do A-to-C conversionbsf ADCON0,1btfsc ADCON0,1 ; Wait for result before proceedinggoto $-1banksel ADRESHmovf ADRESH,w ; store high two bits in TempHighbanksel TempHighmovwf TempHighbanksel ADRESLmovf ADRESL,w ; store lower bits in TempLowbanksel TempLowmovwf TempLow

Page 261: PIC_ BAI GIANG

CheckForValiditybcf Flag,InvalidTemp ; clear flag that indicates temperature is invalidmovf TempHigh,w ; Are bits 9 or 10 set?btfss STATUS,Zgoto CheckForOverTemp ; Yes, then check for an over temperature condition

CheckForUnderTemp ; No, then check for an under temperature conditionmovlw .22 If the the low order bits are under 22 then the temperature is under -40Csubwf TempLow,wbtfss STATUS,Cbsf Flag,InvalidTempgoto EndCheck

CheckForOverTempmovlw .1 ; make sure high order byte only has a 1subwf TempHigh,wbtfss STATUS,Zgoto NotValidmovlw .102 ; then check to make sure the low order byte isn't over 102subwf TempLow,wbtfsc STATUS,C

Page 262: PIC_ BAI GIANG

ConvertToTemperature ; Temperature = (AN0/2) - 50 "in Celcius"rrf TempHigh,f ; bit 10 is never set so it is ignoredrrf TempLow,fbcf Flag,Negativemovlw .50 ; Subtract 50subwf TempLow,fbtfsc STATUS,C ; is value negative?goto CheckAgainstStoredValuecomf TempLow,f ; make a negative value unsignedbsf Flag,Negative

CheckAgainstStoredValuemovf TempLow,w ; check against the stored temperature valuexorwf TempSave,wbtfsc STATUS,Z ; if the value is the same then check for

consistancygoto CheckForConsistancyclrf Counter ; else, save the temperature valuemovf TempLow,wmovwf TempSavegoto Loop

Page 263: PIC_ BAI GIANG

DisplayTemperature ; display the temperaturecall InitLCD ; clear the display firstbtfsc Flag,InvalidTemp ; If temperature is invalid then indicate that with "---"goto DisplayDashDashDashbtfsc Flag,Negative ; If the Negative flag is set then display negative sign call DisplayNegmovf TempLow,w ; first convert the hexidecemal value to binary

coded decimalcall ConvertToBCDmovwf TempBCD ; the ones and tens decimal values are

returned in Wmovf TempBCD,wandlw 0x0Fcall DisplayDigit2swapf TempBCD,wandlw 0x0Fcall DisplayDigit3movlw 0x00btfsc Flag,Overflow ; the hundred value is returned in Overflow flagmovlw 0x01call DisplayDigit4movlw 0x0C ; Display C for Celcius in the first digitcall DisplayDigit1goto Loop

Page 264: PIC_ BAI GIANG

ConvertToBCDmovwf Tempincf Temp,fclrf BCDValuebcf Flag,Overflow

ConvertLoopdecf Temp,fbtfsc STATUS,Zgoto EndConvertToBCDincf BCDValue,fmovf BCDValue,wandlw 0x0Fxorlw 0x0Abtfss STATUS,Zgoto ConvertLoopmovlw 0x06

Page 265: PIC_ BAI GIANG

addwf BCDValue,fmovf BCDValue,wandlw 0xF0xorlw 0xA0btfss STATUS,Zgoto ConvertLoopmovlw 0x60addwf BCDValue,fbsf Flag,Overflowgoto ConvertLoop

EndConvertToBCDmovf BCDValue,wreturn

END

Page 266: PIC_ BAI GIANG

Đồng hồ số dùng timer

Page 267: PIC_ BAI GIANG

#include <Clock.inc>STARTUP code

goto InitializePORT1 code; Initialize - Initialize CCP1, comparators, internal oscillator, I/O pins, ; analog pins, motor parameters, variablesInitialize

clrf STATUS ; bank 0bsf 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 inputbsf TRISA,6 ; RA6 is an inputbsf TRISA,5 ; RA5 is an inputbsf TRISA,4 ; RA4 is an inputbsf TRISA,3 ; RA3 is an input

; Set internal oscillator frequencymovlw b'01110000' ; 8Mhzmovwf OSCCON

Page 268: PIC_ BAI GIANG

; Set TMR0 parametersmovlw B'10000110' ;PORTB PULL-UP DISABLEDmovwf OPTION_REG ;TMR0 RATE 1:128

; Turn off comparatorsmovlw 0x07movwf CMCON0 ; turn off comparators

; Turn off Analog clrf ANSEL

bcf STATUS,RP0 ; go back to bank 0

; Set up Timer 1movlw b'00001011' ; Use external oscillatormovwf T1CON

Page 269: PIC_ BAI GIANG

; 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 Registersclrf Second ; Display 12:00 on startupclrf Minutemovlw .12movwf Hourclrf TimeBaseMultiple ; This variable is keep track of the number of 1/2 second

intervalsclrf Flagclrf StateSW2clrf StateSW3clrf StateSW4bsf TMR1H,6 ; Make sure the first time

around the code displays something

Page 270: PIC_ BAI GIANG

; Main program loopLoop

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 Loopbcf TMR1H,6incf 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 thiscall BlinkDot ; toggle blink flagcall DisplayTime ; Display either seconds or Hour and Minutes

dempending on mode

; Every 1 second do thisbtfsc TimeBaseMultiple,0goto EndLoopcall MakeTime ; Constuct the time (increment seconds, minutes, hours

appropiately)

EndLoopgoto Loop

Page 271: PIC_ BAI GIANG

DisplayTimecall InitLCD ; Clear display

momentarilybtfsc Flag,Blink ; If the Blink flag is set then

display the dotcall Display3DPbtfsc Flag,DisplayMode ; Display either seconds or Hour

and Minutes depending on modecall DisplaySecondsbtfss Flag,DisplayModecall DisplayHourAndMinutesreturn

Page 272: PIC_ BAI GIANG

;************************************************************************************; DisplaySeconds - Convert Seconds to Binary Coded Decimal (BCD) and then display.;;************************************************************************************DisplaySeconds

movf Second,wcall ConvertToBCDmovwf SecondBCD

movf SecondBCD,wandlw 0x0Fcall DisplayDigit1swapf SecondBCD,wandlw 0x0Fcall DisplayDigit2return

Page 273: PIC_ BAI GIANG

; DisplayHourAndMinutes - Convert Hours and Minutes to BCD and display.DisplayHourAndMinutes

movf Minute,wcall ConvertToBCDmovwf MinuteBCDmovf Hour,wcall ConvertToBCDmovwf HourBCD

movf MinuteBCD,wandlw 0x0Fcall DisplayDigit1swapf MinuteBCD,wandlw 0x0Fcall DisplayDigit2movf HourBCD,wandlw 0x0Fcall DisplayDigit3swapf HourBCD,wandlw 0x0Fcall DisplayDigit4btfss Flag,AMorPMcall DisplayAreturn

Page 274: PIC_ BAI GIANG

MakeTimecall IncrementSecondbtfsc STATUS,Z ; If seconds overflows (59 to 0)

then the zero flag is setcall IncrementMinutebtfsc STATUS,Z ; If minutes overflows (59 to 0)

then the zero flag is setcall IncrementHourreturn

Page 275: PIC_ BAI GIANG

IncrementSecondincf Second,fmovf Second,wxorlw .60btfsc STATUS,Zclrf Secondreturn

; IncrementMinute - Increment minutes; Output - Zero flag set if Minute rolls over from 59 to 0IncrementMinute

incf Minute,fmovf Minute,wxorlw .60btfsc STATUS,Zclrf Minutereturn

Page 276: PIC_ BAI GIANG

IncrementHourincf Hour,fmovf Hour,w

ToggleAMorPMxorlw .12btfss STATUS,Zgoto Nextmovlw 0x10xorwf Flag,f ; Change from AM to PM or vice versa

Nextmovf Hour,wxorlw .13btfss STATUS,Zgoto EndMakeHourmovlw 1movwf Hourgoto EndMakeHour

EndMakeHourreturn

Page 277: PIC_ BAI GIANG

ConvertToBCDmovwf Tempincf Temp,fclrf BCDValue

ConvertLoopdecf Temp,fbtfsc STATUS,Zgoto EndConvertToBCDincf BCDValue,fmovf BCDValue,wandlw 0x0Fxorlw 0x0Abtfss STATUS,Zgoto ConvertLoopmovlw 0x06addwf BCDValue,fgoto ConvertLoop

EndConvertToBCDmovf BCDValue,wreturn

Page 278: PIC_ BAI GIANG

; 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 overServiceSwitches

btfss SW2 ; If SW2 is pressed set a flag to begin debounce routine

bsf Flag,ServiceSW2btfss SW3 ; If SW3 is

pressed set a flag to begin debounce routinebsf Flag,ServiceSW3btfss SW4 ; If SW4 is

pressed set a flag to begin debounce routinebsf Flag,ServiceSW4

btfsc Flag,ServiceSW2 ; Set the hour if SW2 is pressedcall SetHourbtfsc Flag,ServiceSW3 ; Set the minute if SW3 is pressedcall SetMinutebtfsc Flag,ServiceSW4 ; Toggle between display modes

when SW4 is pressedcall ChangeDisplay

EndServiceSwitchesreturn

Page 279: PIC_ BAI GIANG

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

Page 280: PIC_ BAI GIANG

#include <OpticalInt.inc>

STARTUP codegoto Initialize

PORT1 code

Initializeclrf STATUS ; bank 0bsf STATUS,RP0 ; we'll set up the bank 1 Special

Function Registers fist

; Configure I/O pins for projectbcf TRISD,7 ; RD7 is an outputbcf TRISD,2 ; RD6 is an outputbsf TRISC,5 ; RC5 is an inputbsf TRISA,4 ; RA4 is an inputbsf TRISA,0 ; RA0 is an input

; Set internal oscillator frequencymovlw b'01110000' ; 8Mhzmovwf OSCCON

Page 281: PIC_ BAI GIANG

; Set up A-to-D Modulemovlw b'00000001' ; enable AN0movwf ANSELmovwf b'01010000' ; Fosc/16movwf ADCON1

; Configure PR2 tomovlw 0x3F ; 31.2 kHz PWMmovwf PR2

; Set TMR0 parametersMOVLWB'10000111' ;PORTB PULL-UP DISABLEDMOVWF OPTION_REG ;TMR0 RATE 1:256

; Turn off comparatorsmovlw 0x07movwf CMCON0 ; turn off comparatorsbcf STATUS,RP0 ; go back to bank 0

; Finish setting up A-to-D Modulemovlw b'00000001' ; left justified, AN0 selected, module onmovwf ADCON0

; Turn off all interruptsclrf INTCON ; Make sure interrupts are turn off

Page 282: PIC_ BAI GIANG

; Configure Capture Compare PWM Module 2clrf CCPR2Lmovlw b'00001100' ; pwm modemovwf CCP2CON

; Turn on Timer 2bsf T2CON,TMR2ON ; turn on PWM

; Turn on Timer 1movlw b'00010111' ; set Timer 1 prescaler to 1:2,

Select external clock source, Timer 1 onmovwf T1CON

clrf PORTD ; Turn off Motor

Page 283: PIC_ BAI GIANG

;************************************************************************************; 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 conversioncall InitLCD ; Initialize LCD Special Function Registersclrf Counterclrf TMR1Lclrf TMR1H

Page 284: PIC_ BAI GIANG

Loopbtfss INTCON,T0IF ; TMR0 is preloaded so

than this loop is exited every 23.4msgoto Loop ; RPM/10 = (number of counts

every 23.ms) * 256 (this is a nice number to work with)bcf INTCON,T0IFmovlw .73movwf TMR0

call SetMotorSpeedcall MeasureSpeedbtfsc STATUS,Ccall DisplaySpeed

goto Loop

Page 285: PIC_ BAI GIANG

SetMotorSpeedmovf ADRESH,wmovwf DutyCyclebsf ADCON0,GO_DONEbsf P1 ; Turn on

motorswapf DutyCycle,w ; bits 4 and 5 of CCP2CONandlw 0x30iorlw 0x8Dmovwf CCP2CONrrf DutyCycle,f ; move most significant 6

bits of duty cycle intorrf DutyCycle,w ; CCPR2Landlw 0x3Fmovwf CCPR2Lreturn

Page 286: PIC_ BAI GIANG

MeasureSpeedincf Counter,f ; measure over 3^5 or 32 cycles (23.4ms *

32 = 0.75 second)bcf STATUS,C ; clear carry flagbtfss Counter,5goto EndMeasureSpeedclrf Counter

bcf T1CON, TMR1ON ; turn off Timer 1movf TMR1L,w ; Store Timer 1 in TimeL and TimeHmovwf TimeLmovf TMR1H,wmovwf TimeHbsf T1CON,TMR1ON ; turn Timer 1 back onclrf TMR1Lclrf TMR1Hbsf STATUS,C ; Set carry flag to indicate its time to

display a valueEndMeasureSpeed

return

Page 287: PIC_ BAI GIANG

DisplaySpeedbcf STATUS,C ; first multiply by 8

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

movf TimeL,w ; Now convert to BCDmovwf L_bytemovf TimeH,wmovwf H_bytecall 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)

Page 288: PIC_ BAI GIANG

movf R2,w ; Example RPM = 4320andlw 0x0F ; R2 contains 0x32

(remember we are displaying RPM/10)call DisplayDigit1swapf R2,wandlw 0x0Fcall DisplayDigit2movf R1,w ; R1 contains 0x04 andlw 0x0Fcall DisplayDigit3call Display3DP ; Place a decimal point

between the 4 and the 3. The display will read 4.32return ; Therefor the

display shows RPM / 10^3.

Page 289: PIC_ BAI GIANG

Điều khiển stepper motor

Page 290: PIC_ BAI GIANG

#include <stepperinc.inc>

Initializebsf STATUS,RP0 ; bank 1

bcf TRISC,5 ; Output: RC5movlw b'00001011' ; Outputs: RD2,RD4-RD7movwf TRISDmovlw b'01110000' ; 8Mhzmovwf OSCCONmovlw b'00000001' ; enable AN0movwf ANSELmovwf b'01010000' ; Fosc/16movwf ADCON1movlw 0x3F ; 31.2 kHz PWMmovwf PR2movlw b'00000000' ; 1:2 prescaler for TMR0movwf OPTION_REGbcf STATUS,RP0 ; bank 0

Page 291: PIC_ BAI GIANG

clrf PORTD ; turn off windingsclrf PORTCmovlw b'00000001' ; left justified, AN0 selected, module onmovwf ADCON0movlw 0x07movwf CMCON0 ; turn off comparatorsclrf CCPR1Lclrf CCPR2Lmovlw b'00001100' ; pwm modemovwf CCP1CONmovwf CCP2CONbsf T2CON,TMR2ON ; turn on PWMbsf T1CON,TMR1ON ; turn on Timer 1

clrf State ; initialize motor state pointer and duty cycleclrf Index ; index pointerclrf Modeclrf ADRESHmovlw 1movwf StepModeScalermovwf Counterclrf Speedclrf ButtonState ; initialize button state

Page 292: PIC_ BAI GIANG

Mainbtfss INTCON,T0IF ; Wait 2.5msgoto Mainbcf INTCON,T0IF

call ButtonPress ; Call the button press debounce routinebtfsc STATUS,C ; The carry flag is set if a button press just occurredincf Mode,f ; Change to the next state when a button press

occurs.

decfsz Counter,f ; This is the scaler for different stepping modesgoto Mainmovf StepModeScaler,wmovwf Counterdecfsz Speed,f ; Delay countergoto Main

Page 293: PIC_ BAI GIANG

comf ADRESH,w ; Set speed of motorbtfsc STATUS,Z ; If zero, then make 255sublw 1movwf Speed ; Store in speed variablebsf ADCON0,GO_DONE ; start another ADC convertion

goto ModeStateMachine

ModeStateMachine ; Select stepping modemovlw high ModeTablemovwf PCLATHmovf Mode,wandlw 0x03addlw low ModeTablebtfsc STATUS,Cincf PCLATH,fmovwf PCL

Page 294: PIC_ BAI GIANG

ModeTablegoto SingleStepgoto HalfStepgoto MicroStepclrf Modegoto ModeTable

Page 295: PIC_ BAI GIANG

SingleStepmovlw 8movwf StepModeScalerincf State,f ; Increment motor statemovlw 0xFF ; Turn off PWMsmovwf CCPR1Lmovwf CCPR2Lmovlw 0x30iorwf CCP1CON,fiorwf CCP1CON,f

SingleStateMachine ; jump to motor state based on State pointer

movlw high SingleJumpTablemovwf PCLATHmovf State,wandlw 0x03addlw low SingleJumpTablebtfsc STATUS,Cincf PCLATH,fmovwf PCL

Page 296: PIC_ BAI GIANG

SingleJumpTablegoto SingleState0goto SingleState1goto SingleState2goto SingleState3

SingleState0movlw CTRL1FWDmovwf PORTDgoto Main

SingleState1movlw CTRL2REVmovwf PORTDgoto Main

SingleState2movlw CTRL1REVmovwf PORTDgoto Main

SingleState3movlw CTRL2FWDmovwf PORTDgoto Main

Page 297: PIC_ BAI GIANG

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 directiveis 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.

Page 298: PIC_ BAI GIANG

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 PWMsetup_ccp2(CCP_PWM); // Configure CCP1 as a PWM

#if VARIABLE_PERIOD // This is defaultfor ( ; ; ) {// Select value for the period (100% duty cycle)printf("Period (100%% duty cycle): ");period = gethex();printf("\r\n");

Page 299: PIC_ BAI GIANG

// Set the prescalerdo {// 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'));

Page 300: PIC_ BAI GIANG

// 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 khzswitch(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;

}

Page 301: PIC_ BAI GIANG

#elseperiod = 0x80;prescale = 4;setup_timer_2(T2_DIV_BY_4, period, 1);

#endifprintf("Frequency = %ld kHz\r\n", 5000 / period / prescale);while(TRUE) {printf("Enter duty cycle: ");duty = gethex();printf("\r\n");// Set the duty cycleset_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 prescalerbreak;

}}}}

Page 302: PIC_ BAI GIANG

Tổng quan FPGA

I) QUAÙ TRÌNH PHAÙT TRIEÅNTheo 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).

Page 303: PIC_ BAI GIANG

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 .

Page 304: PIC_ BAI GIANG

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öõngnhaø 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 öùngduïng cuï theå . Trong tröôøng hôïp toång quaùt , ASIC seõ yeâu caàu quaù trình cheá taïo saucuøng (final manufacturing process) ñeå taïo ra chöùc naêng theo yeâu caàu cuûa khaùchhaøng, coøn FPGA thì khoâng .

Page 305: PIC_ BAI GIANG

FPGA (Field-programmable Gate Array – daûi coång laäp trình daïng tröôøng) laø coângngheä 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öùcthanh 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ânduï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 .

Page 306: PIC_ BAI GIANG

FPGA laø 1 chip silicon chöùa trong noù raát nhieàu “khoái logic” coù theå caáu hìnhCLB(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ïothaø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øovaø 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átnhieàu chöùc naêng phöùc taïp

Page 307: PIC_ BAI GIANG

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ûnphaå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ùng11/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âunhö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 .

Page 308: PIC_ BAI GIANG

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ápSöï 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

Page 309: PIC_ BAI GIANG

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 .

Page 310: PIC_ BAI GIANG

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 “Single-ended” vaø “differential electrical I/O”

+ Caàu noái chuyeån ñoåi caùc chuaån khaùc nhauTeraMAC/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

Page 311: PIC_ BAI GIANG

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

Page 312: PIC_ BAI GIANG

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 quanhVirtex-II Pro FPGAPowerPC 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

Digital Connectors

- 2VP7- DDR SDRAM- PCI/PMC- System ACE with CompactFlash- MGTs(multi-gigabit transceiver)- Serial/Parallel Ports- Card Bus

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

Power Connectors

Page 313: PIC_ BAI GIANG

ML300 CPU BOARDML300 CPU Board ñaïi dieän cho boä naõo cuûa ML300 Hardware Platform . Noù baogoà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ùcnöõ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ånkhaû 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 MGTsHai ngoõ keát noái serial ATA (SATA) , moät cho host vaø moät cho thieát bòInfiniBand / HSSDC2Gigabit Ethernet Fiber (Caùp quang)Heä thoáng ACE vaø kho löu tröõ baát bieán vôùi keát noái CompactFlash128M DDR SDRAMHai coång noái tieápHai coång PS/2 söû duïng loaïi nhoû 6 pins

Page 314: PIC_ BAI GIANG

Coång song songIIC vaø SPI phuïc vuï cho vieäc söû duïng EEPROM,caûm bieán nhieät ñoä10/100 Ethernet PHYMaø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 outBus PCI 32bit,33-MHZ (3,3V vaø 5V)PCI mezzanine connectors (PMCs)PCI bridge ñeå keát noái 2 PC cards vaø FireWire

Page 315: PIC_ BAI GIANG

VIRTEX-II PRO PLATFORM FPGALoaïi Virtex-II Pro Platform FPGA söû duïng treân board cuûa ML300 laø 2VP7,

FF672 . Goàm:Boä xöû lyù PowerPC 4058 boä truyeàn thoâng ña bit (MGTs)396 ngoõ I/O4 boä quaûn lyù xung soá (DCMs)Khoaûng 5000 phaàn töû logicKhoaûng 800Kb cho khoái SelectRAM (BRAM)44 boä nhaân (multipliers) 18x18PowerPC 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 .

Page 316: PIC_ BAI GIANG

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

Page 317: PIC_ BAI GIANG

Clocking Outputs to 2VP7

Signal Name 2VP7 PinPS2_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

Page 318: PIC_ BAI GIANG

Pinout of R14K-ST11 Gigabit Fiber TransceiverPin Number

Symbol Description Logic family

GP GP Grounding Posts Connect to signal ground N/A1,11,21,31 TD+ Transmitter DATA In LVPECL2,12,22,32 VEETX Transmitter Signal ground N/A3,13,23,33 TD- Transmitter DATA In LVPECL4,14,24,34 VCCTX Transmitter Power supply N/A5,15,25,35 SD Signal Detect Satafactory Optical Input : Logic

“1” Output Fault Condition : Logic “0” OutputLVTTL

6,16,26,36 TDIS Transmit Disable LVTTL7,17,27,37 RD+ Receiver DATA Out LVPECL8,18,28,38 VCCRX Receiver Power supply N/A9,19,29,39 RD- Receiver DATA Out LVPECL10,20,20,40 VEERX Receiver Signal ground N/A

Page 319: PIC_ BAI GIANG

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

Signal Name2VP7 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

Page 320: PIC_ BAI GIANG

PHAÀN MEÀM THIEÁT KEÁ

GIÔÙI THIEÄUChöô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ânthieän vôùi ngöoøi söû duïng, giuùp chuùng ta coù theå thieát laäp moät heä thoángbaè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öùcnaê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ûichaï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 )

Page 321: PIC_ BAI GIANG

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 :

Page 322: PIC_ BAI GIANG

- 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ünTa 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öôngtrình seõ töï taïo ra moät file system.xmp trong thö muïc ñoù OK

Page 323: PIC_ BAI GIANG

ÔÛ 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öõngkit 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ângvôù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

Page 324: PIC_ BAI GIANG

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ønlaïi coù theå boû qua . Ñaàu tieân choïn RS232_Uart1 vaø boû RS232_Uart2 Next

Page 325: PIC_ BAI GIANG

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 vinhö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 ñöôïcnhöõ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ùcnhau . 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

Page 326: PIC_ BAI GIANG

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

Page 327: PIC_ BAI GIANG

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

Page 328: PIC_ BAI GIANG

VD; ñoaïn code ñôn giaûn veà vieäc duøng nuùt nhaán ñeå ñieàu khieån saùng taétcuû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;

}

Page 329: PIC_ BAI GIANG

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

Page 330: PIC_ BAI GIANG

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 raSöû 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ø driverSöû 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øonhöõng ñònh nghóa I/O vaøo phaàn treân cuûa fileSöû duïng coâng cuï Creat and Import Peripheral Wizard (import mode) trongEDK ñeå taïo laïi giao dieän cho ngoaïi vi neáu caàn thieátMôû XPS duøng coâng cuï Add/Edit Core Dialog ñeå theâm vaøo thieát bò ngoaïi vi tavöøa taïo xong vaøo heä thoáng ñaõ xaây döïng ôû böôùc 1Duø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ànthieát cho caû thieát bò ngoaïi vi ta vöøa taïoSöû 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 .

Page 331: PIC_ BAI GIANG

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 EDKBÖÔÙC 2 :

Page 332: PIC_ BAI GIANG

ÔÛ ñ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öôøiduøng Next

Page 333: PIC_ BAI GIANG

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ângthöôø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

Page 334: PIC_ BAI GIANG

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ö xungtimer, chaân reset, chaân döõ lieäu, chaân ñòa chæ, interrupt….. Next

Page 335: PIC_ BAI GIANG

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ïcchöù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ïcdrivers 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)

Page 336: PIC_ BAI GIANG

Theâm vaøo nhöõng chaân maø ta muoán söû duïng vaøo phaàn port vôùi caáutruù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

Page 337: PIC_ BAI GIANG

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

Page 338: PIC_ BAI GIANG

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øngtrong caùcï moâ taû gioáng nhau .

Page 339: PIC_ BAI GIANG

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ôùicaù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ùcCAE 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äphôï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ânhoaëc hoãn hôïp .

Page 340: PIC_ BAI GIANG

+ 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öùccoå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íchthöôù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äntoá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åutöø 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óamoâ 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 .

Page 341: PIC_ BAI GIANG

Ñoái vôùi moâ taû moät baøi toùan, VHDL cung caáp 5 kieåu khaùc nhau cuûathieá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.

Page 342: PIC_ BAI GIANG
Page 343: PIC_ BAI GIANG