PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

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

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 21-07-2008, 05:03 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
Trích:
Nguyên văn bởi gong05sk View Post
Hic mấy bác nghĩ rằng em đang ở mức nào mà không thèm chỉ vầy trời. Hướng dẫn cho người chưa biết gì khác với nói chuyện với người đã biết chứ. làm ơn viết dùm em một bài tập nhỏ như em đã ví dụ bên trên để em hình dung ra quá trình xử lý công việc cần làm là như thế nào. mấy bác gợi ý, mấy bác hướng dẫn em có thể nắm đc. nhưng cái quan trọng nhất là viết như thế nào thì em lại không biết. vậy nên mới tha thiết yêu cầu các bác viết ví dụ cụ thể từ A->Z hộ với. nếu là ASM thì làm ơn viết hết nguyên một chương trình. Quả thật là cấu trúc bộ nhớ pic em cũng còn chưa nắm đc. Nếu viết bằng C thì bác sử dụng thư viện nào, viết thêm hàm nào thì làm ơn viết hết ra dùm cái. Thiết nghĩ với một Ví dụ đơn giản như trên thì chương trình có là bao đâu sao các bác cứ khó dễ mãi thế.
Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.

Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.

Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
Code:
#include <p18cxxx.h>

#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

void Init_PCPWM(void);

void main() {
	Init_PCPWM();
	while (1) Nop();
}

void Init_PCPWM() {
	PTCON0 = 0x04;		//postscale 1:1, prescale 1:4, free running
	PTPERL = 0x9B;		//8 kHz @ 20 MHz
	PTPERH = 0x00;
	PWMCON0 = 0x40;		//PWM0..5 are enabled for PWM output
	PWMCON1 = 0x01;		//postscale 1:1, output override are synchronized
				//to the PWM time base
	DTCON = 0x05;		//0.5 us dead time @ 20 MHz
	OVDCOND = 0xFF;		//output on PWM I/O pin is controlled by duty cycle
				//and time base
	OVDCONS = 0x00;		//PWM I/O is INACTIVE when POUT is cleared
	FLTCONFIG = 0x00;	//disable all fault pins
	SEVTCMPL = 0;
	SEVTCMPH = 0;
	PDC0H = 0;
	PDC1H = 0;
	PDC2H = 0;
	PDC3H = 0;
	PDC0L = 0x80;		//Duty cycle of 20.5% at PWM1
	PDC1L = 0xA0;		//Duty cycle of 25.6% at PWM3
	PDC2L = 0xC0;		//Duty cycle of 30.8% at PWM3
	PDC3L = 0xE0;		//Duty cycle of 35.9% at PWM7
	PTCON1bits.PTEN = 1;
}
Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.

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-07-2008, 12:18 AM   #2
gong05sk
Nhập môn đệ tử
 
Tham gia ngày: Jun 2007
Bài gửi: 8
:
Bác nói thế là oan cho em đấy. Mấy ngày nay em đọc đi đọc ại muốn nát cả cái datasheet. xem tới xem lui không biết bao nhiêu ví dụ trong diễn đàn. và cuối cùng là em nhận ra mình chưa biết gì hết , nên em quay về với bài tập xuất led cơ bản đây. và cũng từ giã con 4331 này mà quay về con 16f877a cho nó bền, đơn giản vì nó có mô phỏng trên proteus. Cứ tưởng có thể học đc kinh nghiệm đi trước từ mấy bác cho rút ngắn bớt thời gian nhưng giờ thấy đó là sai lầm. Có thể em không kịp nắm con pic 4331 trước thời gian làm robot sắp tới. nhưng kệ cùng lắm thì quay về con P98v51 của philip đỡ vậy. còn con này cứ nghiên cứu sau. chứ tình trạng vầy chẳng biết đi về đâu.
__________________
My home --> http://spktclup.com
gong05sk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-07-2009, 01:02 AM   #3
vagabondtt1503
Đệ tử 2 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 33
:
Trích:
Nguyên văn bởi namqn View Post
Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.

Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.

Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
Code:
#include <p18cxxx.h>

#pragma config OSC = HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRTEN = ON
#pragma config BOREN = ON
#pragma config BORV = 27
#pragma config WDTEN = OFF
#pragma config WINEN = OFF
#pragma config WDPS = 32768
#pragma config T1OSCMX = OFF
#pragma config HPOL = HIGH
#pragma config LPOL = HIGH
#pragma config PWMPIN = ON
#pragma config MCLRE = ON
#pragma config EXCLKMX = RD0
#pragma config PWM4MX = RD5
#pragma config SSPMX = RD1
#pragma config FLTAMX = RD4
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

void Init_PCPWM(void);

void main() {
	Init_PCPWM();
	while (1) Nop();
}

void Init_PCPWM() {
	PTCON0 = 0x04;		//postscale 1:1, prescale 1:4, free running
	PTPERL = 0x9B;		//8 kHz @ 20 MHz
	PTPERH = 0x00;
	PWMCON0 = 0x40;		//PWM0..5 are enabled for PWM output
	PWMCON1 = 0x01;		//postscale 1:1, output override are synchronized
				//to the PWM time base
	DTCON = 0x05;		//0.5 us dead time @ 20 MHz
	OVDCOND = 0xFF;		//output on PWM I/O pin is controlled by duty cycle
				//and time base
	OVDCONS = 0x00;		//PWM I/O is INACTIVE when POUT is cleared
	FLTCONFIG = 0x00;	//disable all fault pins
	SEVTCMPL = 0;
	SEVTCMPH = 0;
	PDC0H = 0;
	PDC1H = 0;
	PDC2H = 0;
	PDC3H = 0;
	PDC0L = 0x80;		//Duty cycle of 20.5% at PWM1
	PDC1L = 0xA0;		//Duty cycle of 25.6% at PWM3
	PDC2L = 0xC0;		//Duty cycle of 30.8% at PWM3
	PDC3L = 0xE0;		//Duty cycle of 35.9% at PWM7
	PTCON1bits.PTEN = 1;
}
Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.

Thân,
Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%

Cảm ơn anh
vagabondtt1503 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-07-2009, 10:04 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 vagabondtt1503 View Post
Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%

Cảm ơn anh
Module MCPWM của dsPIC hoạt động khác với module PCPWM của PIC18. Với PIC18 thì PDCx = 4 x PTPER sẽ tương ứng với duty cycle = 100 %.

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 07-07-2009, 05:38 PM   #5
vagabondtt1503
Đệ tử 2 túi
 
Tham gia ngày: Dec 2008
Bài gửi: 33
:
Trích:
Nguyên văn bởi namqn View Post
Module MCPWM của dsPIC hoạt động khác với module PCPWM của PIC18. Với PIC18 thì PDCx = 4 x PTPER sẽ tương ứng với duty cycle = 100 %.

Thân,
Em đã rõ.Cảm ơn sự giúp đỡ của anh
vagabondtt1503 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à 02:06 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