PDA

View Full Version : Khai báo sử dụng SPI cho 16F877A


cachep47
28-01-2011, 02:20 AM
Chào cả nhà!
Mình đang gặp khó khăn lập trình giao tiếp PIC 16F877A với 74595 qua cổng SPI.
Mình đã mô phỏng qua Proteus thì OK nhưng khi tiến hành chạy mạch thật thì không hiển thị được.
Đoạn chương trình như sau :



// Khai báo ....
#use spi(DO=PIN_C5, CLK=PIN_B3, BITS=8)
Void main()
{
...
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);
...
While(1)
{
spi_write(0xAA);
latch_data();// Chốt dũ liệu hiển thị
delay_ms(1000);

spi_write(0xBB);
latch_data();// Chốt dũ liệu hiển thị
delay_ms(1000);
}
}




Chạy mạch thật thì không có tín hiệu ra .Mình không hiểu đã sai chỗ nào mong các bạn giúp đỡ!
Thanks!

hoc_picpicpic
28-01-2011, 08:30 AM
mô fong chạy dc thì mạch thật của bạn có vấn đề bạn lên kiểm cha lại mạch xem .Ko biết bạn đang dùng con 74L595 hay 74HC595, các chân EN và MR mạch thực đã nối chuẩn chưa .Nếu bạn đang dùng con 74L595 thì nên chuyển qua con 74HC595

cachep47
28-01-2011, 10:11 PM
mô fong chạy dc thì mạch thật của bạn có vấn đề bạn lên kiểm cha lại mạch xem .Ko biết bạn đang dùng con 74L595 hay 74HC595, các chân EN và MR mạch thực đã nối chuẩn chưa .Nếu bạn đang dùng con 74L595 thì nên chuyển qua con 74HC595

Chào Bạn!
Mình làm mạch thật với AVR chạy ngon lành. Vẫn phần cứng như vậy mình làm trên Pic thì lại không được. Mình nghĩ là chỉ tại phần mềm mình chưa khai báo đúng thư viện. Có ai đã làm qua rồi thì chỉ cho mình kiểu khai báo thư viện.

#use spi(DO=PIN_C5, CLK=PIN_C3, BITS=8)
........
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_16);

Mình thiết lập như vậy có sai chỗ nào không?
Mong câu trả lời của các bạn sớm!
Thân!

hoc_picpicpic
29-01-2011, 08:28 AM
bạn làm thế này đảm bảo chạy .


#include <16F877.H>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock = 20000000)


#byte SSPBUF = 0x13
#byte SSPCON = 0x14
#bit BF = SSPSTAT.0
#bit SMP = SSPSTAT.7
#bit CKE = SSPSTAT.6
#bit CKP = SSPCON.4
#bit SSPM1 = SSPCON.1
#bit SSPEN = SSPCON.5

//------------------------------------------
char SPI(char d)
{
SSPBUF=d;
while (!BF);
return SSPBUF;
}

//------------------------------------------
void spi_init()
{

set_tris_c(0b11010011); // sck rc3-0, sdo rc5-0, CS rc2-0.

SMP=0;
CKE=0;
CKP=1;
SSPM1=1;
//SSPM0=1;
SSPEN=1;

}