PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Tiny Bootloader (http://www.picvietnam.com/forum/forumdisplay.php?f=67)
-   -   Pvn Tiny Bootloader (http://www.picvietnam.com/forum/showthread.php?t=439)

ntc 25-05-2006 03:48 PM

PVN Tiny Bootloader
 
Đây là kết quả sau một thời gian dài miệt mài về Tiny Bootloader.

Nhận thấy đây là một công cụ đắc lực cho việc phát triển vi điều khiển PIC, chúng tôi đã làm việc hết sức nghiêm túc để đưa ra cho các bạn sản phẩm tốt nhất trong khả năng của PICVIETNAM.

Rất trùng hợp, mọi công việc đã được hoàn tất ngay vào ngày sinh nhật của PICVIETNAM, nên cũng có thể xem đây là món quà nho nhỏ PICVIETNAM mong muốn gửi tặng đến tất cả các thành viên, đến những ai đã quan tâm và dành những tình cảm tốt đẹp cho PICVIETNAM. Đó cũng là điều mà PICVIETNAM mong muốn nhận được trong ngày sinh nhật của mình, cũng như trong những ngày bình thường khác (đừng quên tham gia chúc mừng sinh nhật PICVIETNAM tối nay nhé :D).

ntc 25-05-2006 04:01 PM

Sơ lược về quá trình tìm hiểu và phát triển công cụ Tiny Bootloader
 
Có thể nói là một khoảng thời gian tương đối dài. :D. Bắt đầu từ những thông tin cơ bản nhất, chúng tôi đã dần phát triển và nâng cấp công cụ này qua 3 phiên bản.

Phiên bản PVN Tiny Bootloader Version 1.0 : phiên bản dựa hoàn toàn trên mạch nguyên lí ban đầu của Tiny Bootloader. Phiên bản này tuy cho phép đưa chương trình mới vào vi điều khiển nhanh chóng và tin cậy, nhưng vẫn có một số hạn chế nhất định như phải nhấn nút reset bằng tay, chưa thực sự ổn định, ...

Phiên bản PVN Tiny Bootloader Version 2.0 : có thêm một số cải tiến cho phép reset bằng chương trình, không cần phải nhấn nút reset, nâng cao độ ổn định và mang lại nhiều thuận tiện hơn cho người sử dụng. Chúng tôi sẽ phổ biến phiên bản này trong các bài viết tiếp theo.

Phiên bản PVN Tiny Bootloader Veioon 3.0: đây là sản phẩm thương mại của PICVIETNAM dựa hoàn toàn trên những cải tiến của phiên bản PVN Tiny Bootloader Version 2.0, tuy nhiên nó được thiết kế nhỏ gọn và mang tính thẩm mỹ cao, cho phép bỏ toàn bộ mạch vào vỏ của cổng COM và được thiết kế theo chuẩn mới của PICVIETNAM.

Xin gửi lời cảm ơn chân thành đến anh Đoàn Hiệp, anh Nguyễn Quang Nam, anh Doãn Minh Đăng, anh BinhAnh và các thành viên nhóm PIC tp HCM đã giúp em hoàn thành sản phẩm này.

ntc 25-05-2006 04:10 PM

PVN Tiny Bootloader Version 2.0
 
TÓM TẮT NỘI DUNG:

Báo cáo kết quả tìm hiểu mạch nạp Tiny Bootloader cho vi điều khiển PIC, bao gồm các nội dung:

- Sơ lược về Tiny bootloader

- Thiết kế và thi công Tiny Bootloader.

- Chương trình viết cho vi điều khiển khi dùng Tiny Bootloader để nạp.

- Test mạch Tiny Bootloader.

- Một số phương pháp nhằm nâng cao tính ổn định của Tiny Bootloader.


1. Sơ lược về Tiny bootloader

Tiny Bootloader là một chương trình được đưa trước vào vi điều khiển thông qua một mạch nạp. Chương trình này có nhiệm vụ giao tiếp với máy tính (thông qua một phần mềm điều khiển trên máy tính) để nhận chương trình mà người sử dụng muốn nạp vào vi điều khiển và ghi chương trình đó vào bộ nhớ chương trình của vi điều khiển. Như vậy Bootloader cho phép ta thay đổi chương trình trong vi điều khiển một cách dễ dàng thông qua máy tính.

Firmware Tiny Bootloader cho vi điều khiển PIC có các đặc tính sau:

- Dung lượng chương trình bootloader nhỏ (ít hơn 100K word bộ nhớ chương trình).

- Sử dụng cho các dòng PIC16F, PIC18F và dsPIC (bao gồm các vi điều khiển có hỗ trợ chế độ tự nạp chương trình).

Phiên bản mới nhất của chương trình Tiny Bootloader là phiên bản tinybld191 với các đặc tính:

- Cho phép đưa chương trình của người sử dụng vào bộ nhớ flash của vi điều khiển.

- Hỗ trợ cho các dòng PIC16F, PIC18F và dsPIC, có khả năng tự phát hiện loại vi điều khiển PIC người sử dụng muốn đưa chương trình vào. Có khả năng ghi nhớ các chế độ thiết lập của lần sử dụng sau cùng.

- Trong trường hợp quá trình truyền nhận bị lỗi, chương trình sẽ được tự động truyền lại hoặc cho phép tự đồng bộ giữa vi điều khiển và máy tính.

- Cho phép thiết lập tốc độ baud và các thiết lập khác cho việc giao tiếp giữa máy tính và vi điều khiển.

Tiny Bootloader phiên bản mới “tinybld191” còn hỗ trợ thêm chế độ “Reset In Program” sử dụng chân RTS của cổng COM. Tuy nhiên chức năng Reset yêu cầu một mạch hỗ trợ khá phức tạp trên mạch ứng dụng. Ta có thể vẫn sử dụng chức năng tự động reset này mà không cần phần mạch hỗ trợ trên bằng cách cải tiến thêm một số điểm trong sơ đồ nguyên lí mạch nạp. Phần này sẽ được trình bày kĩ hơn khi đề cập đến sơ đố nguyên lí của Tiny Bootloader.

Thực chất ta có thể xem bootloader dành cho vi điều khiển PIC là một chương trình assembly bình thường được xây dựng với nhiệm vụ chờ tín hiệu điều khiển từ chương trình của máy tính trong vòng 1 giây kể từ thời điểm vi điều khiển được reset. Nếu trong vòng một giây có tín hiệu từ máy tính gửi đến vi điều khiển, chương trình bootloader sẽ ra lệnh cho vi điều khiển cập nhật chương trình mới. Trong trường hợp không có tín hiệu nào nhận được, chương trình cũ vẫn tiếp tục được thực thi bình thường. Đây cũng là một đặc điểm quan trọng của bootloader dành cho vi điều khiển PIC. Ngoài ra chương trình asm của bootloader cũng có thể dễ dàng được chỉnh sửa cho phù hợp với tốc độ truyền nhận và mục đích của người sử dụng.

ntc 25-05-2006 04:48 PM

2. Mạch Tiny bootloader

2.1. Chức năng của mạch Tiny bootloader dành cho vi điều khiển PIC

Ta đã có sẵn các chương trình giao tiếp (của máy tính cũng như của vi điều khiển). Tuy nhiên để quá trình truyền nhận dữ liệu thực hiện được ta cần thiết kế thêm một mạch giao tiếp giữa máy tính và vi điều khiển thông qua một chuẩn giao tiếp nào đó. Đó cũng chính là nhiệm vụ của mạch Tiny bootloader. Thực chất có thể hiểu đây chỉ là một mạch giao tiếp đơn thuần.

2.2. Sơ đồ nguyên lí mạch Tiny bootloader

Mạch nguyên lí trong hình 1 được sử dụng để giao tiếp giữa máy tính với vi điều khiển PIC thông qua chuẩn giao tiếp RS232.

Tại ngõ vào của mạch Tiny bootloader ta sử dụng IC MAX232 để thực hiện việc chuyển đổi điện áp của tín hiệu ngõ ra cổng nối tiếp (cổng COM) của máy tính (+10V và –10V) sang điện áp của dạng tín hiệu thông thường (0V và 5V) theo chuẩn giao tiếp RS232. Ngõ ra của mạch sẽ là các tín hiệu TX và TX được nối vào các chân tương ứng của vi điều khiển PIC. Nguồn cung cấp (5V và GND) được lấy trực tiếp từ mạch ứng dụng của vi điều khiển PIC để đưa vào mạch Tiny bootloader, như vậy ta không cần thiết kế thêm nguồn cung cấp riêng cho mạch.

Sơ đồ nguyên lí mạch Tiny Bootloader nguyên thủy (không có chức năng “Reset In Program”) sử dụng 3 chân GND, TX và TX của cổng COM được trình bày trong hình 1.

http://i65.photobucket.com/albums/h2...NGUYENTHUY.jpg

Hình 1 : Sơ đồ nguyên lí mạch Tiny Bootloader nguyên thủy.

Để tận dụng tính năng “Reset In Program”, ta tiến hành cải tiến sơ đồ nguyên lí mạch ở hình 1 như sau: nối chân RTS của cổng COM với một ngõ vào của MAX232, và nối ngõ ra tương ứng của chân đó với chân MCLR* của vi điều khiển PIC. Khi Chương trình “tiny Bootloader” được cho phép hoạt động, chân RTS của cổng COM sẽ được kéo lên mức logic cao, và theo nguyên lí hoạt động của MAX232, mức logic của chân ngõ ra tương ứng với ngõ vào đó sẽ ngược với mức logic của ngõ vào, điều này có nghĩa chân MCLR* của PIC được đưa về mức logic 0 và vi điều khiển được reset. Sơ đồ nguyên lí cụ thể của mạch Tiny Bootloader cải tiến được trình bày trong hình 2.

http://i65.photobucket.com/albums/h2...BLDCAITIEN.jpg

Hình 2 : Sơ đồ nguyên lí mạch Tiny Bootloader cải tiến.

Các hoạt động tiếp theo sau đó là hoạt động truyền nhận các word chương trình giữa máy tính và vi điều khiển. Hoạt động này là sự phối hợp giữa chương trình Tiny Bootloader trên máy tính và firmware Tiny Bootloader được nạp vào vi điều khiển trước đó. Máy tính có nhiệm vụ truyền dữ liệu cho vi điều khiển, còn chương trình firmware chịu trách nhiệm việc ghi dữ liệu đó lên bộ nhớ chương trình, tổ chức sắp xếp một cách hợp lí để chương trình nạp vào có thể hoạt động bình thường, đồng thời cho phép kích hoạt firmware Tiny Bootloader khi vi điều khiển được reset.

ntc 25-05-2006 06:27 PM

3. Thi công mạch Tiny Bootloader.

Yêu cầu đặt ra cho mạch thi công bao gồm:

- Bảo đảm thứ tự các chân ngõ ra theo đúng chuẩn qui định của PICVIETNAM.

- Mạch đơn giản, gọn nhẹ, không cần sử dụng nguồn cung cấp riêng cho mạch Tiny Bootloader..

- Đạt yêu cầu về tính thẩm mỹ.

- Có hộp bao bọc mạch Tiny Bootloader.

- Hộp bao bọc sử dụng trong truờng hợp này là vỏ cổng LPT do các nguyên nhân:

- Đáp ứng được kích thước của mạch PCB.

- Đạt yêu cầu về thẩm mỹ.

(Không phổ biến hình này vì không đúng chuẩn ICSP BLD của picvietnam)

Hình 3: Sơ đồ mạch in Tiny Bootloader Version 2.0

Mạch in được thiết kế như hình trên cho phép ta bỏ lọt Tiny Bootloader vào vỏ nhựa của cổng song song (DB25). Như vậy việc thiết kế vỏ hộp cho Tiny Bootloader đã được giải quyết. Giải pháp này không quá phức tạp nhưng hiệu quả, vừa đem lại tính thẩm mỹ cho Tiny Bootloader, vừa bảo đảm tính an toàn trong quá trình sử dụng (tránh bị điện giật!).

Chú ý chân NC (Not Connected) trong trường hợp này được thêm vào chỉ để cho đủ 6 chân do đăc điểm thị trường linh kiện không có loại jack 6. Việc thêm vào chân NC cho phép tạo nhiều thuận lợi trong quá trình thiết kế và thi công mạch, tạo sự thuận tiện trong quá trình sử dụng. Ngoài ra chân này không còn vai trò hay chức năng nào khác.

Ngõ vào của mạch bao gồm các tín hiệu TX, TX và GND từ cổng COM và các chân VDD, VSS dùng để cấp nguồn cho Tiny Bootloader. Ngõ ra là các tín hiệu TX, RX từ cổng COM và tín hiệu từ chân R2OUT* của MAX232 được nối vào các chân tương ứng của vi điều khiển PIC.

Phần mạch chính của Tiny Bootloader bao gồm IC MAX232 và các tụ DC có giá trị 1uF/50V. Các phần còn lại được kết nối thông qua các dây nối. Mô hình cụ thể của Tiny Bootloader như sau:

http://i65.photobucket.com/albums/h2..._ntc/hinh4.jpg

Hình 4: Mô hình mạch Tiny Bootloader.

Các khoảng cách nêu trên chỉ mang tính chất tham khảo. Phần cáp nối về cổng COM cho phép nối dài trên 1m (phần này điện áp truyền trên đường dây là +(-) 10 V nên cho phép truyền đi xa tốt hơn). Việc nối dài các đoạn cáp như vậy cho phép ta kết nối và sử dụng Tiny Bootloader thuận tiện hơn. Tuy nhiên ta chỉ nên kéo dài phần cáp kết nối từ cổng COM đến Tiny Bootloader.

Việc tự thiết kế cáp nối vào cổng COM đính kèm vào Tiny Bootloader cho phép tạo nhiều thuận tiện hơn khi sử dụng Tiny Bootloader, tuy nhiên để sản phẩm đạt được yêu cầu về thẩm mỹ, cần trải qua công đoạn thiết kế kiểu mẫu cho mạch. Do đó để nối dài cổng COM, ta sử dụng cáp chuyên dụng, khi đó Tiny Bootloader chỉ còn là một sản phẩm gọn nhẹ như các hình được trình bày ở phần sau.

falleaf 25-05-2006 06:36 PM

Em lưu ý, phiên bản này là phiên bản version 2, mạch in này chúng ta không phổ biến nữa, anh tạm xoá bớt phần mạch in này của em đi. Khi nào có hình sản phẩm hoàn thiện theo đúng version 3, chuẩn box header 5x2, thì chúng ta mới post lên. Em đem qua chỗ anh Đăng để chụp hình lại.

Chúc vui.

falleaf 25-05-2006 06:40 PM

Cái hình mạch nguyên lý cải tiến, em post lại cái hình to lên cho mọi người xem, em làm nó có chút téo thế thì ai mà xem nổi?

Chúc vui.

ntc 25-05-2006 06:44 PM

4. Thiết kế mạch ứng dụng tương thích với mạch Tiny bootloader

Để sử dụng được mạch Tiny Bootloader có sơ đồ nguyên lí được trình bày ở phần trên, thì ở phần mạch ứng dụng, ta phải thêm vào một jack kết nối giữa mạch ứng dụng và mạch Tiny Bootloader. Jack này bao gồm các đường VDD, VSS để cấp nguồn cho mạch Tiny Bootloader và các đường tín hiệu TX, RX, MCLR*.

PICVIETNAM khuyến cáo việc thiết kế jack nối giữa Tiny Bootloader và mạch ứng dụng có thứ tự chân như hình 5. Thứ tự cụ thể như sau:

- MCLR
- VDD
- VSS
- TX
- RX

Đây cũng là chuẩn thiết kế các mạch ứng dụng của PICVIETNAM sử dụng mạch Tiny Bootloader. Tính hiệu quả của chuẩn này đã được PICVIETNAM kiểm định qua một quá trình chuẩn hóa và đưa vào ứng dụng trong thực tế.
Việc thiết kế theo chuẩn như vậy mang lại nhiều thuận lợi cho quá trình thiết kế ứng dụng và sử dụng công cụ Tiny Bootloader. Mạch Tiny Bootloader có thể nói là một công cụ đắc lưc đã đựoc thiết kế cố định và sử dụng lâu dài, do đó nếu việc thiết kế jack nối trong các mạch ứng dụng không đồng nhất sẽ dẫn đến tình trạng một mạch ứng dụng không tương thích với Tiny Bootloader, như vậy công cụ Tiny Bootloader trong trường hợp này xem như không có tác dụng, và muốn sử dụng được công cụ Tiny Bootloader, cách duy nhất là phải thiết kế một mạch Tiny Bootloader khác tương thích với mạch ứng dụng đó. Điều này là bất hợp lí và mang lại nhiều trở ngại không mong muốn.


http://i65.photobucket.com/albums/h2..._ntc/hinh5.jpg

Hình 5: Sơ đồ nguyên lí mạch test Tiny Bootloader. Phần mạch giao tiếp với Tiny Bootloader được tô màu xám.

ntc 25-05-2006 07:40 PM

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, …)

http://i65.photobucket.com/albums/h2..._ntc/hinh6.jpg

Hình 6: Nhấn nút “Brouse” để đưa file hex cần nạp vào chương trình.

http://i65.photobucket.com/albums/h2..._ntc/hinh7.jpg

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

http://i65.photobucket.com/albums/h2..._ntc/hinh8.jpg

Hình 8: Bấm nút “Write Flash” để đưa chương trình vào vi điều khiển.

ntc 25-05-2006 08:06 PM

Mệt quá. Tí viết tiếp.

ntc 25-05-2006 10:23 PM

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 đó.

http://i65.photobucket.com/albums/h2...bootloader.png

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):

http://i65.photobucket.com/albums/h2...ntc/HINH10.jpg

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

ntc 25-05-2006 10:26 PM

7. Kết luận

Tiny bootloader là chương trình dùng để giao tiếp với máy tính được nạp trước vào vi điều khiển nhằm mục đích cập nhật chương trình mới cho vi điều khiển từ máy tính.

Mạch Tiny bootloader được mạch dùng để giao tiếp giữa máy tính và vi điều khiển thông qua chuẩn giao tiếp RS232.

Ngoài tác dụng nạp chương trình mới cho vi điều khiển, mạch Tiny bootloader và chương trình của Tiny bootloader còn có thể được thay đổi và chỉnh sửa dễ dàng để sử dụng cho mục đích giao tiếp giữa máy tính và vi điều khiển PIC thông qua chuẩn giao tiếp RS232.

Tiny bootloader là một trong số những công cụ mà nhà sản xuất hỗ trợ cho việc thay đổi chương trình trong vi điều khiển PIC mà không cần tháo vi điều khiển ra khỏi mạch. Điều này giúp ta linh động hơn và có nhiều hơn sự lựa chọn trong việc xây dựng và nâng cấp các ứng dụng sử dụng vi điều khiển PIC, đặc biệt là khi việc tháo hoặc gắn vi điều khiển ra khỏi mạch gặp nhiều khó khăn (chẳng hạn như khi ta sử dụng vi điều khiển PIC loại chip dán).

Ưu điểm:

- Thời gian nạp rất nhanh, thông thường là chưa đầy 1 giây.

- Hỗ trợ nhiều dòng PIC.

- Rất thuận tiện cho người sử dụng.

- Độ tin cậy cao.

- Tính an toàn được cải thiện đáng kể, tránh tình trạng làm chết vi điều khiển trong quá trình thao tác với các mạch nạp.

- Tiết kiệm được nhiều thời gian và công sức, không phải thời gian tháo ráp vi điều khiển để nạp.

Hạn chế:

Có thể thấy là sự thuận lợi mà Tiny Bootloader mạng lại là rất rõ ràng. Tuy nhiên việc sử dụng Tiny Bootloader làm cho bộ nhớ chương trình tổn hao một số lượng word nhất định (trong trường hợp này là 100 K word). Mặc dù số lượng word tổn hao là nhỏ nhưng đôi khi mang lại một số điểm bất cập (chương trình ứng dụng viết cho vi điều khiển không cho phép dư ra 100 word chẳng hạn). Do đó tùy theo yêu cầu thực tế mà có sự lựa chọn phù hợp các phương pháp nạp chương trình trực tiếp trên mạch cho vi điều khiển.
Một số trinh biên dịch chưa tương thích với tiny bootloader.

Bên cạnh đó cần chú ý đến sự tương thích giữa mạch Tiny Bootloader và mạch ứng dụng để tránh gặp phải những trở ngại không đáng có.

ntc 25-05-2006 10:34 PM

1 Attachment(s)
Đây là bản báo cáo đầy đủ.

Trong đó có thêm phần của anh Nam về kết quả thử nghiệm Tiny Bootloader đối với dsPIC.

Các hình vẽ không đạt yêu cầu, mình sẽ chỉnh sửa lại sau.

Một điểm cần lưu ý, là phiên bản này không còn phù hợp vói các chuẩn mới của PICVIETNAM. Các vấn đề đưa ra ở đây chỉ còn mang tính chất tham khảo, về sơ đồ nguyên lí, nguyên lí hoạt động về cách sử dụng Tiny Bootloader, ... và không khuyến khích việc làm tiny bootloader theo sơ đồ mạch in trong báo cáo.

PVN Tiny Bootloader Version 3.0 hiện tại đã hoàn tất, và sẽ sớm thông báo kết quả trên diễn đàn. Đây sẽ là sản phẩm PVN Tiny Bootloader chính thức.

ntc 27-05-2006 11:05 AM

6.3. Một số lỗi thường gặp khi sử dụng Tiny Bootloader

Trong quá trình sử dụng có thể đôi lúc Tiny Bootloader hoạt động không thực sự suôn sẻ mà gặp phải một số trục trặc. Các trường hợp này đều được chương trình trên máy tính báo lỗi. Sau đây là một số lỗi thường gặp và cách khắc phục:

- Lỗi không tìm thấy PIC: đây là một lỗi rất hay gặp. Trong trường hợp này, ta cần kiểm tra lại tất cả các bước tiến hành với Tiny Bootloader để phát hiện lỗi và khăc phục (kết nối phần cứng có đúng chưa, chương trình Firmware đã được nạp hay chưa, các thông số thiết lập tương thích hay chưa,…)

http://i65.photobucket.com/albums/h2...ntc/HINH11.jpg

Hình 11: Lỗi “không tìm thấy PIC”.

- Lỗi do chương trình nạp vào PIC không tương thích với vi điều khiển đang sử dụng. Trong trường hợp này cần kiểm tra lại chương trình cần nạp vào PIC có thực sự tương thich chưa. Ví dụ, không thể lấy chương trình viết cho PIC18F để nạp vào PIC16F.

http://i65.photobucket.com/albums/h2...ntc/HINH12.jpg

Hình 12: Lỗi do chương trình đưa vào PIC không tương thích.

- Lỗi do thanh ghi PCLATH chưa được xử lí phù hợp trong chương trình ứng dụng: trong trường hợp này cần thêm vào các lệnh xử lí thanh ghi PCLATH vào chương trình ứng dụng đã được trình bày ở trên. Khi gặp lỗi này, chương trình ứng dụng vẫn được nạp vào vi điều khiển, nhưng quá trình thực thi sẽ không đúng.

http://i65.photobucket.com/albums/h2...HINH13_sua.jpg

Hình 13: Lỗi do thanh ghi PCLATH chưa được xử lí thích hợp.

daihang86 06-09-2006 08:53 PM

Các bác cho em hỏi "Chương trình Tiny Bootloader" cho con PIC18F458, có bác nào có cho em phát. Tìm search không ra.


Múi giờ GMT. Hiện tại là 11:29 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam