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

  • #16
    Thua!

    (tính viết một chữ thôi mà quái, nó không cho viết dưới 10 chữ)

    Chúc vui.
    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


    • #17
      a[1]=200 Cái này khi dịch nó cấp phát biến a[1] ứng với 1 địa chỉ nào đó trong FLASH và gán bằng 200 giống như bạn khai const a = 200 vậy. Còn ghi vào flash là do chương trình programer của bạn làm chứ đâu phải là chương trình do bạn viết ra làm. Nghĩa là trong file HEX ( BIN, EXE ....) đã có sẵn giá trị 200 tại 1 vị trí ( địa chỉ ) ứng với biến a rồi. Cái này chỉ khác cách khai báo trong compiler . Như vậy MCU nào cũng OK. Kể cả loại OTM ( ROM ghi 1 lần)
      Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

      Biến tần
      Máy giặt
      Lò vi sóng
      Bếp từ.
      Tủ lạnh.
      Điều hòa

      Comment


      • #18
        Nguyên văn bởi MinhHa
        a[1]=200 Cái này khi dịch nó cấp phát biến a[1] ứng với 1 địa chỉ nào đó trong FLASH và gán bằng 200 giống như bạn khai const a = 200 vậy. Còn ghi vào flash là do chương trình programer của bạn làm chứ đâu phải là chương trình do bạn viết ra làm. Nghĩa là trong file HEX ( BIN, EXE ....) đã có sẵn giá trị 200 tại 1 vị trí ( địa chỉ ) ứng với biến a rồi. Cái này chỉ khác cách khai báo trong compiler . Như vậy MCU nào cũng OK. Kể cả loại OTM ( ROM ghi 1 lần)
        Ko phải như anh nói đâu, có lẽ anh bị ảnh hưởng bởi PIC nên mới vậy. Một số trình dịch AVR nó làm được như trên.
        Nếu khai báo:
        const ... thì đương nhiên ko thay đổi giá trị được.
        Nếu khai báo(ko nhớ cú pháp nhưng đại loại):
        char a[10] flash;
        Thì nó sẽ tự hiểu phần mềm sẽ thông minh ở đây. Nếu gán a[1]=200;thì nó sẽ làm một loạt thủ tục ghi vào flash. Địa chỉ bắt đầu của dữ liệu a[0] của flash phần mêm và trình dịch sẽ đủ thông minh xử lý việc đó(không khó). Nói đến vậy anh MinhHa đã hiểu và chấp nhận chưa nhỉ...hi hi...
        Trên là nói về trịnhdich C của AVR.

        Comment


        • #19
          Với PIC, nó không sử dụng bộ nhớ dữ liệu để lưu mà sử dụng ngay bộ nhớ chương trình. Có nghĩa là một mã lệnh 14 bit chẳng hạn, trong đó có 6 bit mã lệnh, còn lại 8 bit lưu luôn dữ liệu đó.

          Đọc lại tutorial của F thì sẽ rõ.

          Còn trường hợp mảng dữ liệu biến, thì nó cấp phát bộ nhớ dữ liệu để sử dụng. Điều này không liên quan gì đến Flash hay EEPROM cả.
          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


          • #20
            char a[10] flash;
            thì cũng vậy thôi, nó cầp phát biến này trong flash. Nếu cần thì gán ngay giá trị vào. còn khi ghi thì nó đâu có gọi hàm để ghi mà chỉ tạo ra file HEX. còn ghi vào flash là do programer làm chứ. Nếu khi đang chạy mà cần thay đổi thì phải có hàm để ghi chứ không gán lại a[10] = biến số được. Cái này chỉ có thể áp dụng lúc khai báo biến. Anh suy luận từ các laọi MCU khác sang không biết có OK không 3T?
            Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

            Biến tần
            Máy giặt
            Lò vi sóng
            Bếp từ.
            Tủ lạnh.
            Điều hòa

            Comment


            • #21
              Nguyên văn bởi MinhHa
              char a[10] flash;
              thì cũng vậy thôi, nó cầp phát biến này trong flash. Nếu cần thì gán ngay giá trị vào. còn khi ghi thì nó đâu có gọi hàm để ghi mà chỉ tạo ra file HEX. còn ghi vào flash là do programer làm chứ. Nếu khi đang chạy mà cần thay đổi thì phải có hàm để ghi chứ không gán lại a[10] = biến số được. Cái này chỉ có thể áp dụng lúc khai báo biến. Anh suy luận từ các laọi MCU khác sang không biết có OK không 3T?
              a[10]=200;//kiểu flash
              Thì trình dịch sẽ tìm hiểu, à...mảng a[] nó là flash....à nó a[10] có địa chỉ là k+10(do k là địa chỉ a[0]),..à vậy trình dịch sẽ dịch cái đoạn mã ngắn ngủi a[10]=200 thành một đoạn code ghi vào flash địa chỉ k+10 với giá trị 200 vào. Công việc của trình biên dịch thì rất vất vả còn người lập trình chỉ đánh mỗi dòng a[10]=200 thôi. Nói tóm lại là trình dịch nhận hết sự khó khăn về phần mình

              Comment


              • #22
                Thay vì viết:a[10]=200;
                muốn hiểu bản chất hơn thì dùng hàm:
                Write_Flash(unsigned int địa_chỉ,unsigned int giá_trị); thông dụng.
                Write_Flash(k+10,200);
                Chọn cái nào hơn???? hả anh MH

                Comment


                • #23
                  3T không hiểu ý anh rồi. Nếu khi chạy chương trình ví dụ char b flash;a = time; inc a, b = a; thì nó sẽ phải gọi hàm ghi flash. Nhưng khi viet a = 5 thì khi compiler nó đặt luôn 5 vào vị trí biến a luôn và programer sẽ ghi nó vào flash. Tại sao lại phải sinh ra hàm ghi làm gì nhỉ???
                  Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

                  Biến tần
                  Máy giặt
                  Lò vi sóng
                  Bếp từ.
                  Tủ lạnh.
                  Điều hòa

                  Comment


                  • #24
                    Cái này với EEPOM của PIC cũng vậy.Nếu biết trước các giá trị cần ghi trong EEPROM ( data base ) anh tạo luôn ra file này và programer ghi luôn vào lúc nạp chương trình. Ví duk font cho LED MATRIX hay cho máy in kim chẳng hạn. Khi chương trình cần đến thì chỉ việc đọc ra dùng là OK. không cần hàm ghi. Nhưng khi cần thay đổi thì cần phải có hàm ghi EEPROM ( CCS cũng rất đơn giản Write_EEPROM....).
                    Nhà sản xuất chuyên nghiệp các sản phẩm OEM cho gia dụng và công nghiệp.

                    Biến tần
                    Máy giặt
                    Lò vi sóng
                    Bếp từ.
                    Tủ lạnh.
                    Điều hòa

                    Comment


                    • #25
                      Nhưng cách gán như vậy vô cùng trực quan, sáng sủa và dễ hiểu. Ko cần quan tâm tới địa chỉ lưu trữ, ko cần quan tâm tới hàm ghi... Nếu một trình dịch mà support mảng flash như trên, thì tại sao ko dùng mà phải đi vòng quanh?
                      Cách khai báo flash trên để nhằm mục đích lưu một số thông tin phòng khi mất điện. Ngoài ra, nó có thể coi là một lượng RAM khổng lồ đặc biệt(rất có lợi cho quảng báo chẳng hạn?), tất nhiên lượng RAM này ko đúng nghĩa RAM thật bởi: tốc độ thấp và hạn chế gán tùy tiện.

                      Comment


                      • #26
                        Nguyên văn bởi MinhHa
                        Cái này với EEPOM của PIC cũng vậy.Nếu biết trước các giá trị cần ghi trong EEPROM ( data base ) anh tạo luôn ra file này và programer ghi luôn vào lúc nạp chương trình. Ví duk font cho LED MATRIX hay cho máy in kim chẳng hạn. Khi chương trình cần đến thì chỉ việc đọc ra dùng là OK. không cần hàm ghi. Nhưng khi cần thay đổi thì cần phải có hàm ghi EEPROM ( CCS cũng rất đơn giản Write_EEPROM....).
                        Cái này thì em hiểu, nhưng một ví dụ:
                        Máy tính đẩy sang cho quảng báo một mảng dữ liệu, thì cách dùng mảng flash sẽ rất đơn giản. Chỉ việc gán là xong. Thậm chí ko tốn RAM để lưu giá trị.

                        Comment


                        • #27
                          -Về AVR thì bạn check con ATMEGA8535 xem sao.
                          - T3 có nhầm không thế? tôi đọc tất cả datasheet của AVR rồi, không con nào hỗ trợ ghi flash cả. Nó có chức năng ISP nhưng chỉ dùng để nạp chương tình thôi, không tự ghi vào được khi nó đang chạy.

                          Thay vì viết:a[10]=200;
                          muốn hiểu bản chất hơn thì dùng hàm:
                          Write_Flash(unsigned int địa_chỉ,unsigned int giá_trị); thông dụng.
                          Write_Flash(k+10,200);
                          Chọn cái nào hơn???? hả anh MH
                          - Không biết T3 đang nói về con nào vậy AVR/PIC? . Nếu là PIC thì đúng.
                          - Còn AVR thì không được. Khai báo biến dạng flash thì rất vô tư, thoải mái kích thước, kiểu dữ liệu ... Nhưng không thể ghi vào được, ( bản chất AVR đã không hỗ trợ rồi ) - nếu dùng CodeVisionAVR thì khi gán một biến kiểu flash sẽ hiện báo lỗi "unmodifiable Ivalue". T3 thử kiểm tra lại xem.

                          Comment


                          • #28
                            Nguyên văn bởi Laguna
                            - T3 có nhầm không thế? tôi đọc tất cả datasheet của AVR rồi, không con nào hỗ trợ ghi flash cả. Nó có chức năng ISP nhưng chỉ dùng để nạp chương tình thôi, không tự ghi vào được khi nó đang chạy.


                            - Không biết T3 đang nói về con nào vậy AVR/PIC? . Nếu là PIC thì đúng.
                            - Còn AVR thì không được. Khai báo biến dạng flash thì rất vô tư, thoải mái kích thước, kiểu dữ liệu ... Nhưng không thể ghi vào được, ( bản chất AVR đã không hỗ trợ rồi ) - nếu dùng CodeVisionAVR thì khi gán một biến kiểu flash sẽ hiện báo lỗi "unmodifiable Ivalue". T3 thử kiểm tra lại xem.
                            Nói đến vậy mà bạn vẫn chưa tin à? không phải tất cả nhưng có lẽ hầu hết các con AVR đều hỗ trợ. Tất cả các con AVR support "self programming "đều được hết. ISP và Bootloader là khác nhau đó.
                            Có một cái link nhỏ để bạn tham khảo ngay trên diễn đàn này.
                            http://dientuvietnam.net/board/showthread.php?t=425
                            Một vài link trên diễn đàn này cũng có nói, bạn tìm lại thử xem.
                            Hẹn ra năm mình trả lời tiếp, cho mình thời gian đón tết với chứ...hihi...

                            Comment


                            • #29
                              đúng như laguna nói, eeprom mới gán được eeprom char a[x]=b. Flash (để lưu code) kô gán được trong khi đang chạy. Bác nào đọc kỹ cob MB89F202 cho hỏi flash của nó có tự ghi trong khi chạy được kô. Nó có nói để ghi được vào flash khi đang chạy cần tự động load code vào RAM. Thế là thế nào. PIC có làm thế không. Mình đọc SAM7 thấy nó có bootloader sẽ chiếm một ít RAM để ghi flash.
                              ! ! you can win if you want ! !

                              Comment


                              • #30
                                Nguyên văn bởi anhtuan133
                                đúng như laguna nói, eeprom mới gán được eeprom char a[x]=b. Flash (để lưu code) kô gán được trong khi đang chạy. Bác nào đọc kỹ cob MB89F202 cho hỏi flash của nó có tự ghi trong khi chạy được kô. Nó có nói để ghi được vào flash khi đang chạy cần tự động load code vào RAM. Thế là thế nào. PIC có làm thế không. Mình đọc SAM7 thấy nó có bootloader sẽ chiếm một ít RAM để ghi flash.
                                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 đó.

                                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