PDA

View Full Version : dsPIC Tutorial 6 - SPI module và quét LED ma trận


namqn
14-06-2008, 07:40 PM
Tutorial này được bắt đầu khá lâu rồi, nhưng tôi quá bận để hoàn thành nó, do đó đến hôm nay mới post lên. Module SPI được giới thiệu qua 1 ví dụ, và việc quét LED ma trận cũng được minh họa qua 1 ví dụ khác (cho LED 8x8, nguyên tắc có thể mở rộng dễ dàng cho các kích thước khác). Chỉ có mã nguồn cho C30, vì tôi không có thời gian chuyển thành mã hợp ngữ.

Mã nguồn C30 cùng với tập tin hex được dịch sẵn nằm trong tập tin .rar.

Code đã được thử nghiệm trên mạch thực, nhưng phần mạch cho LED đã bị thất lạc khi tôi chuyển nhà 2 lần, do đó tôi chỉ vẽ lại mạch nguyên lý theo suy luận từ code. Mọi góp ý, thắc mắc đề nghị các bạn post ở luồng này.

Chúc các bạn thành công.

Thân,

const_nos
08-09-2008, 12:25 PM
cám ơn anh nhiều về tài liệu của dsPic. Em dang làm chương trinh về xuất kí tự đồ họa của CGRAM cua LCD . nhung vẩn chuă làm được. Anh có vi dụ nào về chương trinh này không(Viết bằng MPLAP, lập trình cho Pic 16f877a). monh sự giúp đỡ của các anh! Cám ơn rất nhiều

namqn: câu hỏi của bạn nên được đặt trong box "Cơ bản về vi điều khiển và PIC".

tranthudo
13-02-2009, 12:20 AM
Hiện nay em cũng rất quan tâm đến vấn đề Dspic đặc biệt trong đó có giao tiếp với máy tính qua SPI, nhưng túi tiền khá hạn chế theo mọi người em nên mua những gì để tiện cho việc thực hành, đạt hiệu quả một cách nhanh nhất và chi phí cũng ít nhứt. THanks

namqn
13-02-2009, 01:28 AM
Hiện nay em cũng rất quan tâm đến vấn đề Dspic đặc biệt trong đó có giao tiếp với máy tính qua SPI, nhưng túi tiền khá hạn chế theo mọi người em nên mua những gì để tiện cho việc thực hành, đạt hiệu quả một cách nhanh nhất và chi phí cũng ít nhứt. THanks
Rất tiếc máy tính lại không dùng SPI để giao tiếp với các thiết bị bên ngoài. SPI được Motorola đề xuất như một giao thức nối tiếp để các bộ xử lý nhúng giao tiếp với các thiết bị ngoại vi.

Thân,

LONG
12-04-2009, 05:58 PM
các đại ca ơi?cho e hỏi mẫu của 1 chương trình ngắt dùng C30,e viết ngắt SPI ở chế độ slave để nhận dữ liệu và xuất ra 1 chân E0

LONG
12-04-2009, 05:59 PM
các anh giúp e xem đoạn code này sai ở đâu với! e thử mà vẫn chưa chạy:

void __attribute__((__interrupt__)) _SPI1Interrupt(void)
{
IFS0bits.SPI1IF = 0;
datard = ReadSPI1();
if(datard <= 3000)
{
_LATE0=1;
//PORTDbits.RD0 = 1;
}
else
{
_LATE0=0;
}

SPI1STATbits.SPIROV = 0;
}

silvadk2
21-04-2009, 05:48 PM
anh xem xem hộ em mới, em viết 1 hàm để ghi dữ liệu lên thẻ MMC rồi đọc, gửi lên mt mà không thấy được, xem hộ em xem sai ở chỗ nào :

unsigned int writeSector(unsigned long sector, unsigned char *buf)
{
unsigned int count=0;
LATBbits.LATB8=0;
MMCCommand(0x58,sector*32,0xFF);
if (MMCResponse(0x00))
{
SPIData(0xFF);
SPIData(0xFE);
for(count = 0; count < 32; count++) SPIData(buf[count]);
SPIData(0xFF);
SPIData(0xFF);
}
LATBbits.LATB8=1;
SPIData(0xFF);
return TRUE;
}
Còn đây là ctr chính :
int main(void)
{
unsigned char Buf[32];
unsigned int i,j;
SystemInit();
disk_initialize();
for(i=0;i<32;i++) Buf[i]=i;
writesector(1,Buf);
SendMessage(Buf);
while(1);
}

em nạp rồi xem trong thẻ mà ko thấy có gì, hic.

silvadk2
21-04-2009, 06:24 PM
D:\Example\LED\main.c:556: undefined reference to `writesector'
Link step failed.

Lỗi này sửa làm sao vậy các bác

namqn
21-04-2009, 07:16 PM
D:\Example\LED\main.c:556: undefined reference to `writesector'
Link step failed.

Lỗi này sửa làm sao vậy các bác
Bạn định nghĩa hàm writeSector(), nhưng lại gọi writesector() trong "main.c", do đó phát sinh lỗi như trên. Các C compiler về nguyên tắc phân biệt hoa thường, do đó hai tên hàm trên là khác nhau.

Thân,

silvadk2
21-04-2009, 07:45 PM
ơ hơ, vậy mà em ko để ý, lỗi thế mà cũng phải hỏi bác, thank bác nhiều nhiều !

robotden
14-09-2009, 05:50 PM
a Nam ơi,sao em viết cho con dspic33 ở chế độ slave không được anh ạ,

robotden
14-09-2009, 06:23 PM
em cấu hình như sau:
1/ giao tiếp spi//////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/////////////////////////////////////////////////////////////
em làm giao tiếp spi giữa con master là dspic30f4011, slave là dspic33fj256gp710. chỉ đơn giản là con master truyền liên tục các số từ 0-255, và slave sẽ nhận tín hiệu dạng word và hiển thị lên LCD, em cấu hình sao mà mãi mạch vẫn chưa chạy được anh à.
con master có lẽ là được rồi, còn con slave vẫn chưa nhận được . em cấu hình như sau:
em có dùng chân B0 của master để điều khiển chân SS của con slave
- con master: //////////////////////////////////////////////////////////////////
void khoi_tao_SPI1_master(void)//cke=1 ckp=0
{
//port master
_TRISF3=0;//sdo1
_TRISF2=1;//sdi1
_TRISF6=0;//sck1
_TRISB0=0;//chon vao ss
#define SS _LATB0

//SPI1STAT
SPI1STATbits.SPIEN=0;//tam thoi khoa
SPI1STATbits.SPISIDL=0;//tiep tuc khi IDLE
SPI1STATbits.SPIROV=0;//ko overflow
//SPI1STATbits.SPITBF=0;//su day bo truyen, readonly
//SPI1STATbits.SPIRBF=1;//1 la day,readonly

//SPI1CON
SPI1CONbits.FRMEN=0;// ko dung Frame,
SPI1CONbits.SPIFSD=0;//xung output cho master
SPI1CONbits.DISSDO=0;//sdo la dung cho spi
SPI1CONbits.MODE16=1;//dung data16bit
SPI1CONbits.SMP=0;//middle sample
SPI1CONbits.CKE=0;//clock tu active-idle-
SPI1CONbits.SSEN=0;//SS dung cho slave
SPI1CONbits.CKP=0;//idle=0,active=1
SPI1CONbits.MSTEN=1;//master mode
SPI1CONbits.SPRE=0;//master mode only
SPI1CONbits.PPRE=1;//master mode only//120khz


//start
SPI1STATbits.SPIEN=1;//khoi dong SPI
}


void ghi_spi1(unsigned int data)//nho pai co ss
{
int temp;
SS=0;
temp=SPI1BUF;
if(SPI1CONbits.MODE16)
{
SPI1BUF=data;LATE=SPI1BUF;
}
else
{
SPI1BUF=data&0xFF;LATE=SPI1BUF;
}
while(SPI1STATbits.SPITBF);//cho den khi gui xong

SS=1;
}

---con slave:///////////////////////////////////////////////////////////////////////////////////////////////////
void khoi_tao_SPI1_slave(void)//cke ckp=0
{
//port slave
_TRISF8=0;//sdo1
_TRISF7=1;//sdi1
_TRISF6=1;//sck1
_TRISB2=1;//ss1

_SPI1IF=0;
_SPI1IE=1;
_SPI1IP=7;
//SPI1STAT
SPI1STATbits.SPIEN=0;//tam thoi khoa
SPI1STATbits.SPISIDL=0;//tiep tuc khi IDLE
SPI1STATbits.SPIROV=0;//ko overflow
//SPI1STATbits.SPITBF=0;//su day bo truyen, readonly
//SPI1STATbits.SPIRBF=1;//1 la day,readonly

//SPI1CON1
//SPI1CON1bits.DISSCK=1;//enable xung sck(chi cho master)
SPI1CON1bits.DISSDO=0;//sdo la dung cho spi
SPI1CON1bits.MODE16=1;//dung data16bit
SPI1CON1bits.SMP=0;//slave mode pai la 0
SPI1CON1bits.CKE=0;//clock tu active-idle-
SPI1CON1bits.SSEN=1;//SS dung cho slave
SPI1CON1bits.CKP=0;//idle=0,active=1
SPI1CON1bits.MSTEN=0;//slave mode
//SPI1CON1bits.SPRE=8;//master mode only
//SPI1CON1bits.PPRE=//master mode only

//SPI1CON2
SPI1CON2bits.FRMEN=0;// ko dung Frame,
SPI1CON2bits.SPIFSD=1;//xung input cho slave
SPI1CON2bits.FRMPOL=1;//active high cho frame
SPI1CON2bits.FRMDLY=0;//xung dong bo khung truoc bit clock dautien

SPI1BUF=0;
//start
SPI1STATbits.SPIEN=1;//khoi dong SPI
}

unsigned int doc_spi1(void)
{

while(!SPI1STATbits.SPIRBF){LCD_gotoxy(1,1);LCD_wr ite_string("treo");}/// trên LCD cho biết là con slave bị dừng ở đây không thoát đi được
if(SPI1STATbits.SPIRBF)
{
SPI1STATbits.SPIROV=0;
if(SPI1CON1bits.MODE16)
{
return(SPI1BUF);//word
}
else
{
return(SPI1BUF&0xFF);//byte
}
}
return -1;
}

robotden
14-09-2009, 06:25 PM
mạch icsp có cần mắc thêm điện trở hay điốt j không anh. nếu có mỗi chip không thì detect được, nếu kết nối mạch với bộ LCD và cấp nguồn 5v cho lcd thì PK2 không detect được chip, em phải rút nguồn 5v ra mới detect được.

thangvbhp
18-09-2009, 02:18 AM
anh NAM a!e moi học pic6f84a mà khó hiểu quá.thầy em bảo làm đề tài về nó bằng cách chạy chữ matrận 8*8 ma e cũng hơi khó hiểu nguyên lý ntn.e chỉ mới viết được đoạn mong anh xem qua và giúp e với.em cảm ơn anh rất nhiều.

#include "p16f84.inc"
temp = 0x0c
temp1 = temp + 1
org 0
bsf status,0
movlw b'11000'
movwf trisa
movlw FFh
movwf trisb
bcf status,0

anh xem giùm em chương trình chính như vậy đã đúng chưa.
giả sử em chạy chữ "B" chẳng hạn

rlf FEH 81H 81H FEH 81H 81H 81H FEH 00H
end

anh sửa giùm em nha
em thực sự cần sự giúp đỡ của anh.

dtduckhung
01-11-2009, 09:12 PM
ec ec. em đang học hợp ngữ. nên đọc mấy cái ccs này chẳng hiểu gì hết. anh nào biết nguyên lý đư data vào 595 giúp em với.
em đang tìm hiểu về 595 để làm đề tài quang báo. nhưng em vẫn chưa hiểu cho lắm về hoạt động của con này. theo em hiểu như thế này không biết có đúnh không, nhờ các anh chỉ giáo thêm :
+khi muốn đưa 1 bit vào thì mình cần 1 xung clock o chân 11 để đưa 1 bit này đi vào thanh ghi bên trong nó và muốn xuất 8 bit ra 8 chân của nó thì ta cần 1 tác động mức cao lên chân 12
+giả sử em muốn truyền 8 bit 10101100 tương ứng ngõ ra từ Q0(mức 0)-Q7(mức 1) thì em truyền theo thứ tự 00110101 vào thanh ghi, như vậy là cần 8 chu kỳ xung clock ở chân 11
+và sau đó em cho chân 12 lên 1 thì 8 bit này được đẩy ra 8 ngõ ra Q0-Q1
thế là 8 em được đẩy ra. như vậy thì cần 1 xung ở chân 12.
Nhưng ở đây em thắc mắc hoài mà không nghĩ ra được. vấn đề là như thế này :
+thứ nhất : theo như ý em tìm hiểu thì chân 11 và 12 là 2 chân có chu kỳ xung khác nhau. Nhưng dướng như tất cả các mạch về quang báo em tìm thấy được trên mạng hầu như chân 11 và 12 mắc chung vời nhau. Nếu như vậy thì 2 chân cùng 1 xung clock.nếu như vậy chắc chắn em đã hiểu sai vấn đề truyền data và xuất dữ liệu ra 8 ngõ ra.
+thứ 2: giả sử em cần xuất 8byte để quyét led matrix 8*8. như vậy thì làm sao để chốt 8byte này đây?để 8byte tiếp sẽ là của con led thứ 2.do em đang làm đồ án thiết kế hiển thị chữ trên 10 led matrix 8*8 dùng bàn phím hex, cách nhấn phím hiển thị như điện thoại.
+thứ 3 : em thấy chân 9 dữ liệu ra nối tiếp của con 1 được mắc với 14 của con tiếp theo. như vậy khi em bấm A, tiếp tục bấm B thì chữ hiển thị là A led 1 và B led 2 hay là B led 1 A led 2.
do em đang học hợp ngữ nên tài liệu toàn là ccs nên em không hiểu gì hết. đó là những thắc mắc của em. mong các bạn, các anh giúp đỡ em. em xin cảm ơn mọi người nhiều lắm.

ngoctan2310
23-11-2009, 09:27 PM
Cách dùng 74HC595
http://www.mediafire.com/?mztzt3myzzn
Mình viết cho 8051 lúc là đồ án nhưng bạn có thể chuyển qua cho PIC .
Nhưng còn một tài liêu Báo cáo vi điều khiển pic tv nữa dịch từ datasheet pic6f877a cậu tìm thử xem, có viết hợp ngữ dùng 74HC595 .

harry_2012
23-11-2010, 05:22 PM
e đang viết chương trình giao tiếp dspic với ma trận phím nhấn 4x4 bằng mplab.xin a và mọi người giúp đỡ,e cám ơn nhiều lắm

untilyou_92
25-10-2013, 05:56 PM
Tutorial này được bắt đầu khá lâu rồi, nhưng tôi quá bận để hoàn thành nó, do đó đến hôm nay mới post lên. Module SPI được giới thiệu qua 1 ví dụ, và việc quét LED ma trận cũng được minh họa qua 1 ví dụ khác (cho LED 8x8, nguyên tắc có thể mở rộng dễ dàng cho các kích thước khác). Chỉ có mã nguồn cho C30, vì tôi không có thời gian chuyển thành mã hợp ngữ.

Mã nguồn C30 cùng với tập tin hex được dịch sẵn nằm trong tập tin .rar.

Code đã được thử nghiệm trên mạch thực, nhưng phần mạch cho LED đã bị thất lạc khi tôi chuyển nhà 2 lần, do đó tôi chỉ vẽ lại mạch nguyên lý theo suy luận từ code. Mọi góp ý, thắc mắc đề nghị các bạn post ở luồng này.

Chúc các bạn thành công.

Thân,
Anh Nam cho e hỏi cái SinTable[91]={0,2,4,7,9,11,13,15,18,20,22,24,26,29,31,33,35,37 ,39,
41,43,46,48,50,52,54,56,58,60,62,64,65,67,69,71,73 ,75,76,78,80,82,83,85,87,
88,90,91,93,94,96,97,99,100,101,103,104,105,107,10 8,109,110,111,112,113,114,
115,116,117,118,119,119,120,121,121,122,123,123,12 4,124,125,125,125,126,126,
126,127,127,127,127,127,127};
thì những giá trị kia là random hay bắt buộc có quy luật gì thế anh e chưa hiểu đám bảng này @@

clubZa
02-12-2016, 04:33 PM
Rất tiếc máy tính lại không dùng SPI để giao tiếp với các thiết bị bên ngoài. SPI được Motorola đề xuất như một giao thức nối tiếp để các bộ xử lý nhúng giao tiếp với các thiết bị ngoại vi.

gclub มือถือ (https://gclub-mobile.bbet88.com/)