View Single Post
Old 17-01-2013, 11:24 AM   #5
toila83
Nhập môn đệ tử
 
Tham gia ngày: Aug 2010
Bài gửi: 3
:
Trích:
Nguyên văn bởi dragon2005 View Post
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);
}
toila83 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn