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
2.Chương trình cho SLAVE
------------
Đây là toàn bộ project của đệ:TRUYEN THONG SPI - VI DK PIC.rar
Mong các huynh góp ý thêm...
* 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; } }
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...
Comment