PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   dsPIC Tutorial 6 - SPI module và quét LED ma trận (http://www.picvietnam.com/forum/showthread.php?t=2481)

namqn 14-06-2008 07:40 PM

dsPIC Tutorial 6 - SPI module và quét LED ma trận
 
2 Attachment(s)
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

Trích:

Nguyên văn bởi tranthudo (Post 22569)
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:

Code:

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

Trích:

Nguyên văn bởi silvadk2 (Post 25067)
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: //////////////////////////////////////////////////////////////////
Code:

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:///////////////////////////////////////////////////////////////////////////////////////////////////
Code:

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_write_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

giúp em điều khiển matrận 8*8 bằng pic6f84
 
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.


Múi giờ GMT. Hiện tại là 02:56 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam