5. Các thao tác khi sử dụng Tiny Bootloader
Ta đã có được mạch Tiny Bootloader và mạch ứng dụng tương thích với Tiny Bootloader. Từ “tương thích” được nhấn mạnh lại ở đây. Để nạp được chương trình vào vi điều khiển PIC dùng Tiny Bootloader, ta tiến hành lần lượt các bước sau:
- Bước 1: Sử dụng mạch nạp để nạp chương trình Tiny Bootloader vào vi điều khiển trước.
- Bước 2: Kết nối Tiny Bootloader với máy tính và kết nối cáp dữ liệu của Tiny Bootloader với mạch ứng dụng. Cấp nguồn cho mạch ứng dụng.
- Bước 3: Khởi động chương trình tinybld19 và thiết lập các thông số cần thiết.
- Bước 4: Đưa chương trình mới vào vi điều khiển.
Sau đây là quá trình tiến hành cụ thể của các bước trên.
Bước 1:
Ta cần một mạch nạp cho vi điều khiển PIC16F877A (đây là vi điều khiển sử dụng cho mạch test) và nạp chương trình Tiny Bootloader vào vi điều khiển trước. Chương trình Tiny Bootloader được cung cấp trong phần mềm “tinybld191”, cụ thể là chương trình
"…\TINYBLD\picsource\16f\tinybld16F.asm" và chỉnh sửa lại các thông số cần thiết trong chương trình. Sau đây là chương trình được chỉnh sửa
(phần chỉnh sửa là phần đươc tô màu đỏ):Cần chú ý là trong mạch ứng dụng sử dụng loại thạch anh có tần số bao nhiêu thì phải điều chỉnh một cách thích hợp trong firmware của Tiny Bootloader. Ngoài ra có thể tìm thấy các firmware tương ứng cho ứng dụng trên các phương tiện thông tin khác, đặc biệt là Internet.
Code:
;=========================================================
; Chương trình Firmware viết cho vi điều khiển PIC16F877A khi sử
; dụng Tiny Bootloader
; Chương trình này được này trước vào vi điều khiển PIC để sử dụng phần mềm
; tinybld cho việc cập nhật chương trình mới; Tốc độ baud 19200, sử dụng thạch anh 20 MHz.
;=========================================================
radix DECLIST P=16F877A
; change also: Configure->SelectDevice from Mplab
include <p16f877a.inc>
xtal EQU 20000000
; you may also want to change: _HS_OSC _XT_OSCbaud EQU 19200
; standard TinyBld baud rates: 115200 or 19200
; The above 3 lines can be changed and buid a bootloader for the
; desired frequency (and PIC type)
;********************************************************************
; Tiny Bootloader 16FxxxA series Size=100words
; claudiu.chiculita@ugal.ro
; [url]http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
;********************************************************************
#include "E:\MPLAB\tinybld19\picsource\icdpictypes.inc"
#include "E:\MPLAB\tinybld19\picsource\spbrgselect.inc"
#include "E:\MPLAB\tinybld19\picsource\bankswitch.inc"
; #include "../icdpictypes.inc"
;takes care of: #include "p16fxxxA.inc", ; max_flash, IdTypePIC
; #include "../spbrgselect.inc"
; #include "../bankswitch.inc"
#define first_address max_flash-100
; 100 word in size
; __CONFIG _HS_OSC & _CP_OFF & _WDT_OFF & _BODEN_ON&_PWRTE_ON & _LVP_OFF & _DEBUG_OFF
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
errorlevel 1, -305
; suppress warning msg that takes f as default
cblock 0x20
buffer:80
endc
cblock 0x78
crccontor
i
cnt1
cnt2
cnt3
flag
endc
SendL macro car
movlw car
movwf TXREG
endm
;0000000000000000000000000 RESET 00000000000000000000000000
ORG 0x0000
PAGESEL IntrareBootloader
GOTO IntrareBootloader ;view with TabSize=4
;&&&&&&&&&&&&&&&& START &&&&&&&&&&&&&&&&&
;---------------------- Bootloader ----------------------;
;PC_flash: C1h AddrH AddrL nr ...(DataLo DataHi)... crc
;PIC_response: id K K
ORG first_address
nop
nop
nop
nop
org first_address+4
IntrareBootloader ;init serial port
clrf STATUS
bsf STATUS,RP0 ;BANK1_
movlw b'00100100'
movwf TXSTA
movlw spbrg_value
movwf SPBRG
BANK0_
movlw b'10010000'
movwf RCSTA ;wait for computer
call Receive
sublw 0xC1 ;Expect C1
skpz
goto way_to_exit
SendL IdTypePIC ;PIC type
;SendL IdSoftVer ;firmware ver x
MainLoop
clrf STATUS ;bank0
SendL 'K'
mainl
clrf crc
call Receive ;H
bsf STATUS,RP1 ;bank2
movwf EEADRH
movwf flag ;used to detect if is eeprom
call Receive ;L
bsf STATUS,RP1 ;bank2
movwf EEADR
call Receive ;count
movwf contor
movwf i
incf i
movlw buffer-1
movwf FSRrcvoct
call Receive
incf FSR
movwf INDF
decfsz i
goto rcvoct
movf crc,f ;check checksum
skpz
goto ziieroare ;write
bsf STATUS,RP1 ;bank switch 0->2
movlw buffer
movwf FSR
writeloop ; write 2 bytes = 1 instruction
clrwdt
movf INDF,w
movwf EEDATA
incf FSR
movf INDF,w
movwf EEDATH
incf FSR
BANK3_ ;bank 2->3
bcf EECON1,EEPGD
btfss flag,6 ;is eeprom (or flash)
bsf EECON1,EEPGD
bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1,WR
nop
nop
waitwre
btfsc EECON1,WR ;for eeprom writes (wait to finish write)
goto waitwre
bcf EECON1,WREN
BANK2_ ;bank2
incf EEADR ; does not cross zones
btfss flag,6 ; if writing to EEPROM, skip first counter dec.
decf contor
decfsz contor
goto writeloop
goto MainLoop
ziieroare
SendL 'N'
goto mainl
Receive
clrf STATUS
movlw xtal/1000000+1 ; for 20MHz => 11 => 1second
movwf cnt1r
pt2
clrf nt2r
pt3
clrf cnt3
rptc
btfss PIR1,RCIF ;test RX
goto $+4
movf RCREG,w ;return in W
addwf crc,f ;compute checksum
return
clrwdt
decfsz cnt3
goto rptc
decfsz cnt2
goto rpt3
decfsz cnt1
goto rpt2 ;timeout:
way_to_exit ;exit in all other cases; must be BANK0/1
;BANK0_
bcf RCSTA,SPEN ; deactivate UART
goto first_address
;*************************************************************
; After reset; Do not expect the memory to be zero,
; Do not expect registers to be initialised like in catalog.
END
;==============================================================
Chỉ chỉnh sửa các thông số ở phần đầu chương trình, sau đó biên dịch và nạp vào vi điều khiển.
Bước 2: chỉ cần kết nối đúng thứ tự các chân giữa Tiny Bootloader và mạch ứng dụng.
Bước 3: khởi động chương trình Tiny Bootloader và thiết lập các thông số cần thiết (tốc độ baud, cổng giao tiếp, …)
Hình 6: Nhấn nút “Brouse” để đưa file hex cần nạp vào chương trình.
Hình 7: Vào thẻ “Option”, chon chế độ “Reset PIC using RTS line”.
Bước 4: Nhấn nủt “Write Flash” để nạp chương trình đã chọn vào vi điều khiển
Hình 8: Bấm nút “Write Flash” để đưa chương trình vào vi điều khiển.