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

          • bqviet
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi bqviet
            Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
            06-12-2025, 17:17
          • nguyendinhvan
            Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
            bởi nguyendinhvan
            Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
            05-12-2025, 19:59
          • afrendly
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi afrendly
            Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
            04-12-2025, 01:27
          • nick22
            Trả lời cho Máy điện châm ?
            bởi nick22
            Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
            01-12-2025, 13:23
          Đang tải...
          X