Thông báo

Collapse
No announcement yet.

[Program flash AVR by bootloader]

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [Program flash AVR by bootloader]

    Hi tất cả các bác!
    Hiện tại mình đang theo dự án "máy bán hàng tự động" đã gần 3 năm nay rồi.
    Mình nói sơ qua về cái máy này nha:
    Giải pháp:
    - Máy luôn kết nối internet để đồng bộ dữ liệu với server qua LAN và GPRS
    - Theo dõi tồn kho của máy từ xa qua web
    - Cảnh báo lỗi qua SMS, email.
    - Mua hàng bằng điện thoại di động hoặc dùng thẻ do cty cung cấp.
    - Nạp tiền vào tài khoản thẻ hoặc điện thoại di động bằng máy nhận tiền(giấy +polime từ 1.000-500.000) qua giao thức MDB hoặc CCNET.
    - Các giao dịch nạp tiền và thanh toán được gửi lên server để ghi nhận và kiểm soát.

    Phần cứng:
    - Được thiết kế chủ yếu trên AVR, một số ngoại vi được thiết kế trên PIC và ARM(NXP).
    - Chương trình hiện tại cho CPU trung tâm (ATmega2560) khá lớn (khoảng 60.000 line và chếm bộ nhớ tầm 110Kbyte).

    Vào chủ đề:
    - Từ nảy nói hơi dài dòng để giới thiệu cái ưu điểm của máy, còn cái yếu điểm giờ nhờ các bác giúp đỡ tí.
    - Cụ thể vấn đề là nhiều thông số máy mình lưu trong eeprom của AVR rất hay bị reset về 0xFF mà không hiểu nguyên nhân, mình cũng dùng bộ nhớ ngoài 24C512 và thẻ nhớ để lưu các thông số quan trọng khác và logfile nhưng không bị sao cả. Không biết bác nào bị giống mình và khắc phục được thì góp ý cho mình với (thanks !).
    - Một vấn đề khác nữa là dùng bộ nhớ dư của ATmega2560 (256K bộ nhớ) để lưu như eeprom (giống như các dòng ARM hiện nay đang làm). Ý tưởng thì có nhưng chưa thực hiện được đó là:
    + Tận dụng bootloader của AVR để ghi bộ nhớ flash. Bootloader thì làm nhiều rồi như boot qua serial, thẻ nhớ, ethernet điều OK cả, nhưng giờ mình muốn trong chương trình chính sẽ có đoạn chương trình con mà nằm ở vùng nhớ bootloader để ghi bộ nhớ flash(tất nhiên là ghi theo trang). Mục đích để khi cần thay đổi hay lưu thông số nào vào bộ nhớ flash thì gọi hàm con này để ghi flash. Bác nào làm qua cái này rồi thì tư vấn cho mình với (thanks !).

    Đặt gạch ngồi hóng các bác và cao nhân tư vấn, giúp đỡ.

    Email:
    Tel: 0983.497.310

  • #2
    eeprom của avr có số lần ghi là 100k. Nếu ghi nhiều quá có thể bị lỗi. Còn mình dùng để lưu thông số thì chưa bao giờ bị hiện tượng trên.
    AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
    Xem thêm tại Online Store ---> Click here
    Mob: 0982.083.106

    Comment


    • #3
      Nguyên văn bởi VNarmy Xem bài viết
      eeprom của avr có số lần ghi là 100k. Nếu ghi nhiều quá có thể bị lỗi. Còn mình dùng để lưu thông số thì chưa bao giờ bị hiện tượng trên.
      Thanks bác VNarmy!
      - Mình sử dụng bộ nhớ eeprom để lưu các thông số cấu hình cho máy nên rất ít thay đổi. Thông số được setup trên server rồi đẩy xuống cho máy qua ethernet hoặc trực tiếp bằng keypad+LCD tại máy nên trường hợp lỗi do ghi lặp nhiều lần thì khó xảy ra được.
      - Không biết trường hợp lỗi này do chip cùi hay không, vì nguồn chip mua từ các cửa hàng/cty ở Việt Nam chứ không có chính hãng. Nếu bác nào đại lý chính hãng hoặc đảm bảo chính hãng thì mình xin đặt 100 chip ATmega2560.
      - Việc mất bộ nhớ bộ nhớ eeprom nội của AVR mình cũng hay gặp ở các chíp khác như ATmega32/ ATmega8. Mình viết firmware trên CodeVisionAVR và WinAVR điều bị cả. Không biết có khi nào bị lỗi ở phần thiết kế nguồn không nhỉ, mình thường dùng nguồn tổ ong 12/24V-3A -> LM2576-5V.

      Email:
      Tel: 0983.497.310

      Comment


      • #4
        Vấn đề lỗi bộ nhớ eeprom chắc để mình theo dõi và tìm hướng giải quyết sau.
        Còn vấn đề dùng bootloader để ghi bộ nhớ flash trong chương trình chính theo Huy nghĩ sẽ rất hữu ích cho việc tận dụng tối đa bộ nhớ AVR. Mình chỉ mới có ý tưởng như đã trình bày ở trên, không biết có thể thực hiện được không? vì vậy nhờ các bác có kinh nghiệm về AVR tư vấn giúp. Nếu có khả năng thì Huy sẽ cố gắng làm và hướng dẫn trực tiếp trong TUT này luôn.

        Email:
        Tel: 0983.497.310

        Comment


        • #5
          Nguyên văn bởi tienhuypro Xem bài viết
          Vấn đề lỗi bộ nhớ eeprom chắc để mình theo dõi và tìm hướng giải quyết sau.
          Còn vấn đề dùng bootloader để ghi bộ nhớ flash trong chương trình chính theo Huy nghĩ sẽ rất hữu ích cho việc tận dụng tối đa bộ nhớ AVR. Mình chỉ mới có ý tưởng như đã trình bày ở trên, không biết có thể thực hiện được không? vì vậy nhờ các bác có kinh nghiệm về AVR tư vấn giúp. Nếu có khả năng thì Huy sẽ cố gắng làm và hướng dẫn trực tiếp trong TUT này luôn.
          Như mọi chip khác nếu vùng bootloader mà có dữ liệu thì nó có thể không chạy nếu dữ liệu trong vùng bootloader bị sai. Việc bạn cần làm là ghi được 1 chương trình có thể đọc và đi qua boot loader, ngoài ra nếu là bootloader độc lập mà không liên quan đến main flash thì khả năng khai thác dữ liệu là rất khó khăn.

          Thường thì các chip giờ đây dung lượng bộ nhớ có rất nhiều nên nếu có tận dụng lưu trữ flash thì tìm những địa chỉ ( vùng địa chỉ ) cuối bộ nhớ là an toàn nhất.

          --- Việc mất eeprom thì mình cũng đã từng gặp nhiều ở ATmega8, thường do nguồn điện + code. Dễ dàng can thiệp vào vùng lưu trữ eeprom sẽ làm tăng nguy cơ bị sai do nhiễu tức thời, không disable ngắt trong quá trình ghi eeprom nội có thể làm sai hỏng hoặc không ghi được vào eeprom
          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

          Comment


          • #6
            Nguyên văn bởi queduong Xem bài viết
            Như mọi chip khác nếu vùng bootloader mà có dữ liệu thì nó có thể không chạy nếu dữ liệu trong vùng bootloader bị sai. Việc bạn cần làm là ghi được 1 chương trình có thể đọc và đi qua boot loader, ngoài ra nếu là bootloader độc lập mà không liên quan đến main flash thì khả năng khai thác dữ liệu là rất khó khăn.

            Thường thì các chip giờ đây dung lượng bộ nhớ có rất nhiều nên nếu có tận dụng lưu trữ flash thì tìm những địa chỉ ( vùng địa chỉ ) cuối bộ nhớ là an toàn nhất.

            --- Việc mất eeprom thì mình cũng đã từng gặp nhiều ở ATmega8, thường do nguồn điện + code. Dễ dàng can thiệp vào vùng lưu trữ eeprom sẽ làm tăng nguy cơ bị sai do nhiễu tức thời, không disable ngắt trong quá trình ghi eeprom nội có thể làm sai hỏng hoặc không ghi được vào eeprom
            Thanks bác queduong!
            - Việc bộ nhớ eeprom bị lỗi do nguồn cũng có thể xảy ra. Vừa rồi mới ngồi đọc kỹ lại datasheet của AVR thì khi power on/off sẽ có khoảng thời gian CPU chạy ở vùng điện áp thấp hơn quy định -> xung nhịp chip không ổn định và eeprom dễ sinh lỗi ngẫu nhiên.
            - Cách hạn chế nguy cơ lỗi eeprom là program fuse bit Brown-out Detector (BOD) và nên có mạch reset RC( thời gian reset đủ lớn để nguồn cung cấp chip đã ổn định) tại chân reset.
            - Còn việc read/write eeprom thì phải tắt interrupt toàn cục mới chạy đúng, Huy kiểm tra trong thư viện eeprom Codevion và WinAVR điều đã có sẵn.
            Hiện tại đã làm theo hướng dẫn datasheet và có thêm ferit cho nguồn đầu vào, Huy đang theo dõi và sẽ báo cáo kết quả trong thời gian tới cho các bác.

            - Còn về bootloader, đúng nhứ bác queduong nói. Nếu ta viết 2 chương trình: 1. flash() nằm ở vùng bootloader; 2. main() nằm ở vùn application. Thì việc khai thác dữ liệu rất khó bởi vì trong main để ghi được flash thì phải dùng lệnh jum hoặc dùng wathdog để auto reset nhảy đến vùng địa chỉ bootloader, sau đó mới ghi được flash. Ghi xong thì nhảy về địa chỉ 0x0000 để chạy lại từ đầu chương trình main. Cách này rất bất tiện mỗi khi ghi bộ nhớ flash thì phải chạy lại từ đầu chương trình main.
            - Cách thứ 2 dùng bootloader để ghi flash là: trong chương trình main() ta viết hàm con flash(), và mỗi khi cần ghi flash thì chỉ việc gọi hàm con flash(). Nhưng cái khó ở đây là chưa biết cách nào để định địa chỉ hàm con flash() nằm ở vùng bootloader. Nếu viết asm thì không có vần đề gì, nhưng 1 chương trình lớn thì việc include các thư viện và cấu hình project thì tất nhiên phải viết bằng C là chính. Mình đã thử chèn đoạn asm(".org địa chỉ bootloader"); tại hàm flash() nhưng khi biên dịch thì báo lỗi tràn bộ nhớ trong khi chương trình flash() chưa tới 1k. Vấn đề khó khăn nằm ở chỗ này, không biết bác nào có kinh nghiệm hay đã làm qua hướng dẫn mình chỗ này với. Thanks very much!

            Email:
            Tel: 0983.497.310

            Comment


            • #7
              Mấy anh ơi cho em hỏi,nếu ta muốn lưu 1 mảng lớn dữ liệu vào con eeprom 25LC256 để sau đó đọc ra và hiển thị trên bảng led thì làm thế nào? có phải phải là dùng giao tiếp VĐK với máy tính để truyền dữ liệu xuống VĐK , rồi VĐK ghi data vào eeprom ?

              Comment


              • #8
                Nguyên văn bởi tienhuypro Xem bài viết
                Thanks bác queduong!
                - Việc bộ nhớ eeprom bị lỗi do nguồn cũng có thể xảy ra. Vừa rồi mới ngồi đọc kỹ lại datasheet của AVR thì khi power on/off sẽ có khoảng thời gian CPU chạy ở vùng điện áp thấp hơn quy định -> xung nhịp chip không ổn định và eeprom dễ sinh lỗi ngẫu nhiên.
                - Cách hạn chế nguy cơ lỗi eeprom là program fuse bit Brown-out Detector (BOD) và nên có mạch reset RC( thời gian reset đủ lớn để nguồn cung cấp chip đã ổn định) tại chân reset.
                - Còn việc read/write eeprom thì phải tắt interrupt toàn cục mới chạy đúng, Huy kiểm tra trong thư viện eeprom Codevion và WinAVR điều đã có sẵn.
                Hiện tại đã làm theo hướng dẫn datasheet và có thêm ferit cho nguồn đầu vào, Huy đang theo dõi và sẽ báo cáo kết quả trong thời gian tới cho các bác.

                - Còn về bootloader, đúng nhứ bác queduong nói. Nếu ta viết 2 chương trình: 1. flash() nằm ở vùng bootloader; 2. main() nằm ở vùn application. Thì việc khai thác dữ liệu rất khó bởi vì trong main để ghi được flash thì phải dùng lệnh jum hoặc dùng wathdog để auto reset nhảy đến vùng địa chỉ bootloader, sau đó mới ghi được flash. Ghi xong thì nhảy về địa chỉ 0x0000 để chạy lại từ đầu chương trình main. Cách này rất bất tiện mỗi khi ghi bộ nhớ flash thì phải chạy lại từ đầu chương trình main.
                - Cách thứ 2 dùng bootloader để ghi flash là: trong chương trình main() ta viết hàm con flash(), và mỗi khi cần ghi flash thì chỉ việc gọi hàm con flash(). Nhưng cái khó ở đây là chưa biết cách nào để định địa chỉ hàm con flash() nằm ở vùng bootloader. Nếu viết asm thì không có vần đề gì, nhưng 1 chương trình lớn thì việc include các thư viện và cấu hình project thì tất nhiên phải viết bằng C là chính. Mình đã thử chèn đoạn asm(".org địa chỉ bootloader"); tại hàm flash() nhưng khi biên dịch thì báo lỗi tràn bộ nhớ trong khi chương trình flash() chưa tới 1k. Vấn đề khó khăn nằm ở chỗ này, không biết bác nào có kinh nghiệm hay đã làm qua hướng dẫn mình chỗ này với. Thanks very much!
                Các bác cho em hỏi với, có thể ATMega16 bị Lockbit LB0-LB1. Vậy có cách nào ghi bootloader mà ko mất dữ liệu vùng Application ko ạ?

                Thank các bro.

                Comment

                Về tác giả

                Collapse

                tienhuypro Tìm hiểu thêm về tienhuypro

                Bài viết mới nhất

                Collapse

                Đang tải...
                X