Ðề tài: Pvn Tiny Bootloader
View Single Post
Old 25-05-2006, 07:40 PM   #12
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
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.
__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn