Cám ơn bạn success.tl mình đã copy chương trìh của bạn và về mô phỏng cho chạy thử .hình như là code phan MASTER thiếu lệnh set_tris_c(0x00); trong hàm main thì phải ,tưong tự trong SLAVE cũng thiếu lệnh set_tris_d(0x00); trong main .Vi mình thử bỏ 2 hàm này ra chương trình không chạy!
Mình đã dựa cva2o chưong trình trên và viết lại cái của mình:giao tiếp giữa 1 MASTER và 2 SLAVE
CODE SLAVE:
Code:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define SS PIN_A5
//#include <lcd_lib_4bit.c>
//*************************
int8 data;
//*************************
#int_ssp
void ssp_isr(void)
{
if(input(SS)==0)
{
data = spi_read(); //doc tin hieu tu MASTER
set_tris_b(0); //thiet lap PORTB la cong xuat du lieu
output_b(data); //Hien thi ra port B
delay_us(10);
}
}
//*************************
void main()
{
set_tris_a(0xff);
setup_spi(SPI_SLAVE|SPI_L_TO_H|spi_clk_div_16 );
clear_interrupt(INT_SSP);
enable_interrupts(INT_SSP);
enable_interrupts(GLOBAL);
while(1)
{
//Khong lam gi ,cho data den
}
}
//************************
CODE MASTER
Code:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#define SS1 pin_C1 //chan chon chip cho 2 SLAVE
#define SS2 pin_C2
//*********************************
int8 data,i,j;
//*********************************
void change_data() //dich tung bit trong bien data
{
i++;
if(i<=8)data=(data<<1) ; //dich 8 lan gia tri cua data
else
{ data=0x01;
j=1;
}
}
void send_data() //gui du lieu den SLAVE
{
while(1)
{
spi_write(data);
change_data();
delay_ms(100); //Tao tre giua 2 lan truyen
if (j==1) break; //sau 8 lan quet de truyen du lieu den SLAVE ,thoat khoi vong lap
}
}
void main()
{
data = 0x01; //gia tri dau cua bien data
set_tris_c(0);
set_tris_e(0);
setup_spi( SPI_MASTER | SPI_L_TO_H|spi_clk_div_16 );
delay_ms(100);
While(1)
{
output_low(SS1); //chon SLAVE 1 de gui du lieu
output_high(SS2);
send_data();
j=0;
i=0;
output_low(SS2); //chon SLAVE 2 de gui du lieu
output_high(SS1);
send_data() ;
j=0;
i=0;
}
}
//*******************************
link mô phỏng và cả project:
http://www.mediafire.com/?85a3byc85v2ag4h