RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Đọc ghi Flash Program Memory

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • falleaf
    PIC Bang chủ
    • May 2005
    • 2627

    #16
    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
    ...
    ...
    LOOP
    ..
    RETLOOP        RETURN
    Đây chỉ là một gợi ý, có thể bạn không thích kiểu viết này, chỉ là một cái recommend, không quan trọng lắm.

    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
    Công ty TNHH Thương mại và Giao nhận R&P
    store.hn@rpc.vn - store.hcm@rpc.vn

    Học PIC như thế nào?

    Comment

    • namqn
      Trưởng lão PIC bang
      • Feb 2006
      • 3020

      #17
      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,
      Last edited by namqn; 18-02-2007, 12:36 AM. Lý do: bổ sung thông tin
      Biển học mênh mông, sức người có hạn.

      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
      http://www.picvietnam.com/forum/showthread.php?t=1263

      Comment

      • hungpq
        Đệ tử 1 túi
        • Nov 2006
        • 19

        #18
        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.

        Comment

        • falleaf
          PIC Bang chủ
          • May 2005
          • 2627

          #19
          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.
          Công ty TNHH Thương mại và Giao nhận R&P
          store.hn@rpc.vn - store.hcm@rpc.vn

          Học PIC như thế nào?

          Comment

          • hungpq
            Đệ tử 1 túi
            • Nov 2006
            • 19

            #20
            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.

            Comment

            • falleaf
              PIC Bang chủ
              • May 2005
              • 2627

              #21
              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
              Công ty TNHH Thương mại và Giao nhận R&P
              store.hn@rpc.vn - store.hcm@rpc.vn

              Học PIC như thế nào?

              Comment

              • tdm
                Đệ tử 7 túi
                • May 2005
                • 258

                #22
                Ví Dụ Ghi Dọc:
                Code:
                            #INCLUDE "P16F877A.INC"
                           __CONFIG  0x3F72
                           CBLOCK 0x20
                             BYTE_CAO
                	BYTE_THAP
                             TAM
                	DU_LIEU
                	endc
                ;***************************************
                ;********* MACRO DEFINITIONS ***********
                ;***************************************
                 INCLUDE "BANK.INC"
                ;***************************************
                        org        0000
                BANK0
                MOVLW B'0000010'
                MOVWF BYTE_CAO
                MOVLW B'00000000'
                MOVWF BYTE_THAP
                MOVLW B'00000000'
                MOVWF DU_LIEU
                BANK1
                MOVLW .00
                MOVWF TRISB
                CALL DL
                CALL DL
                BANK0
                MOVF BYTE_CAO,0
                BANK2
                MOVWF EEADRH
                BANK0
                MOVF BYTE_THAP,0
                BANK2
                MOVWF EEADR
                LOOP
                BANK0
                MOVF DU_LIEU,0
                BANK2
                MOVWF EEDATH
                MOVWF EEDATA
                BANK3
                BSF EECON1,EEPGD
                BSF EECON1,WREN
                BCF INTCON,GIE
                MOVLW 0x55
                MOVWF EECON2
                MOVLW 0xAA
                MOVWF EECON2
                BSF EECON1,WR
                nop
                nop
                BCF EECON1,WREN
                BANK2
                MOVF EEADR,W 
                ANDLW 0x03 
                XORLW 0x03
                BTFSC STATUS,Z ;
                GOTO DOC_DU_LIEU
                INCF EEADR,1
                BANK0
                INCF DU_LIEU,1
                GOTO LOOP
                DOC_DU_LIEU
                LAP_LAI
                BANK0
                MOVLW .4
                MOVWF TAM
                BANK2
                MOVLW 0xFF
                MOVWF EEDATA
                BANK0
                MOVF BYTE_CAO,0
                BANK2
                MOVWF EEADRH
                BANK0
                MOVF BYTE_THAP,0
                BANK2
                MOVWF EEADR
                LAP
                BANK3
                BSF EECON1,EEPGD
                BSF EECON1,RD
                NOP
                NOP
                BCF EECON1,RD
                BANK2
                MOVF EEDATA,0
                BANK0
                MOVWF PORTB;XUAT DU LIEU RA PORTB
                CALL DL
                BANK2
                INCF EEADR,1
                BANK0
                DECFSZ TAM,1
                GOTO LAP
                GOTO LAP_LAI
                ;******DL*********
                DL
                BANK0
                CLRF T1CON
                CLRF TMR1H
                CLRF TMR1H
                CLRF INTCON
                BANK1
                CLRF PIE1
                BANK0
                CLRF PIR1
                MOVLW 0x30  ;1:8 
                MOVWF T1CON
                BSF T1CON,TMR1ON
                CHO 
                BTFSS PIR1,TMR1IF
                GOTO CHO 
                BCF  T1CON,TMR1ON
                BCF PIR1,TMR1IF
                CLRF TMR1H
                CLRF TMR1H
                RETLW .00
                END
                Last edited by namqn; 03-03-2007, 07:06 PM.
                viết chương trình cho vdk chạy ổn định là cả một vấn đề.

                Comment

                • hungpq
                  Đệ tử 1 túi
                  • Nov 2006
                  • 19

                  #23
                  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.

                  Comment

                  • falleaf
                    PIC Bang chủ
                    • May 2005
                    • 2627

                    #24
                    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.
                    Công ty TNHH Thương mại và Giao nhận R&P
                    store.hn@rpc.vn - store.hcm@rpc.vn

                    Học PIC như thế nào?

                    Comment

                    • namqn
                      Trưởng lão PIC bang
                      • Feb 2006
                      • 3020

                      #25
                      Nguyên văn bởi hungpq View Post
                      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 tôi chỉ ghi 1, 2 word thì như thế nào? Có giới hạn gì đối với địa chỉ ghi dữ liệu không?

                      Thân,
                      Biển học mênh mông, sức người có hạn.

                      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                      http://www.picvietnam.com/forum/showthread.php?t=1263

                      Comment

                      • hungpq
                        Đệ tử 1 túi
                        • Nov 2006
                        • 19

                        #26
                        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 đã.

                        Comment

                        • ThieuQP
                          Nhập môn đệ tử
                          • Nov 2008
                          • 3

                          #27
                          Flash Program memnory!

                          Nguyên văn bởi namqn View Post
                          Nếu tôi chỉ ghi 1, 2 word thì như thế nào? Có giới hạn gì đối với địa chỉ ghi dữ liệu không?

                          Thân,
                          Em chào thầy.
                          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.

                          Comment

                          • ThieuQP
                            Nhập môn đệ tử
                            • Nov 2008
                            • 3

                            #28
                            Flash Program memnory!

                            Nguyên văn bởi falleaf View Post
                            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.
                            Anh ơi cho em hỏi đã ai viết hàm này chưa ạ? em tìm trên diễn đàn mà không có.

                            Comment

                            Working...