Thông báo

Collapse
No announcement yet.

AVR studio và atmega8535...

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

  • AVR studio và atmega8535...

    Mình đang bắt đầu học lập trình AVR với con Atmega8535L, sử dụng chương trình nạp PonyPro 2000 nạp qua cổng nối tiếp. ASM viết bằng AVR Studio 4, không hiểu sao mình không thể thực hiện được lệnh gọi chương trình con rcall. AVR studio biên dịch không có lỗi nhưng khi nạp vào VDK thì cứ thực hiện đến lệnh này là chương trình không chạy tiếp, các lệnh khác vẫn thực hiện bình thường.
    khi run bằng AVR Studio thì thấy báo lỗi tại lệnh rcall.
    hình như là invalid opcode thì phải. Mong các cao thủ chỉ giúp!
    CODE:

    .cseg
    .org 0
    rjmp RESET
    rjmp RESET
    rjmp RESET

    RESET:

    ldi r16,0xff
    out DDRB,r16

    loop:
    ldi r16,0
    out PORTB,r16
    rcall delay
    ldi r16,0xff
    out PORTB,r16
    rcall delay
    rjmp loop

    delay:
    ldi r17,#200
    d1:
    ldi r18,#200
    d2:
    dec r18
    cpi r18,0
    brne d2
    dec r17
    cpi r17,0
    brne r17,d1
    ret

    Mạch nạp:
    http://www.sunrom.com/p-pi/c-1_24/pn...-programmer.st
    Last edited by sphinx; 07-11-2005, 16:27.
    PNLab
    Mạch nạp/debug ULink2, Jlink ARM USB
    Mạch nạp AVR, PIC, 8051, MSP430 USB
    Mạch phát triển STM32, ARM9, ARM11
    more...www.pnlabvn.com

  • #2
    Sao mà lắm "rjmp RESET" thế??? không biết các hạ định dùng chiêu thức gì đây?

    Các hạ bị tẩu hỏa nhập ma là do chưa khởi tạo con trỏ ngăn xếp. Dùng chương trình con mà không khởi tạo cho ngăn xếp thì ... toi! Với 8051 các hạ có thể chạy tốt chương trình trên vì ngăn xếp có giá trị default là 07h (nằm trong RAM nội và hoàn toàn là giá trị sử dụng được). Với AVR, giá trị default (giá trị ngay sau reset) là 0x0000. Nhắc lại với AVR, không gian địa chỉ dữ liệu gồm có Register File (R0..31), các thanh ghi I/O và cuối cùng là SRAM. Khi ánh xạ vào không gian địa chỉ dữ liệu, SRAM phải nằm từ địa chỉ 0x0060h trở đi. Ngăn xếp lại cư trú trong SRAM, do đó phải nằm từ địa chỉ lớn hơn 0x0060h (vì hoạt động của ngăn xếp khi cất vào thì giảm địa chỉ). Giá trị default bằng 0x0000h rõ ràng là không hợp lệ vì nó trỏ vào địa chỉ dành cho Register File, không phải là vùng SRAM. Khi dịch không báo lỗi vì không có lỗi cú pháp ở đây, nhưng khi Run thì ngăn xếp không được khởi tạo đúng nên báo lỗi, không chạy được lệnh rcall!!!!! Đó là nguyên nhân khiến các hạ bị tẩu hỏa nhập ma.
    Với AVR, do hoạt động của ngăn xếp theo hướng giảm dần địa chỉ khi cất vào nên người ta thường khởi tạo cho SP = địa chỉ cuối cùng của SRAM. Cụ thể trong AVRStudio thì khởi tạo ngăn xếp như sau:
    ...
    ldi r16,high(RAMEND)
    out SPH,r16
    ldi r16,low(RAMEND)
    out SPL,r16
    ...
    RAMEND là hằng số, chính là địa chỉ cuối cùng của SRAM tương ứng với từng loại AVR. Cái này đã được khai báo và định nghĩa trong file *.inc của loại AVR đó rồi.
    Giang hồ hiểm ác, bảo trọng.

    Comment


    • #3
      Tại hạ đã hiểu, đã hiểu!
      Mà kể cũng quái lạ thật, tại sao trong 8051 stack tăng dần, mà trong AVR lại giảm dần nhỉ?
      À mà có phải 32 thanh ghi R được nối trực tiếp với ALU không?
      PNLab
      Mạch nạp/debug ULink2, Jlink ARM USB
      Mạch nạp AVR, PIC, 8051, MSP430 USB
      Mạch phát triển STM32, ARM9, ARM11
      more...www.pnlabvn.com

      Comment


      • #4
        Mà kể cũng quái lạ thật, tại sao trong 8051 stack tăng dần, mà trong AVR lại giảm dần nhỉ?
        Mỗi loại vi điều khiển có một cơ chế stack riêng, cái quan trọng là chúng đều hoạt động theo nguyên lý vào sau ra trước (LIFO - Last In First Out).
        À mà có phải 32 thanh ghi R được nối trực tiếp với ALU không?
        Đúng thế.

        Comment


        • #5
          chào anh .
          anh có thể giúp em với.
          trong coodvisionavr có hàm dựng sẵn về chuẩn giao tiếp spi mà em ko biết
          sài.em giao tiếp spi atmega16 với adc theo chuẩn spi.
          anh giúp em với.
          chi em cách gọi hàm.hay ham chuẩn của no cung được
          cảm ơn anh nhiều

          Comment


          • #6
            Trong code vision có hỗ trợ thư viện cho giao diện SPI.
            Cách tra tài liệu tham khảo như sau:
            CodeVisionAVR --> Help --> Help Topics --> CodeVisionAVR C Compiler Library Functions --> SPI function
            Trong đó mô tả hàm sử dụng cho SPI có dạng:
            unsigned char spi(unsigned char data)

            Như chỉ dẫn trong help, cách sử dụng như sau:
            #include <spi.h>
            ...
            unsigned char temp,data;
            ...
            temp = spi(data);
            ...

            Giải thích:
            Khi thực hiện giao tiếp SPI, về bản chất có sự hoán đổi byte dữ liệu giữa master và slave. Đối với AVR, dữ liệu truyền đi là biến data còn dữ liệu nhận được sau khi kết thúc quá trình truyền là temp.
            Trong một số trường hợp, người ta chỉ quan tâm đến dữ liệu truyền đi (data) mà không quan tâm nhận được cái gì trong temp. Việc gán temp = spi(data) chỉ là để đảm bảo thực hiện đúng cách gọi 1 hàm có trả về giá trị.
            Trong một số trường hợp khác người ta lại chỉ quan tâm đến giá trị nhận được (temp) mà không cần quan tâm đến giá trị truyền đi (data), lúc này truyền đi một giá trị bất kỳ chỉ để khởi tạo 1 phiên giao tiếp SPI, tạo ra clock đồng bộ phục vụ việc trao đổi dữ liệu.
            Và cuối cùng, cũng có những trường hợp người ta quan tâm đến cả dữ liệu truyền đi (data) và dữ liệu nhận về (temp).
            Trong bài toán của bạn, mega16 sẽ đóng vai trò là master (bạn phải cấu hình cho SPI của mega16 ở master mode), còn ADC sẽ đóng vai trò là slave.
            Thân mến,
            blackmoon.

            Comment


            • #7
              Nguyên văn bởi thanhtung86 Xem bài viết
              chào anh .
              anh có thể giúp em với.
              trong coodvisionavr có hàm dựng sẵn về chuẩn giao tiếp spi mà em ko biết
              sài.em giao tiếp spi atmega16 với adc theo chuẩn spi.
              anh giúp em với.
              chi em cách gọi hàm.hay ham chuẩn của no cung được
              cảm ơn anh nhiều
              Bạn có thể tham khảo thêm trên trang web này về việc sử dụng chuẩn giao tiếp SPI của AVR.
              http://www.openavr.org/AVR_SPI_C_Snippets

              Comment


              • #8
                Mình cũng đang xài AVRStuDio mình thấy cũng được nhưng không xài được lệnh call và jmp.....Hình như mình xai call và jmp thì bộ nhớ tăng thêm đi thì phải?

                Em còn gà lắm !

                Comment


                • #9
                  Nguyên văn bởi HiMas88 Xem bài viết
                  Mình cũng đang xài AVRStuDio mình thấy cũng được nhưng không xài được lệnh call và jmp.....Hình như mình xai call và jmp thì bộ nhớ tăng thêm đi thì phải?

                  Em còn gà lắm !
                  thông thường mỗi AVR Atmel đều cung cấp datasheet
                  bạn nên đọc kỹ phần Instruction Set Summary
                  ví dụ trong Mega 8515 không có lệnh jmp và call mà cứ lập trình thì khi biên dịch nó báo lõi là phải rồi

                  chúc các bạn thành công
                  Điện thoại:
                  email:

                  Comment


                  • #10
                    Sao mà lắm "rjmp RESET" thế??? không biết các hạ định dùng chiêu thức gì đây?

                    Các hạ bị tẩu hỏa nhập ma là do chưa khởi tạo con trỏ ngăn xếp. Dùng chương trình con mà không khởi tạo cho ngăn xếp thì ... toi! Với 8051 các hạ có thể chạy tốt chương trình trên vì ngăn xếp có giá trị default là 07h (nằm trong RAM nội và hoàn toàn là giá trị sử dụng được). Với AVR, giá trị default (giá trị ngay sau reset) là 0x0000. Nhắc lại với AVR, không gian địa chỉ dữ liệu gồm có Register File (R0..31), các thanh ghi I/O và cuối cùng là SRAM. Khi ánh xạ vào không gian địa chỉ dữ liệu, SRAM phải nằm từ địa chỉ 0x0060h trở đi. Ngăn xếp lại cư trú trong SRAM, do đó phải nằm từ địa chỉ lớn hơn 0x0060h (vì hoạt động của ngăn xếp khi cất vào thì giảm địa chỉ). Giá trị default bằng 0x0000h rõ ràng là không hợp lệ vì nó trỏ vào địa chỉ dành cho Register File, không phải là vùng SRAM. Khi dịch không báo lỗi vì không có lỗi cú pháp ở đây, nhưng khi Run thì ngăn xếp không được khởi tạo đúng nên báo lỗi, không chạy được lệnh rcall!!!!! Đó là nguyên nhân khiến các hạ bị tẩu hỏa nhập ma.
                    Với AVR, do hoạt động của ngăn xếp theo hướng giảm dần địa chỉ khi cất vào nên người ta thường khởi tạo cho SP = địa chỉ cuối cùng của SRAM. Cụ thể trong AVRStudio thì khởi tạo ngăn xếp như sau:
                    ...
                    ldi r16,high(RAMEND)
                    out SPH,r16
                    ldi r16,low(RAMEND)
                    out SPL,r16
                    ...
                    RAMEND là hằng số, chính là địa chỉ cuối cùng của SRAM tương ứng với từng loại AVR. Cái này đã được khai báo và định nghĩa trong file *.inc của loại AVR đó rồi.
                    Giang hồ hiểm ác, bảo trọng.
                    Vậy nếu khai báo như trên rồi thì vùng nhớ SRAM mình có thể sử dụng được là từ địa chỉ nào tới địa chỉ nào?
                    Ví dụ Atmega8515, có phải Ramend = 025FH?
                    Nếu là vậy thì vùng SRAM mình có thể lưu dữ liệu chắc chỉ có thể từ 0230h trở xuống?
                    |

                    Comment


                    • #11
                      Tôi cũng làm như vậy đó.

                      Comment


                      • #12
                        t góp ý này nhe
                        khi đưa vào ngăn xếp thì SP bắt đầu từ gái trị Ramend giảm xuống (ngược lại lấy ra thì tăng lên), còn khi lưu dữ liệu thì nên dùng đoạn sram khác và địa chỉ cần lưu vào sram chứa trong X,Y hoặc Z khi lưu dữ liệu.
                        Do vậy muốn lưu dữ liệu vào Sram thì cần ước lượng khối lượng dữ liệu cần lưu và khả năng mình cần sử dụng tối đa ngăn xếp. Nếu ko có thể gây lỗi

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X