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