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 07-09-2009, 09:44 PM   #1
conglong
Đệ tử 4 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 68
:
Trích:
Nguyên văn bởi namqn View Post
Bạn sẽ không thể truyền 16 bit dữ liệu liên tiếp. Bạn tách 16 bit dữ liệu thành 2 byte là ổn. Để thiết lập module UART tạo ngắt sau khi nhận được 4 byte, bạn đặt các bit URXISEL<1:0> trong thanh ghi U1STA bằng '11' (giả sử bạn đang dùng module UART1).

Để lấy các byte dữ liệu khi có ngắt, bạn liên tiếp đọc thanh ghi U1RXREG (giả sử bạn đang dùng module UART1). Vì các module UARTx sử dụng bộ đệm FIFO (First-In First-Out), nên các byte được nhận trước sẽ được đọc ra trước. Cụ thể, ví dụ từ máy tính bạn lần lượt gửi các giá trị a, b, c, và d đến dsPIC. Sau khi nhận được giá trị d, dsPIC sẽ tạo ra ngắt, và khi xử lý ngắt, nếu bạn liên tiếp đọc thanh ghi U1RXREG thì bạn sẽ lần lượt nhận được các giá trị a, b, c, và d.

Thân,
ah, dạ em cảm ơn thầy nhiều !
Trân trọng !.
__________________
Không có gì là Không thể, chỉ một điều Không thể khi bạn nghĩ nó Không thể !.
Bạn có thể nếu bạn tin bạn có thể !.
conglong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-10-2009, 09:50 PM   #2
npbaoduy
Đệ tử 2 túi
 
Tham gia ngày: Sep 2008
Nơi Cư Ngụ: Tp. HCM
Bài gửi: 38
:
Hỏi về giao tiếp I2C với ROM 24c512

Em có đoạn code như sau, với ý tưởng là lưu một byte vô ROM (0x66) vào địa chỉ 0001, sau đó đọc lại byte đó và gởi ra cổng nối tiếp, nhưng em không đạt kết quả (không gởi ra cổng nối tiếp được gì)
Code:
int main(void) {
	Init_PORTS();		//Khoi tao cac cong I/O
	Init_I2C();			//Khoi tao module I2C
	Init_UART1_Module();
	Init_TMR1(); 
	//Buoc 1, tao dieu kien START, cho hoat dong I2C hoan tat
	_SEN = 1;
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	//Buoc 2, xuat dia chi cua ROM voi thao tac ghi, cho va kiem tra ACK
	Write_I2C(0xA0);		//Xuat dia chi cua ROM, sap ghi vao ROM
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi dung chuong trinh
	//Buoc 3, xuat dia chi cua thanh ghi dich (target), cho va kiem tra ACK
	Write_I2C(0x00);		//Xuat dia chi cao
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi dung chuong trinh
	Write_I2C(0x01);		//xuat dia chi thap
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi dung chuong trinh
	Write_I2C(0x66);		//Xuat noi dung cua thanh ghi 0x0000
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi dung chuong trinh
	_PEN = 1;	//Tao ra dieu kien STOP
	Wait_I2C();			//Cho hoat dong I2C hoan tat

	// doc du lieu tu ROM va goi ra cong RS232
		_RSEN = 1;			//Tao ra dieu kien START
		Wait_I2C();			//Cho hoat dong I2C hoan tat
		//Buoc 2, ghi dia chi cua ROM, sap thao tac ghi vao ROM
		Write_I2C(0xA0);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi		
		Write_I2C(0x00);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		Write_I2C(0x01);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		_RSEN = 1;			//Tao ra dieu kien RESTART
		Wait_I2C();			//Cho hoat dong I2C hoan tat
		Write_I2C(0xA1);	//Ghi dia chi cua ROM, chuan bi doc tu ROM
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi

		temp = Read_I2C();
		_PEN=1;
		Wait_I2C();
		U1TXREG = temp;
			while(!U1STAbits.TRMT); // cho hoan tat goi byte.	
		while(1) Nop();		
}

//Chuong trinh con khoi tao cac cong I/O
void Init_PORTS(void) {
	LATC = 0xFFFF;		//Tat cac LED (anode chung) noi vao cong E
	TRISC = 0;		//LED noi vao RC5
	TRISG=0;
}

//Chuong trinh con khoi tao module I2C
void Init_I2C(void) {
	I2CCON = 0x8200;		//bit15=I2CEN, bit9=DISSLW (tat Slew Rate
							//Control cho cac toc do baud khac 400 kbps)
	I2CBRG = (((Fcy/baud) - (Fcy/1111111))-1);
}

//Chuong trinh con xuat 1 byte qua module I2C
void Write_I2C(unsigned char d) {
	I2CTRN = d;
}

//Chuong trinh con cho hoat dong 00Master I2C sau cung hoan tat
void Wait_I2C(void) {
	while (!_MI2CIF);
	_MI2CIF = 0;
}

//Chuong trinh con xu ly khi hoat dong I2C bi loi
void I2C_Fail(void) {
	_PEN = 1;		//Tao ra dieu kien STOP
	Wait_I2C();			//Cho hoat dong I2C hoan tat
	LATC &= 0x0000;		//Bat LED noi vao RE0 de bao loi
	U1TXREG = 70;
	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
	_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
}
em xin lỗi vì code hơi dài, nhưng em không hiểu nó sai chỗ nào đành phải gởi lên cho mọi người xem giúp.
Các hàm đọc/ghi I2C em là tương tự TUT4 của anh namqn. Fcy của em là 7372800, baud của I2C = 100khz.
Các chân A0, A1, A2 của ROM em đã nối mass, nên địa chỉ của ROM là A0(ghi) và A1(đọc)
Module UART thì chắc ko sai, vì em đã thử các ví dụ khác, truyền và nhận rất tốt, tốc độ baud cũng ko sai, em đã kiểm tra kỹ, hơn nữa em nghi nếu sai tốc độ baud thì nó sẽ nhận được các ký tự lạ, đằng này không nhận được gì trên máy tính.
ROM thì chắc ko chết, vì em đã mua một con mới về thử .
Vậy có ai biết xin góp ý giúp em, hoặc có một ví dụ nào đó cụ thể về đọc ghi ROM 24c512 thì cho em xin để tham khảo, em cám ơn rất nhiều.

thay đổi nội dung bởi: npbaoduy, 30-10-2009 lúc 09:56 PM.
npbaoduy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-10-2009, 07:47 AM   #3
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
Không thể ghi vào 24C512 rồi đọc ra ngay đâu bạn, cần có khoảng 5 ms để EEPROM hoàn tất thao tác ghi. Sau khi chờ tối thiểu 5 ms, bạn tạo điều kiện START chứ không dùng RESTART được nhé.

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 31-10-2009, 10:08 AM   #4
npbaoduy
Đệ tử 2 túi
 
Tham gia ngày: Sep 2008
Nơi Cư Ngụ: Tp. HCM
Bài gửi: 38
:
Em đã thử rồi, sau khi ghi vào ROM, cho I2C stop, timer chạy, mỗi lần ngắt sau 0.5s mới start i2c và đọc từ rom, nhưng nó chỉ đọc được giá trị 0. Phần giao tiếp I2C thì ko báo lỗi, vì nếu báo lỗi, chương trình sẽ dừng khi vào hàm I2C_Fail(), đằng này chương trình vẫn chạy (có led nhấp nháy và cứ sau mỗi 0.5s đều gởi ra cổng nối tiếp giá trị 0).
Code:
void _ISR _T1Interrupt(void) {
	_T1IF = 0;			//Xoa co ngat
	_LATC4 ^= 1;		//Lat trang thai LED
	_SEN = 1;			//Tao ra dieu kien START
		Wait_I2C();			//Cho hoat dong I2C hoan tat
		
		Write_I2C(0xA0);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		
		Write_I2C(0x00);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		Write_I2C(0x01);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		
		_RSEN = 1;			//Tao ra dieu kien RESTART
		Wait_I2C();			//Cho hoat dong I2C hoan tat
		
		Write_I2C(0xA1);	//Ghi dia chi cua ROM, chuan bi doc tu ROM
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi

		temp = Read_I2C();
		_PEN=1;
		Wait_I2C();
		U1TXREG = temp;
		while (!U1STAbits.TRMT);
}
Nhân tiện đây em cũng xin hỏi, điều kiện start và restart khác nhau như thế nào?
Em xin cám ơn
npbaoduy vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 31-10-2009, 11:34 AM   #5
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 npbaoduy View Post
Em đã thử rồi, sau khi ghi vào ROM, cho I2C stop, timer chạy, mỗi lần ngắt sau 0.5s mới start i2c và đọc từ rom, nhưng nó chỉ đọc được giá trị 0. Phần giao tiếp I2C thì ko báo lỗi, vì nếu báo lỗi, chương trình sẽ dừng khi vào hàm I2C_Fail(), đằng này chương trình vẫn chạy (có led nhấp nháy và cứ sau mỗi 0.5s đều gởi ra cổng nối tiếp giá trị 0).
Code:
void _ISR _T1Interrupt(void) {
	_T1IF = 0;			//Xoa co ngat
	_LATC4 ^= 1;		//Lat trang thai LED
	_SEN = 1;			//Tao ra dieu kien START
		Wait_I2C();			//Cho hoat dong I2C hoan tat
		
		Write_I2C(0xA0);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		
		Write_I2C(0x00);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		Write_I2C(0x01);
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi
		
		_RSEN = 1;			//Tao ra dieu kien RESTART
		Wait_I2C();			//Cho hoat dong I2C hoan tat
		
		Write_I2C(0xA1);	//Ghi dia chi cua ROM, chuan bi doc tu ROM
		if (_ACKSTAT)	I2C_Fail();		//Neu NACK thi xu ly loi

		temp = Read_I2C();
		_PEN=1;
		Wait_I2C();
		U1TXREG = temp;
		while (!U1STAbits.TRMT);
}
Nhân tiện đây em cũng xin hỏi, điều kiện start và restart khác nhau như thế nào?
Em xin cám ơn
Bạn nên thử với các tốc độ baud thấp, đừng thử với tốc độ tương đương tốc độ tối đa ghi trong datasheet của linh kiện.

START có đường truyền ở trạng thái idle đủ lâu, còn RESTART bao gồm STOP đi liền với START (tức là đường truyền không ở trạng thái idle đủ lâu như trường hợp START).

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 31-10-2009, 01:15 PM   #6
npbaoduy
Đệ tử 2 túi
 
Tham gia ngày: Sep 2008
Nơi Cư Ngụ: Tp. HCM
Bài gửi: 38
:
Cám ơn anh nhiều.
Nhưng em nghĩ tốc độ 100khz là nhỏ nhất rồi chứ? Trong datasheet em thấy có 1khz, 4khz và 1mhz lận .
Chắc em sẽ mua một con dsPIC mới về thử, biết đâu nó bị hư gì đấy, về sơ đồ kết nối thì em kiểm tra kỹ rồi, có điện trở 4.7k kéo lên nguồn nữa, loay hoay gần cả tuần mà vẫn chưa giải quyết được.
Nếu có ai đã từng giao tiếp với ROM này được, có thể cho em xin xem qua để tham khảo nhé.
Chúc mọi người vui vẻ.
npbaoduy 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 i2c, dspic30f uart, i2c, rtc


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

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
dsPIC Tutorial 3-Đọc ngõ vào và giao tiếp LCD namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 92 19-02-2017 11:15 PM
dsPIC Tutorial 2-Các kỹ thuật cơ bản namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 33 17-10-2013 11:09 PM
dsPIC Tutorial 5-Module ADC và MCPWM namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 83 12-09-2013 10:33 PM
dsPIC Tutorial 1-Tạo và biên dịch một project (ASM30) namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 16 22-08-2012 12:35 AM
Alternate UART pin??? alexjp dsPIC - Bộ điều khiển tín hiệu số 16-bit 1 02-05-2006 06:26 PM


Múi giờ GMT. Hiện tại là 10:53 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