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.