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 18-09-2006, 08:27 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 4-Module UART và I2C

Tutorial 4 cho dsPIC, viết bằng ASM30 lẫn C30, giới thiệu các module UART và I2C (chế độ master). Các ví dụ về module UART thực hiện giao tiếp với máy tính. Các ví dụ về module I2C thực hiện giao tiếp với vi mạch thời gian thực DS1307.

Tập tin "Vidu4.zip" gồm các tập tin nguồn hợp ngữ và .hex. Tập tin "Vidu4C30.zip" gồm các tập tin nguồn C và .hex.

Thân,
File Kèm Theo
File Type: pdf TUT05.01.PVN.NQNT.040906.pdf (94.2 KB, 8783 lần tải)
File Type: zip Vidu4.zip (11.0 KB, 2760 lần tải)
File Type: zip Vidu4C30.zip (9.7 KB, 4036 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 05-08-2007, 04:17 PM   #2
ntuan
Nhập môn đệ tử
 
Tham gia ngày: Aug 2005
Bài gửi: 3
:
anh nam ơi , em đã nạp thử chương trình của anh . NHưng khi hiển thị trên máy tính toàn kí tự lạ thôi , không ra được chữ hello . Anh tự lập trình chương trình nhận trên máy ạ . Cách thức nhận như thế nào hả anh ..
ntuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-08-2007, 06:38 PM   #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
Trích:
Nguyên văn bởi ntuan View Post
anh nam ơi , em đã nạp thử chương trình của anh . NHưng khi hiển thị trên máy tính toàn kí tự lạ thôi , không ra được chữ hello . Anh tự lập trình chương trình nhận trên máy ạ . Cách thức nhận như thế nào hả anh ..
Tôi chỉ dùng Hyper Terminal của Windows để thử thôi, không có gì đặc biệt. Bạn chú ý là code chương trình sẽ tương ứng với baud rate = 38400 bps, không dùng parity, 1 stop bit khi chạy ở tần số clock = 32 MHz (chip được cấu hình là dùng bộ dao động nội FRC với 4x PLL). Với dsPIC30F4012 mà tôi có, tần số dao động của chip là 8 MHz.

Bạn kiểm tra lại xem cấu hình của Terminal đã phù hợp hay chưa.

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 06-08-2007, 05:21 PM   #4
ntuan
Nhập môn đệ tử
 
Tham gia ngày: Aug 2005
Bài gửi: 3
:
cấu hình truyền nhận em chọn baud rate = 38400 bps (mắc lỗi 0,16% ở tốc độ truyền này ). Nhưng khi em dùng chương trình truyền 1 số từ PC và gửi trả lên PC . Chỉ khi gửi các chữ số xuống thì nhận lại đúng 100% còn khi gửi các kí tự , chữ cái thì bị trả về giá trị sai hết.
ntuan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-08-2007, 06:13 PM   #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 ntuan View Post
cấu hình truyền nhận em chọn baud rate = 38400 bps (mắc lỗi 0,16% ở tốc độ truyền này ). Nhưng khi em dùng chương trình truyền 1 số từ PC và gửi trả lên PC . Chỉ khi gửi các chữ số xuống thì nhận lại đúng 100% còn khi gửi các kí tự , chữ cái thì bị trả về giá trị sai hết.
Bạn có thể post phần code của mình lên không. Về nguyên tắc, nếu code của bạn chỉ lặp lại những gì đã nhận được từ PC thì không có lý nào nó lại chạy đúng với một số mã và chạy sai với những mã khác. Có lẽ vấn đề nằm trong code cho dsPIC của bạn, cũng có thể là bạn thiết lập cấu hình cho Terminal chưa chính xác (tôi đã nêu đầy đủ thông tin về baud rate, parity, và stop bit).

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 18-08-2007, 02:05 AM   #6
scentoflove
Đệ tử 6 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 129
:
Anh Nam ơi, trong phần i2c hàm read_i2c sau khi set bit RCEN anh gọi wait_i2c và sau khi send ack a cũng gọi wait_i2c. Em sử dụng trên dspic33fj256GP710 thì bị treo 2 chổ đó. Em bỏ đi thì không bị treo nữa.
Anh giải thích dùm em chổ này.
scentoflove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-08-2007, 03:03 AM   #7
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 scentoflove View Post
Anh Nam ơi, trong phần i2c hàm read_i2c sau khi set bit RCEN anh gọi wait_i2c và sau khi send ack a cũng gọi wait_i2c. Em sử dụng trên dspic33fj256GP710 thì bị treo 2 chổ đó. Em bỏ đi thì không bị treo nữa.
Anh giải thích dùm em chổ này.
Code của tôi viết cho dsPIC30F4012 chỉ có 1 module I2C, nên trong Wait_I2C() kiểm tra cờ _MI2CIF, còn chip của bạn có 2 module với cách gọi tên các cờ ngắt tương ứng khác đi. Đúng ra thì khi bạn dùng code cũ của tôi cho dsPIC33FJ256GP710 thì phải nhận được thông báo lỗi khi biên dịch mới đúng. Bạn sửa lại tên bit cần kiểm tra cho đúng (_MI2C1IF hay _MI2C2IF) trong hàm Wait_I2C() là có thể dùng với chip của bạn.

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 18-08-2007, 05:50 PM   #8
scentoflove
Đệ tử 6 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 129
:
Cái này em có sửa rồi đúng với thanh ghi cũng như cờ ngắt, hàm wait_i2c() hoạt động bình thường, hàm write_i2c() gọi wait_i2c() vẫn chạy được khi em xuất dữ liệu ra nhưng read_i2c() thì bị treo
scentoflove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-08-2007, 06:41 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 scentoflove View Post
Cái này em có sửa rồi đúng với thanh ghi cũng như cờ ngắt, hàm wait_i2c() hoạt động bình thường, hàm write_i2c() gọi wait_i2c() vẫn chạy được khi em xuất dữ liệu ra nhưng read_i2c() thì bị treo
Trong trường hợp này tôi chưa có đủ thông tin. Vì khi đọc từ ngoại vi thì thông thường master sẽ ghi ra trước rồi tạo RESTART, sau đó mới đọc về từ ngoại vi. Theo tài liệu dsPIC33F FRM - Section 19 về I2C thì sau cạnh xuống của xung clock thứ 8 thì module cũng sẽ bật cờ ngắt MI2CxIF, do đó theo tôi phần wait_i2c() vẫn có thể được dùng để phát hiện thời điểm hoàn tất việc nhận từ ngoại vi. Bạn nên post phần code đó để tiện phân tích. Chứ chỉ nói rằng wait_i2c() làm việc với write_i2c() mà không làm việc với read_i2c() thì tôi bó tay. Vì những hàm đó là do bạn viết ra.

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

thay đổi nội dung bởi: namqn, 25-10-2007 lúc 12:56 AM.
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-08-2007, 05:23 PM   #10
scentoflove
Đệ tử 6 túi
 
Tham gia ngày: Mar 2006
Bài gửi: 129
:
Code em viết trong file .h. Dựa vào TUT của anh bỏ đi một số phần kiểm tra cờ.
File Kèm Theo
File Type: rar i2c.rar (574 Bytes, 291 lần tải)
scentoflove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-11-2008, 07:42 PM   #11
han_nang_008
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Bài gửi: 19
:
bác nào giúp em với, em viết chương trình gửi kí tự lên PC, và từ PC gửi xuống 30F4011, nhưng đều ra các kí tự là, %!@&....

code nhận dữ liệu từ PC
Code:
#include "p30f4011.h"
#include "uart.h"

	_FOSC(CSW_FSCM_OFF & FRC_PLL4);		//Clock = 32 MHz
	_FWDT(WDT_OFF);
	_FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
	_FGS(CODE_PROT_OFF);

//Chuong trinh cau hinh UART
//------------------------------------------------------------------------------
void Uart_Setup(void)
{
	unsigned int baudvalue,U2MODEvalue,U2STAvalue;
	CloseUART2();
	ConfigIntUART2(	UART_RX_INT_EN & UART_RX_INT_PR6 &
					UART_TX_INT_DIS & UART_TX_INT_PR1 ) ;
				
	baudvalue = 	(((7370000/9600)/16)-1);					//baud=9600 bps ==> nhaapj vaof baudvalue = (((7370000/9600)/16)-1) voi  Fcy = 7.37 Mhz,
	
	U2MODEvalue =	UART_EN & UART_IDLE_STOP & UART_RX_TX &
					UART_DIS_WAKE & UART_DIS_LOOPBACK &
					UART_DIS_ABAUD & UART_NO_PAR_8BIT &
					UART_1STOPBIT;
				
	U2STAvalue = 	UART_INT_TX &
					UART_TX_PIN_NORMAL &
					UART_TX_ENABLE &
					UART_INT_RX_CHAR &
					UART_ADR_DETECT_DIS &
					UART_RX_OVERRUN_CLEAR;
	OpenUART2(U2MODEvalue, U2STAvalue, baudvalue);
}

//========================== UART1 Interrupt Sub-Routine =====================//
void __attribute__((__interrupt__)) _U2RXInterrupt(void)
{
	_U1RXIF = 0;				//Xoa co ngat 
	lcd_putstr(ReadUART2());	//xuat chuoi ra LCD
	
}



//Chuong trinh chinh
//------------------------------------------------------------------------------
void main() 
{	ADPCFG = 0xFFBF;		//Cac chan khac la digital, chan AN0/RB0 la analog
	_TRISE3 = 0;
	Uart_Setup();			
	Init_PORTS_LCD();			//Khoi tao cac cong I/O

	Init_LCD();					//Khoi tao LCD	
    lcd_putstr("TOC DO =");


	while (1) 
	{	
		_LATE3=1;
		Delay_ms(250);			//Vong lap chinh
		_LATE3=0;
		Delay_ms(250);
	}
}
code gủi dữ liệu lên PC
Code:
#include "p30f4011.h"

	_FOSC(CSW_FSCM_OFF & FRC_PLL4);		//Clock = 32 MHz
	_FWDT(WDT_OFF);
	_FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
	_FGS(CODE_PROT_OFF);

//Cac prototype cho cac chuong trinh con
void Init_TMR1(void);
void Init_UART2_Module(void);

//Bang hang so trong ROM

unsigned char Chuoi1[] = "Xin chao!";

//Cac bien toan cuc
unsigned char flag, idx;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
	Init_TMR1();			//Khoi tao Timer 1
	Init_UART2_Module();	//Khoi tao module UART1
	flag = 0;				//Xoa co bao het thoi gian cho
	while (1) {
		if (flag) {			//Cho den khi het thoi gian cho
			idx = 0;
			while (Chuoi1[idx]) {	//Neu chua het chuoi thi
				U2TXREG = Chuoi1[idx++];	//Xuat tiep 1 ky tu
				while (!U2STAbits.TRMT);	//Cho den khi truyen xong ky tu
			};
			flag = 0;
		};
	};
}

//Chuong trinh con khoi tao module UART1
void Init_UART2_Module(void) {
	U2MODE = 0x8000;		//Main I/O, 8-bit, no parity, 1 stop bit
	U2STA = 0x0400;			//bit10=UTXEN
	U2BRG = (((7370000/9600)/16)-1);	//38400 bps @ Fcy = 8 MHz
}

//Chuong trinh con khoi tao Timer 1, tran sau moi 1 giay o muc xung 8 Mips
void Init_TMR1(void) {
	TMR1 = 0;			//Xoa so dem trong TMR1
	PR1 = 0x7A12;		//Nguong tran la 1 giay tuong ung voi clock = 32 MHz
	_T1IF = 0;			//Xoa co ngat cua Timer 1
	T1CON = 0x8030;		//Dung fcy lam clock, prescale = 1:256
	_T1IE = 1;			//Cho phep ngat khi Timer 1 tran
}

//Chuong trinh xu ly ngat Timer 1
void _ISR _T1Interrupt(void) {
	_T1IF = 0;			//Xoa co ngat
	flag = 1;			//Bat co cho phep xuat chuoi ky tu
}
code viết bằng VB chung cho cả gửi và nhận
Code:
Private Sub Form_Load()
    
    
    With MSComm1
        .Settings = "9600,N,8,1"
        .CommPort = 1
        .RThreshold = 1
        .SThreshold = 0
        .InputMode = comInputModeText
        .InputLen = 0
        .Handshaking = comNone
        .InBufferSize = 1024
        .OutBufferSize = 1024
        .PortOpen = True
    End With
End Sub


Private Sub Form_Unload(Cancel As Integer)
    ' Dong cong
    MSComm1.PortOpen = False
End Sub

Private Sub Command1_Click()
    MSComm1.Output = Text1.Text
End Sub
Private Sub MSComm1_OnComm()
If (MSComm1.CommEvent = comEvReceive) Then
Text2.Text = Text2.Text + MSComm1.Input
End If
End Sub
han_nang_008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-11-2008, 09:23 PM   #12
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 han_nang_008 View Post
bác nào giúp em với, em viết chương trình gửi kí tự lên PC, và từ PC gửi xuống 30F4011, nhưng đều ra các kí tự là, %!@&....

...
Có vẻ như baudrate hai phía không giống 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 30-11-2008, 10:19 PM   #13
han_nang_008
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Bài gửi: 19
:
Trích:
Nguyên văn bởi namqn View Post
Có vẻ như baudrate hai phía không giống nhau.

Thân,
Anh namqn ơi, trong code em đã set cả 2 baudrate đều là 9600 mà anh, anh xem hộ em với
han_nang_008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-11-2008, 10:28 PM   #14
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 han_nang_008 View Post
Anh namqn ơi, trong code em đã set cả 2 baudrate đều là 9600 mà anh, anh xem hộ em với
Bạn dùng FRC của dsPIC30F4011, và giả thiết nó là 7.37 MHz, nhưng lấy gì đảm bảo tần số của dsPIC30F4011 của bạn đúng bằng bao nhiêu đó?

Hơn nữa, để con số tính toán cho baudvalue được tròn trịa thì nên dùng 7372800 thay vì 7370000 trong công thức. Bạn thử lại xem.

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 30-11-2008, 11:02 PM   #15
han_nang_008
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Bài gửi: 19
:
Trích:
Nguyên văn bởi namqn View Post
Bạn dùng FRC của dsPIC30F4011, và giả thiết nó là 7.37 MHz, nhưng lấy gì đảm bảo tần số của dsPIC30F4011 của bạn đúng bằng bao nhiêu đó?

Hơn nữa, để con số tính toán cho baudvalue được tròn trịa thì nên dùng 7372800 thay vì 7370000 trong công thức. Bạn thử lại xem.

Thân,
em thử lại 7372800 cũng ko dc bac ah
han_nang_008 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à 06:53 AM.


Đượ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