Ðề tài: Pvn Tiny Bootloader
View Single Post
Old 25-05-2006, 10:23 PM   #11
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
6. Một số vấn đề thường gặp khi sử dụng Tiny Bootloader

Trên đây là các bước để test mạch Tiny Bootloader, đồng thời cũng là các thao tác cơ bản được tiến hành một cách tuần tự khi sử dụng Tiny Bootloader. Tuy nhiên khi sử dụng Tiny Bootloader trong thực tế, ta thường gặp phải một số vấn đề như sau:

6.1. Chương trình ứng dụng tương thích với firmware của Tiny Bootloader.
Như ta đã biết, chương trình firmware có nhiệm vụ tạo một thời gian chờ tín hiệu cập nhật chương trình mới từ máy tính. Nếu phát hiện được tín hiệu trên, chương trình firmware sẽ làm nhiệm vụ nhận chương trình mới và ghi vào bộ nhớ chương trình, sau đó thực thi chương trình mới đó. Nếu sau khoảng thời gian chờ mà không phát hiện được tín hiệu trên, firmware Tiny Bootloader sẽ điều khiển bộ đếm chương trình nhảy đến vị trí chương trình cũ và bắt đầu thực thi chương trình cũ.

Để làm được cả hai công việc đó, firmware Tiny Bootloader sẽ phải thực hiện một số thay đổi lên chương trình ứng dụng. Hình sau cho phép hình dung rõ hơn những thao tác đó.



Hình 9: Các thao tác làm thay đổi cấu trúc chương trình ứng dụng của Tiny Bootloader.
Firmware Tiny Bootloader sẽ cắt 4 word đầu tiên (từ địa chỉ 0000h đến 0003h) ở phần reset vector của chương trình ứng dụng và đặt nó ở ngay trên chương trình chính của Tiny Bootloader, thay vào đó là 4 word đầu tiên của firmware Tiny Bootloader để điều khiển bộ đếm chương trình nhảy đến vị trí chương trình chính của firmware Tiny Bootloader.

Với việc cấu trúc lại chương trình như vậy, quá trình thực thi chương trình của vi điều khiển sẽ có chút thay đổi như trên hình vẽ. Khi được reset, bộ đếm chương trình của PIC sẽ nhảy đến vị trí của reset vector, ở đó các lệnh của firmware sẽ điều khiển bộ đếm chương trình nhảy đến vị trí có chương trình chính của firmware Tiny Bootloader. Khi chương trình này được thực thi xong, bộ đếm chương trình sẽ quay trở về vị trí 4 word đầu tiên của chương trình ứng dụng được đặt ngay trên chương trình chính của firmware Tiny Bootloader.

Ngoại trừ các word đầu tiên đặt vào phần reset vector, phần còn lại của chương trình firmware được đặt ở phần cuối cùng của bộ nhớ chương trình. Khi muốn thực thi chương trình ứng dụng, bộ đếm chương trình phải nhảy trở lại vị trí của chương trình ứng dụng. Thông thường, thao tác nhảy này được thực hiện bởi lệnh “GOTO”. Tuy nhiên trong trường hợp này, khoảng cách nhảy là rất xa và vượt ra khỏi tầm nhảy của lệnh “GOTO”, cho nên việc cập nhật các bit cao cho bộ đếm chương trình phải được thực hiện (firmware Tiny Bootloader không thực hiện công việc này cho người sử dụng).

Bộ đếm chương trình có dung lượng 13 bit và giá trị bộ đếm được chứa trong các thanh ghi PCH và PCL. Thanh ghi PCL chứa 8 bit thấp cho phép các thao tác trực tiếp như các thanh ghi bình thường. Thanh ghi PCH chứa 5 bit cao còn lại, việc thao tác trên thanh ghi này phải thao tác thông qua thanh ghi PCLATH.

Như vậy, dựa vào vị trí bắt đầu của chương trình chính, ta phải đưa các giá trị thích hợp vào thanh ghi PCLATH để điều khiển bộ đếm chương trình nhảy đến vị trí đó. Thao tác này phải được thực hiện trong 4 word đầu tiên của chương trình ứng dụng.

Sau đây là ví dụ cụ thể. Phần thay đổi so với các chương trình bình thường được tô màu đỏ trong đoạn chương trình sau:

Code:
;=====================================================================
; Một ví dụ cho việc thay đổi chương trình ứng dụng phù hợp với
; Firmware của Tiny Bootloader
        processor  	16f877a			
        include	<p16f877a.inc>		
        __CONFIG	_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &  _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
;=====================================================================
;--------------------------------------
; Khai báo biến
;--------------------------------------
delay_reg1	EQU	0x20			
delay_reg2	EQU	0x21	
;=====================================================================
;       CHƯƠNG TRÌNH CHÍNH	
        ORG	0x000				
        CLRF	STATUS	; đây là phần xử lí thanh ghi PCLATH	
        MOVLW	0x00	
        MOVWF	PCLATH	
        GOTO	start
;=====================================================================
start	
	BCF	  STATUS,RP1	
             BSF	  STATUS,RP0	

 	CLRF	  TRISB	
	
             BCF	  STATUS,RP0	
	
loop 
             MOVLW	  0x8F				
             MOVWF	  PORTB			
             CALL	  delay100ms	
             CALL	  delay100ms	

             CLRF	  PORTB	
             CALL	  delay100ms	
             CALL	  delay100ms	
             GOTO	  loop
;=====================================================================
; CHƯƠNG TRÌNH CON
;=====================================================================
;------------------------------------------------------------------------
; Chương trình con tạo thời gian delay 100ms
;------------------------------------------------------------------------

delay100ms	
            MOVLW	0x83	
            MOVWF	delay_reg1	
            MOVLW	0xFF	
            MOVWF	delay_reg2loop1	
            DECFSZ	delay_reg1	
            GOTO	loop2	
            GOTO 	exitloop2 	
            DECFSZ	delay_reg2	
            GOTO	loop2	
            GOTO	loop1	
	
exit	
            RETURN

            END
;=====================================================================
Ví dụ trên khá đơn giản. Do chương trình ứng dụng rất ngắn và đơn giản, nên ta có thể dễ dàng xác định được vị trí bắt đầu của chương trình chính nằm ở trong các word đầu của bộ nhớ chương trình, cho nên thao tác đối với thanh ghi PCLATH trong trường hợp này sẽ là xóa thanh ghi PCLATH.

Trong các ứng dụng phức tạp hơn không cho phép ta đặt chương trình chính ở các word đầu (ví dụ như chương trình ngắt quá dài, bảng dữ liệu đặt ở phần đầu chương trình quá lớn, các chương trình con được viết trước chương trình chính khá dài, …), cần xác định lại vị trí bắt đầu của chương trình chính để có các thao tác xử lí thích hợp với thanh ghi PCLATH.

6.2. Tính ổn định của Tiny Bootloader

Nếu thiết kế và test mạch theo các trình tự đã nêu, ta có thể thấy được việc nạp chương trình thành công như trong hình 6.

Việc sử dụng chức năng “Reset In Program” cho phép cải thiện đáng kể tính ổn định của Tiny Bootloader so với khi reset bằng tay.

Tuy nhỉên trong quá trình tiến hành có thể gặp nhiều trở ngại, chẳng hạn như tính thiếu ổn định của Tiny Bootloader (lúc dectect được PIC, lúc không,…). Điều này đặt ra yêu cầu cải thiện thêm tính ổn định của Tiny Bootloader. Ta có thể khắc phục bằng 2 phương pháp:

- Tăng thời gian “SearchDelay” của chương trình trên máy tính (thẻ Option):



Hình 10: Tăng thời gian “SearchDelay”

- Tăng thời gian delay trong firmware: sửa lệnh “movlw xtal/2000000+1” của firmware Tiny Bootloader nạp vào PIC thành lệnh “movlw xtal/1000000+1”.
__________________


thay đổi nội dung bởi: ntc, 07-06-2006 lúc 03:22 PM.
ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn