![]() |
|
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Sep 2011
Bài gửi: 1
: |
[help]-truyền dữ liệu spi với 2 vi đk pic
Chào các anh, chị trong room. đệ đang làm bài toán về spi.nhưng ko hiểu sao mô phỏng ko chạy được.ý tưởng đệ làm 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. Sau đây là chương trình. 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 led_1(); 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 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; } } //----------------- 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(); } } [CODE] 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) //------------- char OUT,IN; int i=0,mode=0; //------------- void docphim(); void led_2(); 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 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; } } //---------------- 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(); } } [CODE] 3.Đệ biên dịch k có lỗi, thuật toán không phức tạp , khá dễ hiểu.Để nạp trên Protues, thì sau khi bấm phím để Master truyền qua slave....nhưng đợi mãi mà Slave không thấy nhận để hiện thị LCD và đèn sáng. Mong các huynh chỉ bảo thêm....đệ đang nghiên cứu pic ...nên còn hơi non..hiii thay đổi nội dung bởi: DT2K50, 02-01-2013 lúc 07:24 AM. Lý do: CHƯA BIẾT CHO VÀO THẺ CODE |
![]() |
![]() |
![]() |
#2 | |
Nhập môn đệ tử
Tham gia ngày: Aug 2010
Bài gửi: 3
: |
Trích:
Bạn viết hàm kiểm tra ký tự A trong ct ngắt là if(IN=="A") nên slave không nhận được, bạn nên sửa lại là if(IN==65), khi nhận B thì là 66.. |
|
![]() |
![]() |
![]() |
|
|