Tôi đang chạy một Microchip dsPIC30F6012a. Tôi có con chip này trên một số PCB, tất cả đều chạy cùng một phần mềm và quan sát cùng một vấn đề trên tất cả chúng. Điều này ngụ ý một vấn đề mang tính hệ thống, không phải là vấn đề sản xuất một lần. Vấn đề cũng có thể tái tạo, ngụ ý tôi sẽ có thể giết nó nếu tôi biết nơi để tìm. Nhưng tôi vẫn gặp khó khăn đáng ngạc nhiên khi gỡ lỗi ứng dụng.
Bảng thử nghiệm chấp nhận 24V, được giảm xuống 5V thông qua V7805. Con chip này chạy trên bộ dao động bên trong của nó, với PLL 16x, cho tốc độ hoạt động ~ 29,5 MIPS. Mã có liên quan trên bảng này về cơ bản là rất đơn giản: thức dậy, đọc dữ liệu từ EEPROM, sau đó nhập một vòng lặp vô hạn. Ngắt mỗi mili giây, quan sát một số dữ liệu môi trường và viết giá trị cập nhật vào EEPROM. Có những thứ khác đang diễn ra, nhưng vấn đề vẫn xảy ra ngay cả khi mã không liên quan được nhận xét, vì vậy tôi có thể chắc chắn rằng nó không liên quan đến vấn đề trong tay.
Trong sử dụng chung, 95% thời gian bảng thức dậy với giá trị chính xác trong bộ nhớ và tiếp tục công việc của mình. 5% còn lại, tuy nhiên, nó thức dậy với một giá trị không chính xác. Cụ thể, nó thức dậy với một phiên bản lật ngược của dữ liệu mà nó phải có. Đó là một ký tự dài bốn byte mà tôi đang xem và từ trên hoặc dưới của từ dài có thể bị lật. Ví dụ: 10 trở thành 2 ^ 16-10, sau này trở thành 2 ^ 32-10. Tôi có thể tái tạo trục trặc bằng cách đạp xe bằng tay vài chục lần, nhưng điều đó không nhất quán và ngón tay chuyển đổi của tôi bị mòn.
Để tái tạo vấn đề theo cách có kiểm soát, tôi đã xây dựng một bảng thứ hai điều khiển nguồn cung cấp 24V cho bảng đang được thử nghiệm. (Một DSPIC khác điều khiển bộ ghép quang darlington.) Bảng thử nghiệm tắt 24 V trong 1,5 giây (đủ lâu để đường ray 5V giảm xuống 0 và giữ nguyên trong một giây), sau đó bật 24 V trong một khoảng thời gian có thể định cấu hình . Với thời gian hoạt động khoảng 520 mS, tôi có thể tái tạo trục trặc EEPROM này trong vòng năm chu kỳ năng lượng, mọi lúc.
Đường ray 5V đang hoạt động hợp lý. Nó ổn định ở mức 5V trong vòng 1 mS khi bật, có lẽ là 4V quá mức, giả sử tôi có thể tin tưởng vào phạm vi của mình. Khi tắt, nó phân rã thành 0V theo cấp số nhân, đạt 1V trong vòng 50 mS. Tôi không có cảnh báo xây dựng nào có vẻ phù hợp, chỉ là các biến không được sử dụng và thiếu dòng mới ở cuối tệp.
Tôi đã thử một vài thứ:
- Kích hoạt / vô hiệu hóa MCLR
- Kích hoạt / vô hiệu hóa WDT
- Kích hoạt / vô hiệu hóa bảo vệ mã
- Kích hoạt / vô hiệu hóa / thay đổi điện áp phát hiện mất điện
- Kích hoạt / vô hiệu hóa / thay đổi bộ hẹn giờ bật nguồn
- Các cài đặt PLL khác nhau trên bộ dao động bên trong chính
- Kết nối / ngắt kết nối lập trình viên PICkit 3 của tôi
- Thêm điện dung 470 uF vào đường ray 5V
- Thêm / xóa .1 uF trên pullup 4.7k trên chân MCLR của tôi
- Vô hiệu hóa tất cả các ngắt trong mã và không để lại gì ngoài các cập nhật EEPROM trong vòng lặp chính
- Thêm độ trễ 1,5 giây vào thói quen khởi động trước khi tôi bắt đầu đọc EEPROM
Tôi cũng đã viết mã kiểm tra riêng không làm gì ngoài việc liên tục ghi các giá trị vào EEPROM và sau đó đọc lại chúng, đảm bảo rằng giá trị không bị thay đổi. Hàng chục ngàn lần lặp lại không có lỗi. Tất cả những gì tôi có thể kết luận là có gì đó không ổn với việc đọc hoặc viết EEPROM, đặc biệt là khi bật / tắt nguồn.
Tôi đã sử dụng cùng các thư viện EEPROM từ năm 2007. Tôi đã thấy các trục trặc không thường xuyên, nhưng không có gì có thể lặp lại. Mã liên quan có thể được tìm thấy ở đây:
http://srange.net/code/eeprom.c
http://srange.net/code/readEEByte.s
http://srange.net/code/eraseEEWord.s
http: / /srange.net/code/writeEEWord.s
Tôi đã thấy các lỗi EEPROM trước đây trong các ứng dụng khác, nhưng luôn gặp sự cố một lần, không có gì có thể lặp lại hoặc nhất quán này.
Có ai có bất cứ ý tưởng những gì đang xảy ra? Tôi đang hết thứ để thử.