Thông báo

Collapse
No announcement yet.

Khác biệt giữa Flash và EEPROM của PIC?

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

  • #31
    Hi hi... vẫn chưa tin!!! thế mới lạ.
    PIC em dùng cách ghi vào flash thay eeprom thường xuyên.Bootloader cũng là một cách đó.
    - Ah. Đúng là có chức năng này. Khi dùng Bootloader thì chương trình trên Bootloader sẽ nhận dữ liệu trương trình và ghi vào flash, eeprom .
    - Nhưng trong chương trình đang chạy thì không biết có được không? vì không đọc thấy hàm hỗ trợ, còn ghi theo kiểu của ISP thì chưa thử.
    - T3 có ví dụ nào ghi vào flash khi đang chạy trương trình không? post lên cho mọi người tham khảo - chỉ đơn giản ghi 1 byte thôi ?
    - Còn nếu dùng CodeVisionAVR , khai báo biến "flash char a=0x55 " thì khong thể thay đổi được nội dung của a khi đang chạy.

    Comment


    • #32
      Một thủ tục mình viết cho việc ghi flash cách đây 1 năm rồi, khi mới tập viết code cho PIC

      //--------------------------------------------------
      void FL_WR(uint addr,uint value)
      {
      char j,correct;
      EEPGD = 1;
      EEADRH=(addr>>8);
      EEADR=(addr&0xff);
      WREN=0;
      RD=1;
      asm("nop");
      asm("nop");
      if(((EEDATH<<8)|EEDATA)!=value)
      {
      correct=addr&3;
      addr&=0xfffc;
      CLRWDT();
      for(j=0;j<4;j++)
      {
      EEADRH=(addr>>8);
      EEADR=(addr&0xff);
      WREN=0;
      RD=1;
      asm("nop");
      asm("nop");
      if(j==correct)
      {
      EEDATH=(value>>8);
      EEDATA=value&0xff;
      }
      WREN=1;
      GIE = 0;
      EECON2 = 0x55;
      EECON2 = 0xaa;
      WR=1;
      asm("nop");
      asm("nop");
      GIE = 1;
      WREN=0;
      addr++;
      }
      }
      }

      Comment


      • #33
        Còn AVR thì mình chưa làm đâu, bạn chịu khó đọc phần "memory programming" trong datasheet của nó.Phải chọn con có support tính năng trên mới được. Các appnote về phần này tại atmel.com rất nhiều.Thậm chí, dựa vào tính năng đó, bạn có thể làm một kiểu nạp qua bất cứ một giao diện nào: COM, USB, I2C,SPI,CAN...nếu nó có support giao diện đó

        Comment


        • #34
          Không làm AVR nên bó tay, đồng ý với các ý kiến của anh MinhHa, em cũng hiểu như vậy.

          Mà luồng này là nói về PIC chứ, lôi AVR vào đây làm chi ?

          Comment


          • #35
            Một thủ tục mình viết cho việc ghi flash cách đây 1 năm rồi, khi mới tập viết code cho PIC
            Còn AVR thì mình chưa làm đâu,
            - Cái cô bé này đúng là ... cãi cùn không chịu được. Làm tôi tưởng trình dịch CodeVisionAVR có hỗ trợ ghi vào flash mà mình không biết!
            - Thống nhất với ý kiến mọi người là flash của PIC là ghi vào được, còn thực hiện thế nào tùy vào từng trình dịch.
            - về flash của AVR - có thể ghi vào được. Nhưng trình dịch CodeVisionAVR hiện tại chưa hỗ trợ. Nếu muốn thực hiện thì phải làm thủ công thôi . Tài liệu của Atmel nói về vấn đề này có tại trang : đồng thời liệt kê cả nhũng VDK hỗ trợ ghi kiểu này
            http://www.avrfreaks.net/index.php?m...ol&item_id=592
            Để thảo luận thêm về việc ghi flash trong AVR chắc phải sang bên mục AVR thôi.

            - Về luồng này đề nghị mọi người thảo luận tiếp về các cách ghi vào flash trong PIC, không biết cách nào ghi đơn giản nhất ?
            --- hiện tại một số trình dịch C cho PIC hỗ trợ ghi vào flash bằng hàm "write_flash(địa chỉ, dữ liệu)" - nhưng theo cách này ta phải tự quản lý vùng nhớ flash để không ghi đè vào phần chương trình.
            --- không biết có trình dịch nào hỗ trợ như CodeVisionAVR không? - có nghĩa là ta khai báo một mảng kiểu "flash char a[10]" thì khi dọc/ghi chỉ việc gán "char b = a[1]"/"a[1] = 0x55" - ta không cần quản lý địa chỉ của mảng flash mà trình dịch tự làm điều này ?

            Sắp Tết rồi, hẹn mọi người năm sau gặp lại.
            -----
            Chúc mừng năm mới. Chúc năm mới mọi người luôn vui vẻ, hạnh phúc.

            Comment


            • #36
              Nguyên văn bởi thaithutrang
              Một thủ tục mình viết cho việc ghi flash cách đây 1 năm rồi, khi mới tập viết code cho PIC

              //--------------------------------------------------
              void FL_WR(uint addr,uint value)
              {
              char j,correct;
              EEPGD = 1;
              EEADRH=(addr>>8);
              EEADR=(addr&0xff);
              WREN=0;
              RD=1;
              asm("nop");
              asm("nop");
              if(((EEDATH<<8)|EEDATA)!=value)
              {
              correct=addr&3;
              addr&=0xfffc;
              CLRWDT();
              for(j=0;j<4;j++)
              {
              EEADRH=(addr>>8);
              EEADR=(addr&0xff);
              WREN=0;
              RD=1;
              asm("nop");
              asm("nop");
              if(j==correct)
              {
              EEDATH=(value>>8);
              EEDATA=value&0xff;
              }
              WREN=1;
              GIE = 0;
              EECON2 = 0x55;
              EECON2 = 0xaa;
              WR=1;
              asm("nop");
              asm("nop");
              GIE = 1;
              WREN=0;
              addr++;
              }
              }
              }
              Chưa làm ghi vào Flash của PIC bao giờ. Nên hôm nay mạo muội hỏi cô bé xấu xí một tý.
              Cái gì là bằng chứng cho các lệnh trên là ghi vào Flash mà kô phải là EEPROM ?
              Anh thấy các lệnh em dùng đều có chữ EE ở đầu, vậy nó viết tắt của EEPROM có phải kô nhỉ?
              Ví dụ: EEPGD = 1; <--- EEPROM PROGRAMING DATA
              EEADRH=(addr>>8); <--- EERPOM ADDRESS HIGH
              EEADR=(addr&0xff); <----EEPROM ADDRESS LOW
              EEDATH <---- EEPROM DATA HIGH
              EEDATA <---- EEPROM DATA LOW

              Mong sớm nhận được trả lời. Hi hi......
              Chúc ăn tết vui vẻ
              AFH

              Comment


              • #37
                Nguyên văn bởi AFH
                Chưa làm ghi vào Flash của PIC bao giờ. Nên hôm nay mạo muội hỏi cô bé xấu xí một tý.
                Cái gì là bằng chứng cho các lệnh trên là ghi vào Flash mà kô phải là EEPROM ?
                Anh thấy các lệnh em dùng đều có chữ EE ở đầu, vậy nó viết tắt của EEPROM có phải kô nhỉ?
                Ví dụ: EEPGD = 1; <--- EEPROM PROGRAMING DATA
                EEADRH=(addr>>8); <--- EERPOM ADDRESS HIGH
                EEADR=(addr&0xff); <----EEPROM ADDRESS LOW
                EEDATH <---- EEPROM DATA HIGH
                EEDATA <---- EEPROM DATA LOW

                Mong sớm nhận được trả lời. Hi hi......
                Chúc ăn tết vui vẻ
                AFH
                Hi hi... vậy đề nghị anh AFH đọc lại phần "DATA EEPROM AND FLASH
                PROGRAM MEMORY" của tài liệu datasheet của PIC có support chức năng đó nhé(hầu hết >=PIC18+một số PIC16).

                Comment


                • #38
                  Nguyên văn bởi Laguna
                  - Cái cô bé này đúng là ... cãi cùn không chịu được. Làm tôi tưởng trình dịch CodeVisionAVR có hỗ trợ ghi vào flash mà mình không biết!
                  - Thống nhất với ý kiến mọi người là flash của PIC là ghi vào được, còn thực hiện thế nào tùy vào từng trình dịch.
                  - về flash của AVR - có thể ghi vào được. Nhưng trình dịch CodeVisionAVR hiện tại chưa hỗ trợ. Nếu muốn thực hiện thì phải làm thủ công thôi . Tài liệu của Atmel nói về vấn đề này có tại trang : đồng thời liệt kê cả nhũng VDK hỗ trợ ghi kiểu này
                  Bạn đọc kỹ help của CodeVisionAVR chưa? bạn nên tin vào đó là chuẩn xác.Còn việc khai báo cho codeVisionAVR thì mình suy luận theo logic bởi theo 2 cách:
                  Cách 1: flash char a;
                  Cách 2: const char a;

                  chúng có gì giống và khác nhau nếu theo suy luận của bạn ở trên?

                  Em thấy hình như nhóm PIC trên diễn đàn này mạnh hơn nhóm AVR thì phải.Thấy các câu về PIC thế nào cũng có người trả lời, còn AVR thì vắng lặng quá. Toàn người làm PIC trả lời hộ nhóm AVR thì nếu có sai thì cũng mong bỏ qua..hihi...
                  Last edited by thaithutrang; 31-01-2006, 20:16.

                  Comment


                  • #39
                    Neu nhu AFH, thì F nói là bé Trang nói đúng rồi, vì đó là thao tác ghi vào Flash. Hoàn toàn không sai.

                    Tuy nhiên, nếu anh AFH là dân lập trình PIC thì em nên xem lại câu này bé Trang à, Flash của 16F877 là Flash dỏm (từ anh hay dùng), còn 16F877A mới đúng là Flash. Vì vậy thuật toán ghi vào Flash của 16F877A và 16F877 có điểm khác nhau. Chính vì vậy mà các chương trình nạp dùng cho 16F877 và 16F877A là khác nhau. Mặc dù vậy, datasheet hai thằng đều giống nhau như đúc.

                    Câu hỏi của anh AFH nếu trong trường hợp này là anh ấy hỏi mẹo em rằng làm sao phân biệt được hai loại này? Bởi vì nếu như cùng làm như vậy thì có gì khác nhau đâu? và có gì khác biệt giữa Flash và EEPROM đâu?

                    Em vẫn còn lầm lẫn giữa khái niệm Flash-EEPROM và khái niệm bộ nhớ chương trình và bộ nhớ dữ liệu. Anh không hiểu em không phân biệt hay cố tình đánh lạc hướng mọi người??

                    Về chức năng của trình dịch, có lẽ anh không biết nhiều để thảo luận, một là anh làm nhiều với MPASM, hai là anh làm điều khiển, đụng đến vấn đề biên dịch nên dành cho những người làm tin học họ làm. Và tốt hơn là cái gì tốt hay xấu, nếu không phải chuyên ngành của chúng ta thì chúng ta không nên nhận xét vội vàng, kẻo lại sa đà.

                    Theo các nhân anh, máy tính càng ngày càng được gọi là thông minh thì càng ngày càng ngốc đi... và cái gì gọi là thông minh?

                    Chúc năm mới vui vẻ
                    Falleaf
                    Công ty TNHH Thương mại và Giao nhận R&P
                    58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                    mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                    Comment


                    • #40
                      Những người làm AVR đi làm kiếm tiền nhiều cả rồi, không có thời gian ngồi đây nói nhảm như những người làm PIC? ... không phải là em nói ý này đấy chứ..

                      hihi, anh chỉ đùa thôi, cũng xin lỗi các bác làm PIC hay AVR nhé, chỉ là trêu bé Trang tí thôi...
                      Falleaf
                      Công ty TNHH Thương mại và Giao nhận R&P
                      58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                      mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                      Comment


                      • #41
                        Đoạn mã trên viết cho 16F877A chứ ko phải là 16F877.
                        Đố ai hiểu được đoạn mã trên tại sao em viết dài và khó hiểu thế? hi hi..
                        Anh F chắc lâu ko làm PIC, mọi người coi anh là giáo sư PIC, còn em coi anh là phó giáo sư PIC..hihi...
                        Và giải đáp thắc mắc của anh F là ở đây chỉ nói tới việc dùng Flash hay EEPROM để lưu dữ liệu, không nói khía cạnh khác, bởi tiêu đề luồng này.
                        Về lập trình, thì PIC16F87x khác PIC16F877 ở chỗ nó ghi 1 lúc 1 byte hoặc 4 byte. Bởi thế nếu ghi hàng loạt thì *a nhanh hơn là * không a. Còn mọi thao tác vê lập trình đều gần như y hệt nhau.

                        Comment


                        • #42
                          Bổ sung 1: datasheet của pic16f877 và pic16f877a không giống y hệt nhau đâu. Hai ví dụ sau để chứng minh:
                          +Về cách ghi vào Flash.
                          +Về bộ comparator

                          Bổ sung 2: nếu nói về khía cạnh lập trình thì ngoài việc cách ghi/đọc F và E có khác nhau vài dòng lệnh, thì nó còn khác nhau một số ý em đã post ở ngay đầu luồng.

                          Comment


                          • #43
                            hahhaa, lại còn trêu anh nữa, ở đâu lòi ra cái danh giáo sư với phó giáo sư vậy? Anh tặng em cái tên công chúa PIC vì em là em gái cưng của PIC... còn cái vụ giáo sư PIC này hơi căng à... nếu em không muốn anh bị đập lên bờ xuống ruộng, chết mất xác ... trên diễn đàn thì tha cho anh cái... anh chịu thua rồi ...

                            Gài anh vô cái thế này thì ...

                            Đúng là lâu rồi anh không đụng tới PIC nữa, gần 2 năm anh không lập trình PIC, và cụ thể hơn là anh không lập trình bất kỳ một cái gì luôn. 2 năm gần đây anh chỉ ngồi làm toán và nói dóc thôi...

                            Chắc để khi nào rảnh rỗi anh phải luyện lại mới được. Chỉ có điều công việc của anh lại chẳng liên quan gì đến chip chiếc, chẳng dính gì đến điện tử.. Thế nó mói đau cái đầu. Giờ anh toàn làm việc với lò xo và damper thôi...

                            Chúc em năm mới vui vẻ.
                            Falleaf
                            Công ty TNHH Thương mại và Giao nhận R&P
                            58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
                            mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

                            Comment


                            • #44
                              Cho em hỏi, nếu dùng trình dịch CCS thì làm thế nào để ghi dữ liệu vào FLASH cho 16f877A được. Em tìm mãi mà không thấy lệnh nào để làm cả. Chỉ có lệnh cho EEPROM. Cảm ơn trước!

                              Comment


                              • #45
                                Code:
                                read_program_eeprom(address) Reads the program memory location(16 bit or 32 bit depending on the device).
                                 
                                write_program_eeprom(address, value)  Writes value to program memory location address.
                                
                                erase_program_eeprom(address) Erases FLASH_ERASE_SIZE bytes in program memory.
                                 
                                write_program_memory(address,dataptr,count) Writes count bytes to program memory from dataptr to address. When address is a mutiple of FLASH_ERASE_SIZE an erase is also performed.
                                
                                read_program_memory(address,dataptr,count) Read count bytes from program memory at address to dataptr.
                                
                                ...
                                Các hàm đọc ghi từng Byte hoặc từng Block.

                                Regards

                                Email:
                                Phone: 0905.034.086

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X