Thông báo

Collapse
No announcement yet.

giao tiếp 2 ATmega16 sử dụng SPI

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

  • giao tiếp 2 ATmega16 sử dụng SPI

    Chào các bác, em đang làm về giao tiếp 2 con ATmega16 sử dụng giao thức SPI của nó, lập trình bằng codevisionAVR và chạy mô phỏng trên proteus 7.2, em đã tham khảo code trên mạng và datasheet (thấy giống hệt nhau ). nhưng không hiểu sao chạy mô phỏng lại k đc. các bác xem rồi cho em xin ý kiến nhá.
    Cho e hỏi thêm là trạng thái của thanh ghi SPDR là lưu data dạng byte muốn truyền đi, vậy sau khi truyền đi nó còn chứa data đó nữa k? Lúc này e muốn xuất ra 1 PORT nào đó trạng thái của nó thì có đúng là byte đã đc truyền k?
    Mong nhận đc chỉ giáo!

    1 chương trình cho Master,1 chương trình cho Slave:
    Attached Files
    Last edited by quytim; 21-03-2009, 00:52.

  • #2
    Em làm cùng nhóm với bạn trên, chưa test đc khi giao tiếp 2 con AVR.
    Post cái code lên cho dễ nhìn

    Code:
    #include <mega16.h>
    
    //*****************************
    //
    //  SPI module initialization  atmega16
    //
    //*****************************
    
    
    
    #include <delay.h>
    #define DD_MOSI PORTB.5
    #define DD_MISO PORTB.6
    #define DD_SCK  PORTB.7
    #define DDR_SPI  DDRB   
    //#define SPIE SPCR.7 
    #define SPE SPCR.6
    //#define DORD SPCR.5
    #define MSTR SPCR.4
    #define CPOL SPCR.3
    #define CPHA SPCR.2
    #define SPR1 SPCR.1
    #define SPR0 SPCR.0
    #define SPIF SPCR & 0x80    //////////////////
    //#define SPIF SPSR.7 
    //#define WCOL SPSR.6
    //#define MSB SPDR.7 
    //#define LSB SPDR.0
    
    
    void SPI_MasterInit(void)
    {
            // Set MOSI and SCK output, all others input
            DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
            // Enable SPI, Master, set clock rate fck/16
            SPCR = (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(0<<CPOL)|(1<<CPHA);
    }
    
    
    void SPI_sendChar(char spiData)
    {
            /* Start transmission */
            SPDR = spiData;
            /* Wait for transmission complete */
            while(!(SPSR & (1<<SPIF)));
            delay_ms(1);
    
    }
    
    
    void SPI_sendString(unsigned char * s)
    {
            int i = 0;
            while (i < 100) // don't get stuck if it is a bad string
            {
                    if( s[i] == '\0' ) break; // quit on string terminator
                    SPI_sendChar( s [i++] );
            }
    }
    
    
    void main (void)
    {
    //PORTA = 0x00;
    //DDRA = 0xff;
    
    SPI_MasterInit();
    while(1)
    {
    SPI_sendChar('A');
    
    //PORTA = SPDR;
    SPI_sendChar('B');
    SPI_sendChar('\r');
    //SPI_sendString("SPI Master Initialized\r");
    }
    }

    Comment


    • #3
      Chuyện mô phỏng thì tôi chịu.
      Còn câu bạn hỏi:
      Cho e hỏi thêm là trạng thái của thanh ghi SPDR là lưu data dạng byte muốn truyền đi, vậy sau khi truyền đi nó còn chứa data đó nữa k? Lúc này e muốn xuất ra 1 PORT nào đó trạng thái của nó thì có đúng là byte đã đc truyền k?
      Xin trả lời là sau 1 phiên truyền thông SPI, dữ liệu 2 bên sẽ hoán đổi cho nhau. Do đó thanh ghi SPDR sẽ có giá trị mới của bên kia đưa cho nó, chứ ko còn lưu giá trị trước khi truyền nữa.

      Thân mến,
      blackmoon.

      Comment


      • #4
        Các bác bớt chút thời gian xem hộ em cái code thế nào,hic. Coi như code đó em nạp vào AVR,k phải mô phỏng thì nó sai ở đâu k. HELP ME!

        Comment


        • #5
          1/ Cờ SPIF ở cả Master và Slave hiện ko được xóa sau mỗi phiên truyền dữ liệu --> cần bổ sung lệnh xóa.
          2/ Code hiện tại không thể hiện config của SS --> Cần config đúng chân SS ở cả Master và Slave.
          Ở Master, thường để SS là Output và bạn phải viết code để điều khiển nó (SPI không tự control chân này ở chế độ Master).
          Ở Slave, phải để SS là Input, tuy KHÔNG cần phải viết code gì cho chân này.

          Thân mến,
          blackmoon.

          Comment


          • #6
            Nguyên văn bởi blackmoon Xem bài viết
            1/ Cờ SPIF ở cả Master và Slave hiện ko được xóa sau mỗi phiên truyền dữ liệu --> cần bổ sung lệnh xóa.
            2/ Code hiện tại không thể hiện config của SS --> Cần config đúng chân SS ở cả Master và Slave.
            Ở Master, thường để SS là Output và bạn phải viết code để điều khiển nó (SPI không tự control chân này ở chế độ Master).
            Ở Slave, phải để SS là Input, tuy KHÔNG cần phải viết code gì cho chân này.

            Thân mến,
            blackmoon.
            hic, cụ thể thế nào bác nói chi tiết hơn 1 chút cho e với,e còn amater lắm. Cái phần cấu hình chân SS thì e nghĩ trong code của em đã có rồi, vì e thêm vào khi dịch nó cảnh báo là k có tác dụng. Còn code SS như thế nào, bác giúp em cái, e k hiểu lắm.

            Comment


            • #7
              hi
              em cũng làm về giao tiếp giữa 2 vi điều khiển mà tìm mãi kô thấy tí tài liệu nào để đọc cả
              bác nào có cái nào thì có thể share cho em được kô?
              ĐỪNG KHÓC CHO NHỮNG GÌ ĐÃ QUA, MÀ HÃY CƯỜI CHO NHỮNG ĐIỀU SẮP TỚI!

              Comment


              • #8
                mình cũng tự tìm hiểu thôi, code thì tham khảo trong datasheet và trên mạng, post lên rồi thôi, mong sự chỉ giáo thêm của các đại ca mà chưa có

                Comment


                • #9
                  các bác pro đâu hết rối
                  có gì giúp người mới cai các bác
                  ĐỪNG KHÓC CHO NHỮNG GÌ ĐÃ QUA, MÀ HÃY CƯỜI CHO NHỮNG ĐIỀU SẮP TỚI!

                  Comment


                  • #10
                    Nguyên văn bởi quocdat_dtvt Xem bài viết
                    các bác pro đâu hết rối
                    có gì giúp người mới cai các bác
                    Bên AVR mình các bác ấy cũng mệt công nghiên cứu nên cũng có vẻ giấu nghề hay sao ấy. Bài viết hỏi sơ sơ thì các bác ấy trả lời là "đưa code cụ thể lên để hướng dẫn", đến lúc post code lên thì chẳng thấy bài nào trả lời cả???

                    http://www.dientuvietnam.net/forums/...ead.php?t=3597
                    http://www.dientuvietnam.net/forums/...ad.php?t=23127

                    Nếu bài của em có j chưa rõ thì ít ra các bác ấy cũng nên để lại comment để em còn biết. Đằng này 105 lượt đọc mà chẳng có lấy một lời.

                    Comment


                    • #11
                      Em k dùng code sẵn trong mẫu nữa mà dùng CodeWinzadAVR để khởi tạo chế độ cho SPI,e viết đoạn code này trong main, các bác xem rồi góp ý cho e với nhá.
                      đây chỉ là code con Master, e muốn đọc giá trị thanh ghi SPDR trước lúc nó truyền rồi đưa ra PORTA. Còn chương trình phuc vụ ngắt thì e chưa biết viết gì vào trong đó


                      SS=0;
                      SPCR = SPCR & 0x7f; // stop SPI dung truoc do

                      while (1)
                      {
                      delay_ms(1000);
                      SPDR=0xaa; //giá trị cần truyền đi
                      PORTA=SPDR;
                      SPCR = SPCR | 0x80; //gọi ngắt
                      WD = ~WD;
                      };

                      Khi chạy mô phỏng PORTA k thấy gì (đã có DDRA=0xff). mà có cần dùng WD như trên k các bác?
                      Theo nguyên lý thì khi nào bắt đầu truyền? ngay khi đẩy data vào SPDR hay khi có ngắt ạ?

                      Comment


                      • #12
                        Sử dụng SPI của AVR ko phải là vấn đề khó cũng ko phải là dễ. Bản thân tôi cũng chưa sử dụng bao giờ. Nay nhân bạn mở luồng này, tôi cũng muốn tham gia nghiên cứu.
                        - Bạn có thể đặt lại bài toán rõ ràng hơn?
                        - Bạn có thể trình bày cho tôi và mọi người xem bạn đã nghiên cứu gì về cái này rồi?
                        AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                        Xem thêm tại Online Store ---> Click here
                        Mob: 0982.083.106

                        Comment


                        • #13
                          bài toán chỉ là dùng 2 con ATmega16 giao tiếp truyền số liệu cho nhau sử dụng phương thức truyền thông đồng bộ SPI của nó. Ban đầu nên mình chỉ truyền 1 byte data mình muốn truyền từ con Master sang con Slave. Mình nối các chân 2 avr theo datasheet, lúc đầu cũng làm theo code trong đó, thêm thắt để nó chạy được bằng Codevesion, thì a blackmoon có góp ý đó.
                          Cái mình chưa hiểu là cơ chế hoạt động của bộ SPI, khi nào nó truyền, khi nào nó nhận nên chưa viết code chính xác đc.hic. Mình chạy mô phỏng trên Protelus 7.2 , cũng k biết làm thế nào để kiểm tra nó truyền và nhận chính xác hay chưa
                          Mình chỉ định hướng làm thế, còn bước đi cụ thể thì đang nhờ cậy các đàn a đây!

                          Comment


                          • #14
                            Nguyên văn bởi quytim Xem bài viết
                            bài toán chỉ là dùng 2 con ATmega16 giao tiếp truyền số liệu cho nhau sử dụng phương thức truyền thông đồng bộ SPI của nó. Ban đầu nên mình chỉ truyền 1 byte data mình muốn truyền từ con Master sang con Slave. Mình nối các chân 2 avr theo datasheet, lúc đầu cũng làm theo code trong đó, thêm thắt để nó chạy được bằng Codevesion, thì a blackmoon có góp ý đó.
                            Cái mình chưa hiểu là cơ chế hoạt động của bộ SPI, khi nào nó truyền, khi nào nó nhận nên chưa viết code chính xác đc.hic. Mình chạy mô phỏng trên Protelus 7.2 , cũng k biết làm thế nào để kiểm tra nó truyền và nhận chính xác hay chưa
                            Mình chỉ định hướng làm thế, còn bước đi cụ thể thì đang nhờ cậy các đàn a đây!
                            Vậy tức là bạn cũng chưa nghiên cứu gì thêm ngoài việc định hướng như trên và ngồi trông cậy vào các đàn anh.
                            Thế này thì căng nhể.
                            AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                            Xem thêm tại Online Store ---> Click here
                            Mob: 0982.083.106

                            Comment


                            • #15
                              thật ra thì mọi khởi tạo và thiết lập thì dùng cái CodeWInzadAVR của Codeversion nó đã thiết lập cho mình rồi, theo tìm hiểu thì cái khó là phải bật SPI lên đúng lúc truyền dữ liệu, Khi đo bằng oxilo thì đã thấy việc truyền đi (em dùng mạch khác có dùng AT16). nhưng vì truyền 1byte nên khá nhanh, không kiểm tra đc nó truyền và lưu trữ data như thế nào, vì thế mới lên hỏi các Pro mờ

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X