Thông báo

Collapse
No announcement yet.

[-help-] truyền thông spi giữa 2 vi điều khiển pic

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

  • [-help-] truyền thông spi giữa 2 vi điều khiển pic

    Chào các huynh trong diễn đàn. Hiện giờ, đệ đang làm về truyền thông SPI giữa 2 vi điều khiển PIC.Code biên dịch không lỗi, thuật toán khá dễ hiểu...nhưng khi đệ nạp trên Protues thì Master truyền kí tự thì Slave không hiện thị được.Thuật toán như sau:
    * MASTER
    + Đọc phím bấm gửi kí tự (A-B-C-D)
    + Mỗi lần bấm phím (1-2-3-4) led của master(1-2-3-4) và led của slave(5-6-7-8) sẽ sáng.
    + Kí thị gửi và nhận đều được hiện thị trên 2 lcd của master và slave
    * SLAVE
    +Đọc phím bấm gửi kí tự (W-X-Y-Z)
    + Mỗi lần bấm phím (1-2-3-4) led của slave(1-2-3-4) và led của master(5-6-7-8) sẽ sáng.
    + Kí thị gửi và nhận đều được hiện thị trên 2 lcd của slave và master.
    ----------
    CHƯƠNG TRÌNH TRÊN CCS C
    1. Chương trình cho MASTER
    Code:
    #include <16f877A.h> 
    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
    #use delay(clock=20000000) 
    #include <lcd_lib_4bit.c> 
    #use spi(DI=PIN_C4, DO=PIN_C5, CLK=PIN_C3,BITS=16) 
    // ------------------ 
    int i=0,mode=0; 
    char OUT,IN; 
    //----------------- 
    void docphim(); 
    void sent_spi(); 
    void spi(); 
    //----------------- 
    #INT_RTCC 
    void docphim() 
     { 
       set_timer0(100); 
       if(input_state(pin_A0)==0) 
          i=1; 
       if(input_state(pin_A0)==1&&i==1)
        { 
          i=0; 
          mode++;
        }
     } 
    //--------------- 
    #INT_SSP 
    //---------------
    void main() 
     { 
      setup_spi(spi_master|spi_l_to_h|spi_clk_div_16);
      enable_interrupts(INT_SSP); 
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); 
      set_timer0(100); 
      enable_interrupts(int_RTCC);
      enable_interrupts(GLOBAL);
      LCD_Init();
      LCD_PutCmd(0x80);LCD_PutChar("M-GUI:"); 
      LCD_PutCmd(0xC0);LCD_PutChar("M-NHAN:");
      while(true) 
        { 
          sent_spi(); 
          spi(); 
        } 
      }
    //----------------
    void spi() 
     { 
       IN=spi_read(OUT); 
       delay_ms(10); 
       if(IN=="W")
         { 
           output_d(0xef);// SANG LED 5 
           LCD_PutCmd(0xc8); LCD_PutChar("W"); 
         } 
       if(IN=="X") 
         { 
           output_d(0xdf);// SANG LED 6 
           LCD_PutCmd(0xc8); LCD_PutChar("X"); 
         } 
       if(IN=="Y") 
         {
          output_d(0xbf);// SANG LED 7 
          LCD_PutCmd(0xc8); LCD_PutChar("Y"); 
         }
       if(IN=="Z")
         { 
          output_d(0x7f);// SANG LED 8 
          LCD_PutCmd(0xc8); LCD_PutChar("Z"); 
         } 
     } 
    //---------------- 
    void sent_spi() 
     { 
      docphim(); 
      switch(mode) 
       { 
       case 0:LCD_PutCmd(0x87);LCD_PutChar(" "); 
              output_d(0xff); // tat het led
              break; 
               
       case 1:OUT="A"; 
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              delay_ms(10); 
              spi_write(OUT);output_d(0xfe);// led 1 sang 
              break; 
               
       case 2:OUT="B";
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              delay_ms(10); 
              spi_write(OUT);output_d(0xfd);// led 2 sang 
              break;
               
       case 3:OUT="C"; 
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              delay_ms(10); 
              spi_write(OUT);output_d(0xfb);// led 3 sang 
              break;
               
       case 4:OUT="D"; 
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              delay_ms(10); 
              spi_write(OUT);output_d(0xf7);// led 4 sang 
              break;
               
       default:mode=0;
               break; 
          } 
       }
    2.Chương trình cho SLAVE
    Code:
    #include <16f877A.h> 
    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
    #use delay(clock=20M) 
    #include <lcd_lib_4bit.c> 
    #use spi(DI=PIN_C4, DO=PIN_C5, CLK=PIN_C3,BITS=16)
    //------------- 
    unsigned char OUT,IN;
    int i=0,mode=0;
    //------------- 
    void docphim();
    void sent_spi(); 
    void spi(); 
    //----------------
     #INT_RTCC 
    void docphim()
     { 
     set_timer0(100); 
     if(input_state(pin_A0)==0)
        i=1; 
     if(input_state(pin_A0)==1&&i==1)
      {
        i=0;  
        mode++;
      }
     } 
     //---------------------
    #INT_SSP 
    //---------------------
     void main()
      {
      setup_spi(spi_slave|spi_l_to_h|spi_clk_div_16);
      enable_interrupts(INT_SSP); 
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); 
      set_timer0(100); 
      enable_interrupts(int_RTCC);
      enable_interrupts(GLOBAL);
      LCD_Init(); 
      LCD_PutCmd(0x80);LCD_PutChar("S-GUI:"); 
      LCD_PutCmd(0xC0);LCD_PutChar("S-NHAN:"); 
      while(true)
       { 
        sent_spi();
        spi(); 
       } 
      }
    //---------------
    void spi() 
     { 
     IN=spi_read(OUT);
     delay_ms(10);
     if(IN=="A") 
     {
       output_d(0xef);// led 5 sang 
       LCD_PutCmd(0xc8); LCD_PutChar("A");
      } 
     if(IN=="B") 
     { 
       output_d(0xdf);// led 6 sang
       LCD_PutCmd(0xc8); LCD_PutChar("B");
      }
     if(IN=="C")
      { 
       output_d(0xbf);// led 7 sang
       LCD_PutCmd(0xc8); LCD_PutChar("C");
      } 
     if(IN=="D")
      { 
       output_d(0x7f);// led 8 sang 
       LCD_PutCmd(0xc8); LCD_PutChar("D");
      } 
     } 
    //---------------
    void sent_spi() 
     { 
     docphim();
     switch(mode)
     { 
      case 0: LCD_PutCmd(0x87);LCD_PutChar(" ");
             // output_d(0xff); // tat het led
              break;
     
      case 1: OUT="W"; 
              LCD_PutCmd(0x87);LCD_PutChar(OUT);
              spi_write(OUT); delay_ms(10); 
              output_d(0xfe);// led 1 sang 
              break; 
     
      case 2: OUT="X";
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              spi_write(OUT); delay_ms(10); 
              output_d(0xfd);// led 2 sang 
              break; 
     
      case 3: OUT="Y"; 
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              spi_write(OUT); delay_ms(10);
              output_d(0xfb);// led 3 sang
              break;
     
      case 4: OUT="Z"; 
              LCD_PutCmd(0x87);LCD_PutChar(OUT); 
              spi_write(OUT); delay_ms(10); 
              output_d(0xf7);// led 4 sang
              break; 
              
      default:mode=0;
              break;
      } 
     }
    ------------
    Đây là toàn bộ project của đệ:TRUYEN THONG SPI - VI DK PIC.rar
    Mong các huynh góp ý thêm...
    Attached Files

  • #2
    Hi hi, cảm ơn các huynh đã theo dõi topic này,....., bài spi này đệ đã làm được rùi.
    Master truyền slave nhận, và slave truyền master nhận, hoạt động tốt..

    Comment


    • #3
      mình đang học về cái này, đang định học hỏi mà link hỏng rồi

      Comment


      • #4
        Bạn DT2K50 hãy chia sẻ lại Project của bạn đi! Mình thấy rất nhiều người quan tâm. Vì truyền thông qua SPI rất hay! Mình mong bạn sẽ up và hướng dẫn mọi người cùng làm và nghiên cứu nha! Cám ơn bạn!

        Comment


        • #5
          Bạn sang 3 diễn đàn này nhé.Đều là của mình hỏi.
          Trên các diễn đàn này chắc vẫn còn giữ các project bị lỗi hoặc và đã được sửa.Link mediafire bị die rồi bạn ợ.

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          Đang tải...
          X