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 21-05-2007, 10:51 PM   #1
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Thumbs up dsPIC từ cơ bản đến nâng cao

Chào các bác,

Em tham gia vào diễn đàn cũng đã lâu, nhờ sự nhiệt tình của các mod cũng như các thành viên mà diễn đàn của ta rất là sôi nổi.

Em đã nắm bắt được cơ bản các vấn đề với pic 8 bit, em muốn nâng cao với dspic. Em chọn chú 30F2010 rất phổ biến và được khuyên dùng khi bắt đầu tìm hiểu về dspic.

Bác nào có nhu cầu thì cùng tìm hiểu với em. Em cỏn rất ngu nên chắc còn nhờ các bác giúp đỡ nhiều, đặc biệt là đại ca Nam.

Từ tốn, ta bắt đầu các bác nhỉ.

Datasheet dsPIC30F2010: http://ww1.microchip.com/downloads/e...Doc/70118G.pdf
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-05-2007, 11:11 PM   #2
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Tính năng

Tính năng

- Bộ nhớ chương trình/bộ nhớ lệnh: 12K/4K

- Dung lượng SRAM: 512 Bytes

- Dung lượng EEPROM: 1024 Bytes

- Ba bộ timer 16-bit

- Bốn bộ Input Capture

- Hai bộ Output Compare/Standard PWM

- Sáu kênh chuyên dụng điều khiển motor PWM

- Sáu kênh chuyển đổi A/D 10-bit

- Hỗ trợ Quandrature Encoder Interface

- Một giao tiếp UART

- Một giao tiếp SPI

- Một giao tiếp I2C


I/O

dsPIC2010 có 5 port I/O, các chân được tích hợp nhiều tính năng khác nhau, tùy vào mục đích sử dụng, các tính năng phù hợp được lựa chọn. Tất cả các I/O port đều có ba thanh ghi tương tác trực tiếp:

- TRISx : thanh ghi hướng dữ liệu, ghi giá trị 1 là input, 0 là output. Sau khi reset, tất cả các port là input.
- PORTx : thanh ghi dữ liệu port, có thể xuất giá trị sai khi chuyển từ input sang output.
- LATx : thanh ghi chốt I/O, kết hợp với một chân I/O để loại trừ những vấn đề có thể xuất hiện với các lệnh read – modify – write. Việc đọc thanh ghi LAT trả về giá trị đã được giữ trong port output latch. Thay vì giá trị trên I/O pin. Hoạt động read – modify – write trên thanh ghi LAT, kết hợp với một I/O port ngăn ngừa việc có thể viết giá trị chân input sang port latch. Việc viết lên thanh ghi LAT có tác dụng giống như việc viết lên thanh ghi PORT.

Sự khác nhau giữa thanh ghi PORT và LAT có thể được tổng kết như sau:

• Việc viết lên thanh ghi PORT sẽ viết giá trị dữ liệu lên port latch

• Việc viết lên thanh ghi LAT sẽ viết giá trị dữ liệu lên port latch

• Việc đọc từ thanh ghi PORT sẽ đọc giá trị dữ liệu trên I/O pin

• Việc đọc từ thanh ghi LAT sẽ đọc giá trị dữ liệu đã được dữ trên port latch
Hình Kèm Theo
File Type: jpg 30F2010.JPG (63.1 KB, 153 lần tải)
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-05-2007, 01:54 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
Nói rõ hơn một chút:

- Bộ nhớ chương trình (program memory) của dsPIC30F2010 có kích thước 12 kbyte, tức là 4k lệnh (4096 ô nhớ 24-bit). Trong thế giới số, 1k = 1024.

Với bộ nhớ lệnh nhỏ như vậy, chỉ cần dùng các lệnh rcall và bra để tiết kiệm bộ nhớ chương trình, thay vì dùng các lệnh call và goto.

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 22-05-2007, 07:13 PM   #4
phamthaihoa
Đệ tử 3 túi
 
Tham gia ngày: Jun 2005
Bài gửi: 56
:
Bổ sung tí tẹo
- Có 3 timer 16bit, có thể ghép 2 timer để được 1 timer 32bit.
- 6 Kênh PWM có thể làm rất nhiều việc khác, nhưng chính vẫn là dk động cơ.
- Chân cẳng iem 2010 này hơi chuối một chút, 2 chân nạp (PGD, PGC) chân SPI, I2C lại trùng vào nhau, nên hơi khó dùng, nếu bạn treo trở dùng giao tiếp I2C thì việc nạp chương trình sẽ bị ảnh hưởng (kinh nghiệm bản thân cứ tưởng mạch nạp hỏng , cắt 2 con trở treo lại nạp ầm ầm).
- Chân UART lại trùng chân với nhiều giao tiếp SPI, I2C, nên chủ yếu con này chuyển sang dùng U1ATX, U1ARX, nên khi thiết kế cẩn thận chút.
phamthaihoa vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-05-2007, 09:41 PM   #5
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Trích:
Nguyên văn bởi phamthaihoa View Post
Bổ sung tí tẹo
- Có 3 timer 16bit, có thể ghép 2 timer để được 1 timer 32bit.
- 6 Kênh PWM có thể làm rất nhiều việc khác, nhưng chính vẫn là dk động cơ.
- Chân cẳng iem 2010 này hơi chuối một chút, 2 chân nạp (PGD, PGC) chân SPI, I2C lại trùng vào nhau, nên hơi khó dùng, nếu bạn treo trở dùng giao tiếp I2C thì việc nạp chương trình sẽ bị ảnh hưởng (kinh nghiệm bản thân cứ tưởng mạch nạp hỏng , cắt 2 con trở treo lại nạp ầm ầm).
- Chân UART lại trùng chân với nhiều giao tiếp SPI, I2C, nên chủ yếu con này chuyển sang dùng U1ATX, U1ARX, nên khi thiết kế cẩn thận chút.
Con của bác có bị sao ko chứ, chip của em vẫn mắc trở kéo lên giao tiếp I2C nhưng nạp vẫn ầm ầm, em thấy ko có vấn đề gì cả mà.
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-05-2007, 09:48 PM   #6
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Thắc mắc Timer

Em không biết khi dùng Timer của dsPIC với C30, khi Timer tràn thì làm sao nó nhận biết hàm xử lí tràn vì em tham khảo hàm xử lí của anh Nam viết và cũng hàm xử lí đó, nhưng nó khác tên nhau. Em muốn biết có dâu hiệu nào để biết?

Câu hỏi của em hơi ngớ ngẩn.
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 23-05-2007, 11:30 PM   #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 minhquancdt View Post
Em không biết khi dùng Timer của dsPIC với C30, khi Timer tràn thì làm sao nó nhận biết hàm xử lí tràn vì em tham khảo hàm xử lí của anh Nam viết và cũng hàm xử lí đó, nhưng nó khác tên nhau. Em muốn biết có dâu hiệu nào để biết?

Câu hỏi của em hơi ngớ ngẩn.
Tôi không rõ ý của bạn khi nói đến hàm xử lý do tôi viết và một hàm xử lý có tên khác.

Về dấu hiệu nhận biết, bạn xem trong tập tin kịch bản liên kết tương ứng (ví dụ p30f2010.gld cho dsPIC30F2010), bạn tìm đến phần 'Primary Interrupt Vector Table', là nơi các vector ngắt được định nghĩa, sẽ thấy các tên mặc định cho các trình phục vụ ngắt tương ứng. Lấy ví dụ, ngắt Timer 1 sẽ được mô tả như sau:
Code:
 LONG(DEFINED(__T1Interrupt) ? ABSOLUTE(__T1Interrupt)    :
         ABSOLUTE(__DefaultInterrupt));
Nghĩa là nếu không có function tên là __T1Interrupt được định nghĩa trong chương trình thì function tên là __DefaultInterrupt sẽ được dùng để xử lý ngắt Timer 1, ngược lại thì function __T1Interrupt sẽ được dùng.

Câu hỏi của bạn không hề ngớ ngẩ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 24-05-2007, 04:50 PM   #8
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Nghĩa là mình phải đặt đúng tên hàm là "__T1Interrupt" hay chỉ cần có cụm này trong tên hàm thì C30 sẽ nhận ra và nhảy đến đó hả anh. Chắc là nó không thông minh đến vậy. Em vẫn chưa thông...
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-05-2007, 05:00 PM   #9
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Những tutorial của anh Nam chỉ cần áp vào là chạy ngay, nhưng em muốn tìm hiểu kĩ cách thức hoạt động của dspic, từng thanh ghi nên phải mày mò từ đầu như vậy và em muốn học trên C30 luôn chứ không dùng ASM.

Do vậy nên có nhiều câu hỏi phát sinh. Cảm ơn anh về các Tutorial này.
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-05-2007, 08:06 PM   #10
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 minhquancdt View Post
Nghĩa là mình phải đặt đúng tên hàm là "__T1Interrupt" hay chỉ cần có cụm này trong tên hàm thì C30 sẽ nhận ra và nhảy đến đó hả anh. Chắc là nó không thông minh đến vậy. Em vẫn chưa thông...
Cần đặt đúng tên hàm như vậy, khi đó trình liên kết sẽ đặt địa chỉ bắt đầu của hàm vào bảng vector ngắt, và như vậy khi có ngắt tương ứng xảy ra thì dsPIC sẽ nhảy đến đoạn code của hàm để xử lý ngắt. Tất nhiên hàm xử lý ngắt phải được khai báo theo kiểu dành cho xử lý ngắt, như bạn có thể thấy trong các tutorial của tôi.

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-05-2007, 01:32 AM   #11
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Giao tiếp nối tiếp

Trích VD 4.2:
Code:
#include "p30f4012.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_UART1_Module(void);

//Cac bien toan cuc
unsigned short temp;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
	Init_UART1_Module();	//Khoi tao module UART1
	while (1) {
		if (U1STAbits.URXDA) {		//Cho den khi nhan duoc mot ky tu
			temp = U1RXREG;			//Doc ky tu da nhan duoc vao temp
			U1TXREG = temp + 1;		//Gui tra ky tu da duoc sua doi (cong 1 vao)
		};
	};
}

//Chuong trinh con khoi tao module UART1
void Init_UART1_Module(void) {
	U1MODE = 0x8000;		//Main I/O, 8-bit, no parity, 1 stop bit
	U1STA = 0x0400;			//bit10=UTXEN
	U1BRG = (((8000000/38400)/16)-1);	//38400 bps @ Fcy = 8 MHz
}
Em chưa rõ là biến temp ở đây có phải sẽ nhận giá trị kiểu char? Nếu em muốn truyền từ PC xuống chip chuỗi "123456" thì mỗi lần nhận 1 kí tự, biến temp sẽ thay đổi.

Em muốn nhận luôn 123456 làm 1 hệ số k = 123456. Có hàm nào sẵn có thực hiện việc ghép nối này, hay mình phải viết riêng vậy anh Nam?
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-05-2007, 02:10 AM   #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 minhquancdt View Post
...
Em chưa rõ là biến temp ở đây có phải sẽ nhận giá trị kiểu char? Nếu em muốn truyền từ PC xuống chip chuỗi "123456" thì mỗi lần nhận 1 kí tự, biến temp sẽ thay đổi.

Em muốn nhận luôn 123456 làm 1 hệ số k = 123456. Có hàm nào sẵn có thực hiện việc ghép nối này, hay mình phải viết riêng vậy anh Nam?
Biến temp trong ví dụ trên có độ dài 16-bit, thuộc kiểu không dấu (nghĩa là chỉ mang các giá trị không âm).

Chuẩn RS-232 chỉ truyền mỗi lần một ký tự, và module UART của dsPIC chỉ hỗ trợ truyền tối đa 9-bit cho mỗi ký tự. Do vậy, thông thường chúng ta phải truyền một chuỗi ký tự đến dsPIC, và thực hiện chuyển đổi thành giá trị thực. E rằng bạn sẽ phải tự viết hàm chuyển đổi.

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 16-06-2007, 11:33 AM   #13
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
ADC 12bit

Em đang bị vướn phần ADC 12bit, ADC 10bit chạy trên 30F2010 rất tốt, nhưng khi chuyển sang 30F3012 lấy ADC 12bit, em đưa thẳng chân V+ 5V vào AN2, nhưng giá trị gửi lên Hyper terminal chỉ dao động quanh 950h, tức cỡ 2.91V. Em đã xem kĩ nhưng ko phát hiện sai chỗ nào cả. Đau đầu quá . Anh Nam giúp em với!
Code:
#include "p30f3012.h"
/* Macros for Configuration Fuse Registers (copied from device header file):*/
_FOSC(CSW_FSCM_OFF & XT_PLL4);  /* Set up for Crystal multiplied by 4x PLL */
_FWDT(WDT_OFF);                 /* Turn off the Watch-Dog Timer.  */
_FBORPOR(MCLR_EN & PWRT_OFF);   /* Enable MCLR reset pin and turn off the power-up timers. */
_FGS(CODE_PROT_OFF);            /* Disable Code Protection */

/*-----------------------------------------------------------------------------------------------
	Cac hang so cua chuong trinh
-----------------------------------------------------------------------------------------------*/
#define	Fcy	8000000			//Tan so thuc thi lenh
#define	baud	38400			//Toc do baud cua RS232

/*-----------------------------------------------------------------------------------------------
	Cac prototype cho cac chuong trinh con
-----------------------------------------------------------------------------------------------*/
void Init_PORTS(void);
void Init_ADC12(void);
void Init_TMR1(void);
void Init_UART1(void);
/*-----------------------------------------------------------------------------------------------
	Bang hang so trong ROM
-----------------------------------------------------------------------------------------------*/

/*-----------------------------------------------------------------------------------------------
	Cac bien toan cuc
-----------------------------------------------------------------------------------------------*/
unsigned int ADCValue, flag, idx;
unsigned char HexTable[] = "0123456789ABCDEF";

/*-----------------------------------------------------------------------------------------------
	Chuong trinh chinh
-----------------------------------------------------------------------------------------------*/
int main(void) {
	Init_PORTS();								//Khoi tao cac cong I/O
	Init_TMR1();								//Khoi tao Timer 1
	Init_ADC12();								//Khoi tao module ADC
	Init_UART1();								//Khoi tao module UART1
	flag = 0;
	while (1) {
		if (flag) {						//Neu co ket qua moi thi xuat ket qua
			idx = (ADCValue >> 8);				//Nibble cao nhat ( 4 bit)
			U1TXREG = HexTable[idx];			//Chuyen thanh ky tu tuong ung
			while (!U1STAbits.TRMT);			//Cho den khi truyen xong ky tu
			idx = ((ADCValue >> 4) & 0x000F);	        //Nibble thu hai
			U1TXREG = HexTable[idx];			//Chuyen thanh ky tu tuong ung
			while (!U1STAbits.TRMT);			//Cho den khi truyen xong ky tu
			idx = (ADCValue & 0x000F);			//Nibble thap nhat
			U1TXREG = HexTable[idx];			//Chuyen thanh ky tu tuong ung
			while (!U1STAbits.TRMT);			//Cho den khi truyen xong ky tu
			U1TXREG = 0x0A;					//Cap ky tu CR, LF (xuong dong, ve dau hang)
			while (!U1STAbits.TRMT);			//Cho den khi truyen xong ky tu
			U1TXREG = 0x0D;
			flag = 0;						//Xoa co bao hieu co ket qua moi
		};
	};
}

//Chuong trinh con khoi tao cac cong I/O, de xuat cac tin hieu PWM, va doc tin
void Init_PORTS(void) {
	TRISB = 0x0004;			//Chan RB2 la ngo vao analog AN0, cac chan khac
					//la ngo ra
	PORTB = 0x0000;						
	TRISD = 0x0000;
	PORTD = 0x0001;						
}

//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 = 0x186A;			//Nguong tran la 0.2 giay 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 con khoi tao module chuyen doi A/D, doc ngo vao AN0
void Init_ADC12(void) {
	ADPCFG = 0xFFFB;		//Cac chan khac la digital, chan AN2/RB2 la analog
	ADCON1 = 0x00E0;		//Module ADC cham dut lay mau va kich hoat
					//viec chuyen doi A/D
	ADCON2 = 0;
	ADCHS =  2;			//Kenh 0 doc tin hieu giua AN6 va AVss
	ADCSSL = 0;			//Khong quet cac ngo vao
	ADCON3 = 0x1F03;		//Dung 31 TAD cho lay mau, dung clock he thong,
					//TAD = 2xTcy = 250 ns
	ADCON2 = 0;						
	_ADIF = 0;			//Xoa co ngat ADC
	_ADIE = 1;			//Cho phep ngat ADC
	_ASAM = 1;			//Tu dong lay mau
}

//Chuong trinh con khoi tao module UART1
void Init_UART1(void) {
	U1MODE = 0x8000;		//Main I/O, 8-bit, no parity, 1 stop bit
	U1STA = 0x0400;			//bit10=UTXEN
	U1BRG = (((Fcy/baud)/16)-1);	//38400 bps @ Fcy = 8 MHz
}

//Chuong trinh xu ly ngat Timer 1
void _ISR _T1Interrupt(void) {
	_ADON = 1;				//Bat module ADC
	_T1IF = 0;				//Xoa co ngat
}

//Trinh phuc vu ngat cho ADC
void _ISR _ADCInterrupt(void)
{
	ADCValue = ADCBUF0;		        //Lay ket qua ADC vao bien ADCValue
	_ADON = 0;				//Tat module ADC
	flag = 1;				//Bat co bao hieu co ket qua moi
	_ADIF = 0;
}
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-06-2007, 09:48 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
ADC 12-bit trong dsPIC30F cần có Tad tối thiểu là 334 ns cho tốc độ 200 kSPS, bạn phải chỉnh lại ADCON3 để đảm bảo điều này (code hiện thời có Tad = 250 ns). Ngoài ra, nên xem phần tương ứng trong datasheet của chip về các tụ bypass và các chân ref cho module ADC 12-bit (nếu tốc độ chuyển đổi từ 100 kSPS trở xuống thì Tad tối thiểu là 668 ns).

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 16-06-2007, 11:44 PM   #15
minhquancdt
Đệ tử 2 túi
 
minhquancdt's Avatar
 
Tham gia ngày: Mar 2006
Bài gửi: 26
:
Cảm ơn anh, em làm được rồi. Đúng là do Tad quá thấp, tăng lên hợp lý, chuyển đổi ào ào ngay.
minhquancdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ð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à 08:20 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