Thông báo

Collapse
No announcement yet.

Sử dụng Pointer để truy xuất bộ nhớ!

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

  • Sử dụng Pointer để truy xuất bộ nhớ!

    Chào các bạn!
    Mình mới học lập trình AVR với CodevisionAVR. Mình muốn hiểu phương thức dùng biến con trỏ để tru xuất bộ nhớ SRAM, FLASH và EEPROM như thế nào? Mọi người vui lòng chỉ giúp với!
    Cảm ơn nhiều!

  • #2
    mình ưa làm như thế này :

    Code:
    //khai báo mảng dữ liệu
    unsigned char bang[]={0,1,2.....}// bao nhiêu dữ liệu thì tùy
    
    .....
    
    int i;
    
    ....
    for (i=0;i<="chiều dài của mảng dữ liệu";i++)
         PORT??=bang[i];// truy xuất dữ liệu thứ i trong mảng ra PORT.
    .......
    T mới chỉ làm trong Flash thui...
    thử nhé, chúc thành công.

    Comment


    • #3
      Mình viết thế này:
      void SRAM()
      {
      unsigned char *Pointer;
      Pointer=55209;
      data=*Pointer;
      }
      nhưng trình biên dịch báo lỗi: dữ liệu kiểu 'unsigned in' không phù hợp với 'unsigned char'.
      Mình không hiểu. Vui lòng giải đáp giúp với!

      Comment


      • #4
        cảm ơn Core T đã reply!
        Mình muốn đọc dữ liệu từ 1 ô nhớ được chỉ ra bằng con trỏ. Mình nghĩ truy xuất SRAM, FLASH hay EEPROM cũng cùng 1 phương thức thôi. Nhưng chưa hiểu về cơ chế này lắm!

        Comment


        • #5
          Viết thế này lại không báo lỗi nữa :
          void SRAM()
          {
          unsigned char *Pointer;
          unsigned int diachi;
          diachi=55209;
          Pointer=&diachi;
          data=*Pointer;
          }
          Không biết là mình viết sai cú pháp hay do trình biên dịch nhỉ?

          Comment


          • #6
            Vậy làm thế nào để gán địa chỉ cho con trỏ để trỏ tới ô nhớ cần đọc nhỉ? Mọi người giúp mình với!

            Comment


            • #7
              Nguyên văn bởi AVRS Xem bài viết
              Mình viết thế này:
              void SRAM()
              {
              unsigned char *Pointer;
              Pointer=55209;
              data=*Pointer;
              }
              nhưng trình biên dịch báo lỗi: dữ liệu kiểu 'unsigned in' không phù hợp với 'unsigned char'.
              Mình không hiểu. Vui lòng giải đáp giúp với!
              Đoạn này lỗi bạn nêu chưa đủ thông tin bạn post lại output của compiler để nhìn rõ hơn.

              Nguyên văn bởi AVRS Xem bài viết
              Viết thế này lại không báo lỗi nữa :
              void SRAM()
              {
              unsigned char *Pointer;
              unsigned int diachi;
              diachi=55209;
              Pointer=&diachi;
              data=*Pointer;
              }
              Không biết là mình viết sai cú pháp hay do trình biên dịch nhỉ?
              Đoạn lệnh viết như vậy thì kết quả là không phải bạn truy xuất đến địa chỉ 55209 mà là bạn truy xuất đến ô nhớ chứ giá trị đang chứa trong biến diachi

              Việc truy xuất flash không đơn giản chỉ là trỏ tới là có thể thực hiện được.
              Việc bạn làm là truy xuất ram.
              Đối với flash và epprom cần có thủ tục riêng.
              Nếu xài codevision thì nó tích hợp sẵn trong compiler còn nếu xài gcc thì lúc này bạn nên xài các thư viện truy xuất bộ nhớ chương trình.

              Sông dài, Thuyền lớn, Biển rộng bao la.
              Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

              Comment


              • #8
                Nguyên văn bởi core T Xem bài viết
                mình ưa làm như thế này :

                Code:
                //khai báo mảng dữ liệu
                unsigned char bang[]={0,1,2.....}// bao nhiêu dữ liệu thì tùy
                \
                Đoạn này bạn khai báo như vậy thì nó sẽ lọt vào trong RAM chứ không nằm trong flash.
                Có thể dùng các từ khoá như:
                -Const
                -__PROGMEM //với từ khóa này thì bạn vào thư viện của GCC trong AVRSTUDIO coi lại (lâu quá mình không làm về AVR nên nhớ không rõ)

                Sông dài, Thuyền lớn, Biển rộng bao la.
                Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                Comment


                • #9
                  Nguyên văn bởi AVRS Xem bài viết
                  Mình viết thế này:
                  void SRAM()
                  {
                  unsigned char *Pointer;
                  Pointer=55209;
                  data=*Pointer;
                  }
                  nhưng trình biên dịch báo lỗi: dữ liệu kiểu 'unsigned in' không phù hợp với 'unsigned char'.
                  Mình không hiểu. Vui lòng giải đáp giúp với!
                  để chạy hàm truy xuất trên RAM kia, bạn thử đổi dòng này xem sao
                  Pointer=(unsigned char *)55209;

                  Comment


                  • #10
                    @quocthai_bk: mình không biết POST ảnh.
                    nhưng nó báo lỗi là: đường dẫn: a value of type 'unsigned int' can't be assigned to an entity of type 'unsigned char'.
                    Code vẫn như trên:
                    void SRAM()
                    {
                    unsigned char *Pointer;

                    Pointer=55209;
                    data=*Pointer;
                    }

                    Comment


                    • #11
                      Mình đang dùng CodeVisionAVR 1.24.8d Proffesional. Mong các bạn giải đáp giúp lỗi trên và cho mình xin phương án để truy xuất tới các ô nhớ của SRAM.
                      Cảm ơn mọi người đã Reply!

                      Comment


                      • #12
                        Vậy làm thế nào để truy xuất tới 1 ô nhớ SRAM ? Mong mọi người chỉ giúp với!

                        Comment


                        • #13
                          Nguyên văn bởi AVRS Xem bài viết
                          Vậy làm thế nào để truy xuất tới 1 ô nhớ SRAM ? Mong mọi người chỉ giúp với!
                          Bạn vitah đã đưa giải pháp rồi:
                          unsigned char *Pointer;
                          Pointer=(unsigned char *)55209; // truy xuất vào đ/chỉ 55209 của SRAM

                          Nếu muốn truy xuất Flash:
                          flash unsigned char *Pointer;
                          Pointer=(flash unsigned char *)55209; //truy xuất vào đ/chỉ 55209 của flash

                          Nếu muốn truy xuất eeprom:
                          eeprom unsigned char *Pointer;
                          Pointer=(eeprom unsigned char *)55209; //truy xuất vào đ/chỉ 55209 của eeprom

                          tuy vậy, ít ai lại đi gán trực tiếp như thế cả. Nên dùng biến, hằng cho tiện quản lí.
                          Nếu viết bằng ASM, để trỏ tới flash thì phải dùng các thanh ghi (X,Y,Z register - Bon atmel sản xuất mấy thanh ghi này là để hỗ trợ cho con trỏ ). Nhưng nếu dùng C, thì complier sẽ biết cách giải quyết vấn đề cho bạn.

                          Chú ý: kích thước con trỏ trong codevision có thể là 8bit, 16 bit,.. tùy model memory.
                          Last edited by thavali; 08-12-2008, 15:43.

                          Comment


                          • #14
                            Cảm ơn bạn thavali nhiều!
                            Mới học viết chương trình cho AVR bằng C nên sẽ cần nhiều tới sự giúp đỡ của mọi người. Mong mọi người ủng hộ nha!
                            Cảm ơn mọi người!

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X