Thông báo

Collapse
No announcement yet.

PIC không chạy được sau mỗi lần khởi động lại

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

  • PIC không chạy được sau mỗi lần khởi động lại

    Em sử dụng pic 30f3012, nạp bằng pickit2, code bằng MPLabX. Em cấu hình là
    • CSW_FSCM_OFF // Clock Switching and Monitor (Sw Disabled, Mon Disabled)
    • WDT_OFF // Watchdog Timer (Disabled)
    • PWRT_OFF // POR Timer Value (Timer Disabled)
    • PBOR_OFF // PBOR Enable (Disabled)
    • MCLR_DIS // Master Clear Enable (Disabled)


    Vậy mà không hiểu sao lúc em nạp xong thì chạy vô tư. Sau khi em rút pickit ra, lúc đó PIC vẫn đang được cấp nguồn thì vẫn hoạt động bình thường. Tuy nhiên, sang ngay hôm sau em bật lại nguồn cho PIC thì PIC ko chạy được. Cắm pickit vào để đọc từ ROM thì thấy nội dung code vẫn như thế, ko có gì thay đổi. Sau đó em chạy PIC thì lại được. Tuy nhiên, cứ mỗi lần em khởi động lại PIC thì PIC ko chạy được, phải qua 1 công đoạn là cắm pickit vào chạy verify, read... thì con PIC của em lại chạy bình thường. Hic, em tìm hiểu cả tuần nay mà ko biết lý do tại sao cả. Bác nào đã gặp phải trường hợp này hay là biết là em làm sai bước gì thì chỉ giúp em với ạ. Em xin cám ơn

  • #2
    bạn xem lại chân reset con chip của bạn xem sao nhé.
    Nguyễn Huy Biên - 01649 802 694
    gmail :

    Comment


    • #3
      Vì mình đã config là MCLR_DIS nên là chân reset có thể sử dụng như 1 chân IO bình thường chứ ko thực hiện chức năng reset nữa. Trên mạch của mình chân reset được nối ra 1 chấu cắm bình thường thì để trống, khi cần nạp thì cắm pickit vào là nạp được luôn. Chính vì config là MCLR_DIS nên mình nghĩ trạng thái chân reset ko ảnh hưởng gì đến con pic mỗi khi khởi động cả

      Comment


      • #4
        Chân reset của PIC tốt nhất chỉ cho 1r lên nguồn, không có gì khác, có tụ thì bỏ đi.... Bạn cho về nguyên bản rồi thử lại xem sao.

        Comment


        • #5
          Nguyên văn bởi Lam-dt Xem bài viết
          Chân reset của PIC tốt nhất chỉ cho 1r lên nguồn, không có gì khác, có tụ thì bỏ đi.... Bạn cho về nguyên bản rồi thử lại xem sao.
          Với PIC thì chân Reset có thể off mềm, kéo dương, thêm tụ, không cần nối vẫn chạy OK

          Xem lại chương trình đi nhé.
          Chú ý các lệnh dạng "if.." nếu biến chưa được xác định mà đã kiểm tra thì hay bị lỗi như vậy lắm
          ĐT : 01676455880

          Comment


          • #6
            Nguyên văn bởi garung1611 Xem bài viết
            Em sử dụng pic 30f3012, nạp bằng pickit2, code bằng MPLabX. Em cấu hình là
            • CSW_FSCM_OFF // Clock Switching and Monitor (Sw Disabled, Mon Disabled)
            • WDT_OFF // Watchdog Timer (Disabled)
            • PWRT_OFF // POR Timer Value (Timer Disabled)
            • PBOR_OFF // PBOR Enable (Disabled)
            • MCLR_DIS // Master Clear Enable (Disabled)


            • Xem lại chương trình đi nhé.
              Chú ý các lệnh dạng "if.." nếu biến chưa được xác định mà đã kiểm tra thì hay bị lỗi như vậy lắm


            Vậy mà không hiểu sao lúc em nạp xong thì chạy vô tư. Sau khi em rút pickit ra, lúc đó PIC vẫn đang được cấp nguồn thì vẫn hoạt động bình thường. Tuy nhiên, sang ngay hôm sau em bật lại nguồn cho PIC thì PIC ko chạy được. Cắm pickit vào để đọc từ ROM thì thấy nội dung code vẫn như thế, ko có gì thay đổi. Sau đó em chạy PIC thì lại được. Tuy nhiên, cứ mỗi lần em khởi động lại PIC thì PIC ko chạy được, phải qua 1 công đoạn là cắm pickit vào chạy verify, read... thì con PIC của em lại chạy bình thường. Hic, em tìm hiểu cả tuần nay mà ko biết lý do tại sao cả. Bác nào đã gặp phải trường hợp này hay là biết là em làm sai bước gì thì chỉ giúp em với ạ. Em xin cám ơn
            Xem lại chương trình đi nhé.
            Chú ý các lệnh dạng "if.." nếu biến chưa được xác định mà đã kiểm tra thì hay bị lỗi như vậy lắm
            ĐT : 01676455880

            Comment


            • #7
              Nguyên văn bởi quanghuy_125 Xem bài viết
              Xem lại chương trình đi nhé.
              Chú ý các lệnh dạng "if.." nếu biến chưa được xác định mà đã kiểm tra thì hay bị lỗi như vậy lắm
              E sẽ thử lại bằng chương trình nháy Led đơn giản nhất xem có bị ko. Tuy nhiên trong chương trình của em, em có vòng lặp while đợi khi nào PLL lock rồi mới chạy tiếp.lúc đó thì tần số và mọi thứ khác ổn định rồi nên e nghĩ lỗi ko phải do biến chưa xác định

              Comment


              • #8
                Nguyên văn bởi garung1611 Xem bài viết
                E sẽ thử lại bằng chương trình nháy Led đơn giản nhất xem có bị ko. Tuy nhiên trong chương trình của em, em có vòng lặp while đợi khi nào PLL lock rồi mới chạy tiếp.lúc đó thì tần số và mọi thứ khác ổn định rồi nên e nghĩ lỗi ko phải do biến chưa xác định
                Bạn có khai báo biến nhưng chưa gán giá trị hoặc vào CT main chưa gán gt( chú ý với các biến mảng, gán các mảng). Khi hoạt động ở địa chỉ RAM biến đó cũng chưa có giá trị xác định hay địa chỉ rõ ràng.
                Bạn lại dùng lệnh kiểm có thể là while hoặc if thì 100% là khi bạn bật nguồn sẽ bị lỗi như bạn nói.
                Còn khi bạn nạp, read...(dùng chương trình mềm, VDK đang có nguồn) thì nó lại hoạt động vì khi bắt đầu cá thao tác đó nó sẽ reset RAM về 0x00 lên VDK mới hoạt động được.
                ĐT : 01676455880

                Comment


                • #9
                  Nguyên văn bởi quanghuy_125 Xem bài viết
                  Bạn có khai báo biến nhưng chưa gán giá trị hoặc vào CT main chưa gán gt( chú ý với các biến mảng, gán các mảng). Khi hoạt động ở địa chỉ RAM biến đó cũng chưa có giá trị xác định hay địa chỉ rõ ràng.
                  Bạn lại dùng lệnh kiểm có thể là while hoặc if thì 100% là khi bạn bật nguồn sẽ bị lỗi như bạn nói.
                  Còn khi bạn nạp, read...(dùng chương trình mềm, VDK đang có nguồn) thì nó lại hoạt động vì khi bắt đầu cá thao tác đó nó sẽ reset RAM về 0x00 lên VDK mới hoạt động được.
                  Bác có thể chỉ giúp em cách nào để vượt qua lỗi này được ko ạ. Hồi xưa em dùng pic 18 và mikroC thì chưa gặp trường hợp này bao giờ. Lần này dùng pic30 và mplabx mới gặp tình huống này. hơn nữa lệnh while đầu tiên của em là while(OSCCONbits.LOCK != 1); bit LOCK này là bit hệ thống nên em nghĩ trình biên dịch nó sẽ dịch ra thành 1 địa chỉ cố định tùy theo chip. Do vậy em ko nghĩ là khi restart bit này lại ở trạng thái ko xác định (un-initlization)

                  Comment


                  • #10
                    Nguyên văn bởi garung1611 Xem bài viết
                    Bác có thể chỉ giúp em cách nào để vượt qua lỗi này được ko ạ. Hồi xưa em dùng pic 18 và mikroC thì chưa gặp trường hợp này bao giờ. Lần này dùng pic30 và mplabx mới gặp tình huống này. hơn nữa lệnh while đầu tiên của em là while(OSCCONbits.LOCK != 1); bit LOCK này là bit hệ thống nên em nghĩ trình biên dịch nó sẽ dịch ra thành 1 địa chỉ cố định tùy theo chip. Do vậy em ko nghĩ là khi restart bit này lại ở trạng thái ko xác định (un-initlization)
                    Mình thì cũng chưa dùng MikroC hay Mplabx mà dùng H-tech Mplab, CCS thui.
                    Lệnh while(OSCCONbits.LOCK != 1); mình chưa hiểu lắm. Nếu là bit của PIN thì cần xác định giá trị bằng phần cứng(dùng trở kéo...), biến thì giá trị mềm( gán luôn nó bằng 1;0 trước khi kiểm tra).
                    ĐT : 01676455880

                    Comment


                    • #11
                      Hồi xưa dùng pic 18 thì e cũng ko xài cái while lock này bao giờ,vả lại ko phải con pic nào cũng có cái bit này.dùng mplabx khi tạo project dựa trên template dspic 30f thì nó tự tạo cho mình 1 cái khung làm việc,trong đó có bao gồm cái lệnh này.ý nghĩa của lệnh này là chờ đến khi cái osc ổn định, pll thành công thì bit pll lock bằng 1.còn pll mục đích là bộ nhân tần số dao động của chip.vdu như thạch anh 20mhz,sử dụng pll x4 thì tần số dao động của chip sẽ là 80mhz

                      Comment


                      • #12
                        Nguyên văn bởi garung1611 Xem bài viết
                        Hồi xưa dùng pic 18 thì e cũng ko xài cái while lock này bao giờ,vả lại ko phải con pic nào cũng có cái bit này.dùng mplabx khi tạo project dựa trên template dspic 30f thì nó tự tạo cho mình 1 cái khung làm việc,trong đó có bao gồm cái lệnh này.ý nghĩa của lệnh này là chờ đến khi cái osc ổn định, pll thành công thì bit pll lock bằng 1.còn pll mục đích là bộ nhân tần số dao động của chip.vdu như thạch anh 20mhz,sử dụng pll x4 thì tần số dao động của chip sẽ là 80mhz
                        PLL thì mình cũng hiểu. Minh cũng đã dùng dsPIC30F3010 bằng CCS nhưng không biết cái lệnh như vậy.
                        Nếu vậy thì sao không là while(OSCCONbits.LOCK == 0); mà lại là while(OSCCONbits.LOCK != 1); với Bit !=1 thì không phải ==0 à???
                        ĐT : 01676455880

                        Comment


                        • #13
                          Hnay mình mới có nhiều thời gian hơn để debug lỗi này. Bởi mỗi khi cắm PICKIT2 vào là hệ thống lại hoạt động bình thường ngay do vậy ko thể sử dụng tính năng debug của PICKIT2 được. Con pic 30f3012 vẫn im lìm thế, chẳng phản ứng mỗi khi mình gửi lệnh xuống từ điện thoại thông qua kết nối bluetooth. Thật chẳng khác nào upgrade firmware cho iphone bị brick máy cả.
                          Vì ko thể debug sử dụng pickit, mình bắt buộc phải sửa code sao cho mình có thể phát hiện xem quá trình thực hiện của chip đến đoạn nào thì lỗi, ko hoạt động theo như ý muốn. Mình phải sửa từng đoạn, đến mỗi đoạn mình nghĩ ngờ rằng có thể gây ra lỗi, mình lại chêm vào thêm 1 đoạn code để bật 1 chân nào đó lên logic 1, ví dụ RB6. Bằng cách đo điện áp chân RB6, hoặc nối RB6 với 1 con LED, mình có thể làm cho cục gạch 30f3012 trở nên tương tác hơn chứ ko im lìm nữa. Kiên trì chêm code từng đoạn, mình phát hiện ra là khi mình ko nối pickit 2 sau mỗi lần reset, thực ra là 30f3012 vẫn hoạt động bình thường chứ ko bị treo như mình suy đoán. Cái bị treo ở đây là chức năng UART receive thôi. Do chức năng UART receive bị treo nên hệ thống ko thể nhận lệnh từ điện thoại khiến cho mình nhầm tưởng rằng PIC bị treo sau mỗi lần khởi động lại
                          Đào sâu hơn nữa thì mình hiểu ra rằng sau mỗi lần khởi động lại biến U1STAT.OERR bị set lên 1 (ko hiểu do trạng thái ban đầu sau mỗi lần khởi động lại của nó là như thế hay do vẫn còn những ký tự nằm trong bộ đệm nhận của UART mà chưa được giải phóng). Việc OERR bị set lên 1 làm cho pic 30f3012 hiểu rằng bộ đệm nhận của uart đã đầy, ko nhận thêm ký tự nào nữa cho đến khi OERR được clear về 0. Mặc dù chương trình của mình có vòng lặp để đọc dữ liệu từ bộ đệm nhận của uart khi có ký tự đến, tuy nhiên, việc này vẫn ko thể giúp OERR được tự động clear về 0. Do đó chương trình của mình bị hang up ở đoạn này và ko nhận được lệnh nào cả
                          Sau khi tìm ra nguyên nhân thì sự việc trở nên rõ ràng và dễ giải quyết. Chỉ đơn giản là thêm 1 dòng lệnh U1STAT.OERR=0 khi khởi tạo các tham số trước vòng lặp truyền thông UART là vấn đề đã được xử lý
                          Vài lời chia sẻ để bạn nào gặp trường hợp tương tự có thể tránh bị mất thời gian vào lỗi này như mình

                          Comment


                          • #14
                            Đào càng sâu càng tốt, mình cũng đang gặp rắc rối với em 10f206, khi rút điện nguồn ra cắm lại là chạy sai, debug chắc chắn phải căn cứ vào datasheet, khả năng là 1 số bit của STATUS bị thả nổi không xác định trạng thái.
                            Last edited by bravesoldier; 15-08-2013, 16:02.
                            Manchester United FC forever!

                            Comment


                            • #15
                              Chạy sai như thế nào? Sai thì có rất nhiều nguyên nhân.
                              Bạn có gặp trường hợp nào dùng dao động nội của PIC.
                              Rùi nó hoạt động được một thời gian thì tần số giao động đó tăng lên gây làm tấc độ bau sai không giao tiếp RS232 được chưa?
                              ĐT : 01676455880

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X