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 Bài Trong Ngày 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 24-02-2009, 10:36 PM   #1
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
Giao tiếp 2 dspic bằng I2C

em đọc TUT của anh Nam về giao tiếp i2c. em làm lại dùng 2 con dspic 30f2010 giao tiếp với nhau .code master em chỉ chỉnh 1 chút ,slave em viết ,nhưng không hỉu sao nó không chạy ji hết.
Master em gửi dữ kiệu xuống ,slave nhận và xuất ra port B em dùng ngắt để nhạn dữ liệu của master trong ngắt em bật led nối vào portE0 để kiểm tra nhưng cũng không thấy xẩy ra ngắt luôn .Mong các bác giúp đỡ em nhé.thanks
Mater
Code:
#include "p30f2010.h"

	_FOSC(CSW_FSCM_OFF & XT_PLL4); //clock 32MHZ
	_FWDT(WDT_OFF);
	_FBORPOR(PBOR_OFF & MCLR_EN);
	_FGS(CODE_PROT_OFF);

#define	Fcy		8000000		//Tan so thuc thi lenh
#define	baud	100000	//Toc do baud cua giao tiep I2C

void Init_PORT(void);
void Init_I2C(void);
void Write_I2C(unsigned char);
unsigned char Read_I2C(void);
void Wait_I2C(void);
void I2C_Fail(void); 

int main(void) {
	Init_PORT();		//Khoi tao cac cong I/O
	Init_I2C();			//Khoi tao module I2C
	while (1)
	{
		// b1 start 
		_SEN =1 ;
		Wait_I2C();
		// gui dia chi 
		Write_I2C(0xA0);
		if (_ACKSTAT) I2C_Fail();
		//gui data 
		Write_I2C(0x02);
		if (_ACKSTAT) I2C_Fail();
		Write_I2C(0x03);
		if (_ACKSTAT) I2C_Fail();
		// gui stop
		_PEN=1;
		Wait_I2C();
		LATEbits.LATE0=1; // bao hieu xong 
	}
	
}
void Init_PORT()
{
LATB=0x00;// port B OutPut 
TRISB=0x00;
LATE=0x00;// port B OutPut 
TRISE=0x00;
}

void Init_I2C()
{
I2CCON=0x8200;//I2c che do 7 bit tat slew rate
I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);//toc do boaud cho I2C
}

void Write_I2C(unsigned char d) {
	I2CTRN = d;
	Wait_I2C();
}
 
void Wait_I2C()
{
while (!_MI2CIF)
_MI2CIF =0;
}

void I2C_Fail(void)
{
	_PEN = 1;		//Tao ra dieu kien STOP
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	LATB = 0x000F;		//Bat LED noi vao port b de bao loi
	while (1);			//Dung chuong trinh tai day
}

unsigned char Read_I2C(void) {
	unsigned char d;
	_RCEN = 1;				//Cho phep nhan byte
	Wait_I2C();				//Cho hoat dong I2C hoan tat
	d = I2CRCV;				//Lay byte da nhan dat vao d
	if (_ACKSTAT) _ACKDT = 1;		//Neu NACK thi bat ACKDT
	else _ACKDT = 0;		//Nguoc lai thi tat ACKDT
	_ACKEN = 1;				//Ghi bit ACK/NACK ra I2C bus
	Wait_I2C();				//Cho hoat dong I2C hoan tat
	return d;				//Tra byte da doc ve chuong trinh goi
}
Slave
Code:
#include "p30f2010.h"
//slave
	_FOSC(CSW_FSCM_OFF & XT_PLL4);
	_FWDT(WDT_OFF);
	_FBORPOR(PBOR_OFF & MCLR_EN);
	_FGS(CODE_PROT_OFF);

#define	Fcy		8000000		//Tan so thuc thi lenh
#define	baud	100000	//Toc do baud cua giao tiep I2C
#define _ISR_PSV __attribute__((interrupt, auto_psv))
#define ms_count 125

void Init_TMR1(void);
void Delay_ms(unsigned char); 
void Init_PORT(void);
void Init_I2C (void);
unsigned char temp;
unsigned char buff[3];
unsigned short buff_idx;

int main(void)
{
Init_PORT();
Init_TMR1();
Init_I2C();
buff_idx=0;
	while(1)
	{
		LATEbits.LATE1=1;
	}
}

void Init_PORT(void)
{
	LATB=0x00;
	TRISB =0x00;// port B out 
	LATE=0x00;// port B Out Put 
	TRISE=0x00;	
}

void Init_I2C(void)
{	
	I2CCON=0x9040;
	I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
 	I2CADD = 0xA0	;	// dia chi slave 

	_SI2CIF=0;	// xoa co ngat I2C
	_SI2CIE=1;// cho phep ngat I2C slave
}


void _ISR_PSV _SI2C1Interrupt(void)
{
	unsigned char temp,i;	
	if (_R_W==0 && _D_A==0) // neu du lieu truyen vao la read +dia chi
		{
			temp=I2CRCV;// doc de giai phong bo dem
		}
	else if(_R_W==0 && _D_A==1)// neu data truyen vao la read+du lieu
		{
			temp=I2CRCV;// doc data luu vao buff[3]
			buff[buff_idx++]=temp;	
			_STREN=1;
		}
	else if (_R_W==1 && _D_A==0)// neu du lieu nhan la write+dia chi 
		{
			temp=I2CRCV;// doc giai phong bo dem 
			I2CTRN=buff[buff_idx++];
			while(I2CSTATbits.TBF);//Wait till all
			_STREN=1;
		}

	for (i=0 ;i<3;i++)	// xuat data ra portb
	{
		LATB=buff[i];
		Delay_ms(2);
	}
	
	LATEbits.LATE0=1;	// bat led noi vao bitE0 de kiem tra x/r ngat
	_SI2CIF = 0;	// clear interrupt  flag
}

void Init_TMR1(void)
{
	TMR1=0;
	PR1=ms_count;
	T1CON=0x0030;//1:256
}

void Delay_ms(unsigned char n)
{
	PR1 =n*ms_count ;
	T1CONbits.TON=1;
	while (_T1IF==1)
	T1CONbits.TON=0;
	_T1IF=0;
}
mong được sự giúp đỡ

thay đổi nội dung bởi: tiendungkct, 24-02-2009 lúc 10:42 PM.
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-02-2009, 11:11 PM   #2
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ước hết, bạn đã chọn tốc độ là 100 kHz. Theo bảng 22-36 trong datasheet của dsPIC30F2010 (phiên bản DS70118G), thời gian bus rỗi tối thiểu là 4.7 us. Với code cho master hiện thời của bạn, tôi cho rằng thời gian này có thể bị vi phạm.

Đối với slave, bạn xem lại giá trị địa chỉ được nạp vào thanh ghi I2CADD (giá trị mà bạn đang dùng là 7-bit địa chỉ được dịch trái 1 bit và kết hợp với bit R/W, chứ không phải là 7-bit địa chỉ chính xác). Chú ý rằng các địa chỉ 7 bit hợp lệ nằm trong phạm vi 0x04 - 0x77.

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 25-02-2009, 07:52 PM   #3
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
Trích:
Nguyên văn bởi namqn View Post
Trước hết, bạn đã chọn tốc độ là 100 kHz. Theo bảng 22-36 trong datasheet của dsPIC30F2010 (phiên bản DS70118G), thời gian bus rỗi tối thiểu là 4.7 us. Với code cho master hiện thời của bạn, tôi cho rằng thời gian này có thể bị vi phạm.
nếu như anh nói thì sau mỗi lần truyền mình phải có thời gian delay >=4.7us hả anh

Trích:
Nguyên văn bởi namqn View Post
Đối với slave, bạn xem lại giá trị địa chỉ được nạp vào thanh ghi I2CADD (giá trị mà bạn đang dùng là 7-bit địa chỉ được dịch trái 1 bit và kết hợp với bit R/W, chứ không phải là 7-bit địa chỉ chính xác). Chú ý rằng các địa chỉ 7 bit hợp lệ nằm trong phạm vi 0x04 - 0x77.
em chưa hỉu lắm ý của anh, anh có thể nói rõ hơn không anh ?.theo em biết thì địa chỉ trong thanh ghi I2CADD<6:0> được so sánh với I2CRSR<7:1> nên em chưa hỉu câu "giá trị mà bạn đang dùng là 7-bit địa chỉ được dịch trái 1 bit và kết hợp với bit R/W, chứ không phải là 7-bit địa chỉ chính xác" .mong anh giải thích cho em hỉu ,em cám ơn anh nhìu
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-02-2009, 08:22 PM   #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 tiendungkct View Post
nếu như anh nói thì sau mỗi lần truyền mình phải có thời gian delay >=4.7us hả anh
Bạn nên đảm bảo điều kiện này. Sau điều kiện STOP thì phải có thời gian để bus ở trạng thái IDLE tối thiểu là 4.7 us, rồi mới đến điều kiện START kế tiếp. Vòng lặp chính của bạn có thể chạy quá nhanh ở phần cuối, sau khi hoàn tất điều kiện STOP.

Trích:
Nguyên văn bởi tiendungkct View Post
em chưa hỉu lắm ý của anh, anh có thể nói rõ hơn không anh ?.theo em biết thì địa chỉ trong thanh ghi I2CADD<6:0> được so sánh với I2CRSR<7:1> nên em chưa hỉu câu "giá trị mà bạn đang dùng là 7-bit địa chỉ được dịch trái 1 bit và kết hợp với bit R/W, chứ không phải là 7-bit địa chỉ chính xác" .mong anh giải thích cho em hỉu ,em cám ơn anh nhìu
Trong lệnh đặt địa chỉ slave từ master gửi đi, bạn dùng 0xA0. Trong giá trị 0xA0 này, 7 bit cao nhất của nó là địa chỉ của slave, còn bit thấp nhất là bit R/W. Do đó, trong đoạn code cho slave, bạn phải đặt giá trị (0xA0 >> 1) = 0x50 vào I2CADD, chứ không phải 0xA0.

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 26-02-2009, 09:53 AM   #5
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
em đã thay địa chỉ của slave là 0x50 (vẫn giữ lại địa chỉ slave mà master truyền cho slave[0xA0] ) mà vẫn không được ,ngắt từ slave vẫn không xẩy ra .giờ em cũng chẳng biết sai ở đâu nữa mong được anh giúp.
master em đã bỏ đoạn truyền ra khỏi while(1)
cảm ơn anh nhiều.
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-02-2009, 05:16 PM   #6
nthanhluan87
Nhập môn đệ tử
 
Tham gia ngày: Jun 2008
Bài gửi: 2
:
Hình như chỉ có dòng 33F mới có: void _ISR_PSV _SI2C1Interrupt(void)
Còn dong 30F chỉ có 1 module I2C nên Bác dư một con số 1 thì phải : _SI2CInterrupt
Mình thấy Code ví dụ của Microchip ở địa chỉ (http://www.microchip.com/stellent/id...GE&nodeId=2622)
tài liệu :CE145 - Using I2C module as a Slave device
thấy họ không có thiết lập tốc độ baund cho Slave.
Mình chỉ thấy đến đó thôi chứ thực sự mình cũng đang gặp vấn đề hệt như bác.
Mình cũng dùng địa chỉ Master và Slave như Anh Nam nói, cũng không cách nào cho Slave ngắt được mà cũng không biết cách nào kiểm tra xem thanh ghi I2CRSR (Thanh ghi tạm để đưa vào I2CRCV) xem Master có gởi xuống Bus đúng giá tri địa chỉ đó không?
Anh Nam có cách nào chỉ em với !
Em mong Anh Nam chỉ giúp tụi em, Anh thử viết một bài mẫu có cả code cho Master và Slave tương thích với nhau (Dùng C30).
Em đã tìm khắp các nơi, chỗ có code cho Slave thì không có code cho Master và ngược lại.
Thực sự, kể cả trên Microchip không có cặp đôi nào tương thích cả.
Mong Anh Nam và các Anh ai biết thì chỉ giúp cho đàn em.
nthanhluan87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-03-2009, 08:18 AM   #7
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
Không ai giúp em vụ này sao ?
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-03-2009, 01:39 PM   #8
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
Mình cũng đang làm giao tiếp 2 dspic, sau một hồi test đã chạy
bạn thử kiểm tra lại phần cầu hình các chân xem, đo điện áp 2 dây SCL và SDA lúc không truyền có bằng 5V không
mình cấu hình cho slave như sau:
Code:
	_I2CEN = 1; // enable
	_DISSLW = 1; // Disable slew rate control
	_GCEN = 0;	// Disable/Enable interrupt when a general call address is recevie
	_SCLREL = 1; // release clock pin
	
	I2CADD = 0x50;	// slave address
	I2CBRG = (((Fcy/I2C_Baud_Rate) - (Fcy/1111111))-1);
	
	_SI2CIF = 0;	// clear slave interrupt flag
	_SI2CIE = 1; // Enable slave interrupt
còn hàm ngắt thì bạn đổi tên lại như bác nthanhluan87 đã nói
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 02-03-2009, 01:43 PM   #9
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
ah mà chữ kct sau nick bạn nghĩa là gì thê )
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2009, 09:51 AM   #10
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
đúng là mình đo 2 chân SDA & SCL không có ji cả.
bạn gửi code của bạn cho minh tham khao dc không nhỉ ? thanks

thay đổi nội dung bởi: tiendungkct, 03-03-2009 lúc 10:13 AM.
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2009, 11:22 AM   #11
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
code của mình hơi dài, mình đang làm cái project mà, mail bạn là gì mình send vào mail cho
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2009, 05:34 PM   #12
nthanhluan87
Nhập môn đệ tử
 
Tham gia ngày: Jun 2008
Bài gửi: 2
:
Chào bác mtuankct, mình vẫn không làm cách nào cho con Slave xảy ra ngắt cả.
Ngay cả khi cấu hình Slave giống(tương tự) như bác nói. Mình làm với master là 4011 và Slave là 4013.
Bác làm nó chạy rồi, mong bác bỏ ít thời gian, tốt bụng post lên cho anh em học hỏi.
Hoặc nếu được bác có thể gửi email cho mình được không ?
nthanhluan87@yahoo.com
Cảm tạ bác nhiều.
nthanhluan87 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2009, 06:30 PM   #13
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
mình viết cái đk động cơ BLDC, nó hơi dài ngại chia ra, thôi các bác cứ lấy cả về mà xem, trong này có 2 cai project, một cái cho Slave và một cái cho Master
File Kèm Theo
File Type: rar code.rar (187.8 KB, 182 lần tải)

thay đổi nội dung bởi: mtuankct, 03-03-2009 lúc 06:41 PM.
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-03-2009, 06:45 PM   #14
mtuankct
Đệ tử 6 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 125
:
lúc đầu mình làm nó cũng mắc một số lỗi, các bác nên test từng bước, xem nó đã truyền start được chưa, đã nhận đia chỉ chưa... thế sẽ dễ kiểm tra lỗi hơn
mtuankct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2009, 07:27 PM   #15
tiendungkct
Đệ tử 4 túi
 
Tham gia ngày: May 2007
Bài gửi: 69
:
Trích:
Nguyên văn bởi nthanhluan87 View Post
Chào bác mtuankct, mình vẫn không làm cách nào cho con Slave xảy ra ngắt cả.
Ngay cả khi cấu hình Slave giống(tương tự) như bác nói. Mình làm với master là 4011 và Slave là 4013.
Bác làm nó chạy rồi, mong bác bỏ ít thời gian, tốt bụng post lên cho anh em học hỏi.
Hoặc nếu được bác có thể gửi email cho mình được không ?
nthanhluan87@yahoo.com
Cảm tạ bác nhiều.
mình cũng bị như vậy nhưng mình giải quyết ok rùi
bạn có treo điện trở 2 chân SDA & SCL lên là ok thui mà
tiendungkct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lờ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à 09:19 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