![]() |
Trong hai cách sửa XORLW, thì cách đảo INCF với MOVF của bạn hungpq hiệu quả hơn và chuẩn hơn so với cách sửa XORLW 0x00.
Tuy nhiên bạn dùng lệnh RETURN rất không ổn. Bản thân lệnh RETURN nó không làm gì hết, nhưng có có một nhiệm vụ là lôi cái Top of Stack ra và nhảy tới đó. Giả sử đoạn chương trình trên của bạn, bạn viết dạng CALL thì lập tức nó nhảy về chỗ CALL đó mà không thực hiện tiếp lệnh bên dưới. Nhưng nếu bạn không sử dụng CALL, và TOS đang trống!!? Do vậy, cách viết an toàn là GOTO $+3 Rồi nếu bạn dùng CALL thì ngay sau dòng GOTO LOOP, bạn sử dụng RETURN. Nếu bạn không dùng CALL, thì bạn có thể làm gì đó cũng được, ngay sau đó. Hồi F viết, F hay đặt một cái nhãn chỗ RETURN và nếu cần RETURN thì F nhảy tới đó. Viết như vậy để giữ cấu trúc: Code:
CALL LOOP Về phần bạn hỏi về ghi WR, đã gần 3 năm F không đụng tới PIC, cho nên F không thực sự nhớ rõ lắm. Tuy nhiên, bạn thử kiểm tra lại đoạn này. Đó là khi ghi Flash thì WR sẽ được tự xóa, và nó hoàn toàn được thực hiện bởi phần cứng. Khi đó nó không hề được xử lý gì cả. Có nghĩa là việc thì bạn có quyền bật trong chương trình, nhưng sau đó, thì bạn sẽ không thấy gì cả mà tự động tắt. Trong MPLAB, nó cho bạn xem EEPROM bằng MPLAB SIM. Vì vậy, bạn có thể theo dõi kết quả EEPROM có được ghi hay chưa. Bạn cũng có thể xem PROGRAMME MEMORY. Bạn chọn View và chọn các mục tương ứng để quan sát tại các địa chỉ mà bạn tương tác. Chúc vui |
Tôi xin lỗi vì một số nhận định không chính xác ở các post trước. Tôi (và có lẽ nhiều người dùng lâu năm) thường tin tưởng một cách chủ quan vào các datasheet của nhà sản xuất.
Tôi xin xác nhận là những ý kiến của bạn hungpq về sai sót của đoạn code mẫu trong datasheet của PIC16F87xA là chính xác: đoạn code đó chỉ thực thi 1 lần nếu đúng theo các điều kiện ban đầu được đặt ra, và cách sửa tốt là bỏ lệnh XOR và đổi BTFSC thành BTFSS. Thân, |
Chào các bác mải ăn tết lâu quá nay mới ghé thăm, cáo lỗi các bác. Thưa các bác như vậy là chúng ta đã thống nhất với nhau rằng đoạn code mẫu thực hiện ghi vào bộ nhớ FLASH trong datasheet của con PIC16f877A là bị sai. Thú thực là tôi không bất ngờ với việc code mẫu trong các datasheet bị sai bởi vì tôi đã gặp rất nhiều lần rồi. Còn việc sửa lại đoạn code này như thế nào cho hợp lý thì theo tôi không cần thiết. Bởi vì với mỗi ứng dụng, với mỗi chương trình, đều có những cách thể hiện riêng của nó để cho nó tối ưu nhất. Đúng như vậy không các bác. Còn nếu có thể thì các bác cho một yêu cầu về một hàm ghi dữ liệu vào bộ nhớ Flash của con 16f877a để mọi người cùng thảo luận và xây dựng.
|
Trong datasheet thực tế là sai rất nhiều chỗ, lúc trước F mở ra cái box MPASM này là có ý đồ để các bạn viết MPASM và chuẩn hóa lại các đoạn code.
Thực tế như các bạn thấy, nếu như F có viết những lời mào đầu, thì giả sử như có đúng, có sai... Như vậy, nếu F có viết thì cũng làm sao bằng cái kho datasheet của Microchip, và cũng không thể bằng được cái kho thư viện thuật toán của piclist. Tuy nhiên, một điều hơi sai ý đồ, đó là vì nghĩ như vậy, cho nên F dành thời gian ban đầu, tập trung vào Cơ bản về PIC, và chính cái tên cơ bản về PIC cũng thu hút rất nhiều người đọc. Cuối cùng, ngay cả bài viết này, các bạn cũng tập trung vào box Cơ bản về PIC này, mà không chú ý viết bài ở phần MPASM Một số vấn đề về thuật toán cao cấp hơn, vd như các bạn chưa ai thử viết một mạch lọc bằng MPASM, hoặc viết các đoạn biến đổi số,... Hãy bắt đầu bằng các thảo luận ở đây nếu các bạn muốn. Chúc vui. |
Thực ra ở đây ý của tôi là muốn mọi người cùng xây dựng một hàm ghi số liệu vào bộ nhớ Flash của con 16f877a, để cho mọi người có nhu cầu sử dụng thì có thể lấy về để dùng. Bởi vì tôi nghĩ rằng có nhiều người làm trong lĩnh vực thu thập số liệu và điều khiển phân tán (SCADA), cho nên sẽ cần phải ghi, lưu trữ số liệu. Còn đối với các bài toán dạng như xây dựng các bộ lọc số, biến đổi số... thì có lẽ phải dùng công cụ khác thì mới có hiệu quả hơn.
|
Mình ủng hộ hoạt động này của bạn, mình sẽ dán luồng này lên cao dạng Chú ý để hỗ trợ hoạt động của bạn.
Chúng ta có thể cùng nhau xây dựng từ từ, và F mong rằng hoạt động này sẽ được sự ủng hộ của các thành viên. Chúc vui |
Ví Dụ Ghi Dọc:
Code:
#INCLUDE "P16F877A.INC" |
Dạo này bận quá đã không xây dựng được một hàm ghi dữ liệu vào bộ nhớ FLASH của con 16f877a được để cho các bác cho ý kiến. Bác TDM và các bác thân mến tôi định xây dựng một hàm ghi sao cho về mặt cấu trúc phải rõ ràng, chặt chẽ, code ngắn gọn, tốc độ nhanh, và dễ sử dụng để nhiều người sử dụng được. Đại loại như thế này.
- Các tham số đầu vào của hàm: + Dữ liệu cần ghi. + Địa chỉ ghi dữ liệu. + ................ - Các tham số đầu ra: + Kết quả ghi + ............... - Nội dung cơ bản của hàm: + Kiểm tra các tham số đầu vào. + Ghi dữ liệu. + Trả kết quả. Mong các bác chỉ giúp xem như thế có được chưa, cần bổ sung thêm bớt gì không? Nếu được mong các bác cùng xây dựng giúp? Cám ơn các bác nhiều. |
Nếu viết thì nên viết dạng gọi hàm. Chúng ta cần thống nhất một số thông số như sau:
Dữ liệu vào: DATATOROM Địa chỉ ROM: ROMADDR Tên hàm ghi: SAVETOROM Dữ liệu ra: ROMTODATA Tên hàm đọc: READFRROM Quá trình ghi sẽ được thực hiện như sau: 1) Chọn giá trị ROMADDR 2) Ghi giá trị từ biến bất kỳ vào DATATOROM 3) CALL SAVETOROM Quá trình đọc sẽ được thực hiện như sau: 1) Chọn giá trị ROMADDR 2) CALL READFRROM (dữ liệu đã nằm trong biến ROMTODATA) 3) Chuyển dữ liệu từ ROMTODATA vào biến cần dùng F nghĩ, trước tiên cần thực hiện cái việc đơn giản này trước, sau đó, sẽ mở rộng lên, cho phép ghi mảng dữ liệu, và khai báo mảng. Sau đó sẽ mở rộng ra ghi nhiều mảng. Chúc vui. |
Trích:
Thân, |
Cám ơn các bác đã góp ý. Tôi nghĩ rằng trước tiên chỉ cần xây dựng một hàm ghi thật cơ bản trước sau đó mới thực hiện các hàm tiếp theo. Để xây dựng hàm ghi này cần phải dựa vào đặc điểm bộ nhớ flash của con 16f877a: đó là phải ghi đồng thời liên tiếp 4 Word.
Còn về gợi ý của bác namqn để có thể ghi vào địa chỉ bất kỳ trong vùng bộ nhớ thì hoàn toàn có thể thực hiện được không khó khăn gì lắm. Nhưng tôi nghĩ rằng trước tiên cần xây dựng một hàm ghi thật cơ bản trước đã. |
Flash Program memnory!
Trích:
Em tìm mãi trên diễn đàn không thấy được hàm nào ghi vào Flash cả, mặc dù nhắc đến khá nhiều. |
Flash Program memnory!
Trích:
|
Múi giờ GMT. Hiện tại là 03:53 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