Trích:
Nguyên văn bởi dragon2005
Mình mới học về PIC có tham khảo về phần SPI, mình viết 1 chương trình để điều khiển led đơn, nhưng ko hiểu sao nó ko chạy vì trình độ còn kém, mong bạn giúp mình: salve kết nối 8led ở portb.
Chương trình Master:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=4000000)
void main(void)
{
int i=0;
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
delay_ms(1000);
spi_write(i);
}
Chương trình Slave:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=4000000)
void main(void)
{
int i,j=0;
output_b(0x00);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4);
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
while(!j)
{
j=spi_data_is_in();
}
i=spi_read();
while(1)
{
output_b(0xff);
delay_ms(100);
output_b(i);
delay_ms(100);
}
}
|
Trong chương trình slave bạn có sử dụng delay, nếu trong thời gian delay mà con master có gửi dữ liệu đến slave cũng đâu có nhận được dù bạn có sử dụng thuật toán thăm dò.Bạn nên sử dụng ngắt :
#INT_SSP
void ngat()
{
i=spi_read();
}
void main(void)
{
int i,j=0;
output_b(0x00);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4);
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
while(1)
{
output_b(0xff);
delay_ms(100);
output_b(i);
delay_ms(100);
}