|
Tài trợ cho PIC Vietnam |
dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC |
|
Ðiều Chỉnh | Xếp Bài |
14-06-2008, 07:40 PM | #1 |
Trưởng lão PIC bang
|
dsPIC Tutorial 6 - SPI module và quét LED ma trận
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
08-09-2008, 12:25 PM | #2 |
Đệ tử 2 túi
Tham gia ngày: Jul 2008
Bài gửi: 33
: |
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". thay đổi nội dung bởi: namqn, 08-09-2008 lúc 07:49 PM. |
13-02-2009, 12:20 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: Mar 2008
Bài gửi: 6
: |
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
|
13-02-2009, 01:28 AM | #4 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
12-04-2009, 05:58 PM | #5 |
Nhập môn đệ tử
Tham gia ngày: Aug 2007
Bài gửi: 2
: |
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
|
12-04-2009, 05:59 PM | #6 |
Nhập môn đệ tử
Tham gia ngày: Aug 2007
Bài gửi: 2
: |
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; } thay đổi nội dung bởi: namqn, 12-04-2009 lúc 06:21 PM. Lý do: định dạng code |
21-04-2009, 05:48 PM | #7 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
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. |
21-04-2009, 06:24 PM | #8 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
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 |
21-04-2009, 07:16 PM | #9 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
21-04-2009, 07:45 PM | #10 |
Đệ tử 2 túi
Tham gia ngày: Nov 2008
Bài gửi: 42
: |
ơ 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 !
|
14-09-2009, 05:50 PM | #11 |
Đệ tử 5 túi
Tham gia ngày: May 2007
Bài gửi: 102
: |
a Nam ơi,sao em viết cho con dspic33 ở chế độ slave không được anh ạ,
__________________
Thật bó tay! |
14-09-2009, 06:23 PM | #12 |
Đệ tử 5 túi
Tham gia ngày: May 2007
Bài gửi: 102
: |
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; } 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; }
__________________
Thật bó tay! thay đổi nội dung bởi: namqn, 14-09-2009 lúc 06:49 PM. Lý do: định dạng code |
14-09-2009, 06:25 PM | #13 |
Đệ tử 5 túi
Tham gia ngày: May 2007
Bài gửi: 102
: |
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.
__________________
Thật bó tay! |
18-09-2009, 02:18 AM | #14 |
Nhập môn đệ tử
Tham gia ngày: Sep 2009
Bài gửi: 2
: |
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. |
01-11-2009, 09:12 PM | #15 |
Đệ tử 1 túi
Tham gia ngày: Mar 2009
Bài gửi: 15
: |
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. |
Tags |
dspic30f spi, led matrix |
|
|