PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 14-06-2008, 07:40 PM   #1
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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,
File Kèm Theo
File Type: pdf TUT07.01.PVN.NQNT.050107.pdf (156.1 KB, 10880 lần tải)
File Type: rar Vidu6C30.rar (5.0 KB, 3210 lần tải)
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-09-2008, 12:25 PM   #2
const_nos
Đệ 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.
const_nos vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-02-2009, 12:20 AM   #3
tranthudo
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
tranthudo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-02-2009, 01:28 AM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tranthudo View Post
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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-04-2009, 05:58 PM   #5
LONG
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
LONG vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-04-2009, 05:59 PM   #6
LONG
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
LONG vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 05:48 PM   #7
silvadk2
Đệ 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.
silvadk2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 06:24 PM   #8
silvadk2
Đệ 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
silvadk2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 07:16 PM   #9
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi silvadk2 View Post
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,
__________________
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-04-2009, 07:45 PM   #10
silvadk2
Đệ 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 !
silvadk2 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-09-2009, 05:50 PM   #11
robotden
Đệ tử 5 túi
 
robotden's Avatar
 
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!
robotden vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-09-2009, 06:23 PM   #12
robotden
Đệ tử 5 túi
 
robotden's Avatar
 
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;
}
---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;
}
__________________
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
robotden vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-09-2009, 06:25 PM   #13
robotden
Đệ tử 5 túi
 
robotden's Avatar
 
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!
robotden vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-09-2009, 02:18 AM   #14
thangvbhp
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.
thangvbhp vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-11-2009, 09:12 PM   #15
dtduckhung
Đệ 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.
dtduckhung vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Tags
dspic30f spi, led matrix

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam