![]() |
|
Tài trợ cho PIC Vietnam |
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 |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#1 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
Giúp tạo xung 38kHz bằng Timer
Tui mới học viết Pic nên còn lơ mơ quá:
Chẳng là tui muốn làm một chiếc remote control. Nhưng khi tạo xung bằng Timer0 hay timer2 đều gặp phải vấn đề là tần số tối đa chỉ đc khoảng 14kHz (tức là on=70us, off=70us), giảm tiếp thì ko xuống đc (đã kiểm tra bằng osc scope). Bác nào có kinh nghiệm vụ này xin chỉ dẫn giùm. Thanks các bác nhiều ![]() Code:
// defind crystal = 4MHz #int_timer2 void timer2() { output_toggle(PIN_A1); } void main() { setup_timer_2(T2_DIV_BY_1,25,1);//setup_TIMER_2(mode, period, postscale); setup_ccp1(CCP_PWM); set_pwm1_duty(52); //50%duty, 38462Hz enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER2); while(true) thay đổi nội dung bởi: nhanh0112, 27-04-2009 lúc 01:53 AM. |
![]() |
![]() |
![]() |
#2 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 1 túi
Tham gia ngày: Dec 2005
Bài gửi: 20
: |
Code:
#int_timer2 void timer2() { output_toggle(PIN_A1); } CHI CAN Code:
VOID MAIN(){ setup_timer_2(T2_DIV_BY_1,25,1); setup_ccp1(CCP_PWM); set_pwm1_duty(12); // F== 38KHZ T=26 us } |
![]() |
![]() |
![]() |
#4 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
@namqn:dạ, là 12F683 ạ.
@vietanh:Em sẽ thử lại. Nhưng nếu bỏ đoạn #int_ đi thì xung ra sẽ kích vào chân nào? |
![]() |
![]() |
![]() |
#6 | |
Trưởng lão PIC bang
|
Trích:
Nếu bạn đo dạng sóng ở chân GP1 (PIC12F683 không có chân RA1) thì tần số chắc chắn không đạt 38 kHz với thiết lập phần cứng trong chương trình của bạn, vì còn overhead khi xử lý ngắt Timer 2. Tuy nhiên, nếu bạn đo dạng sóng ở chân CCP1 thì nó sẽ đúng như phần chú thích trong code, tần số khoảng 38 kHz với duty cycle bằng 50 %. Đây cũng là lý do bạn vietanh đề nghị bạn bỏ phần code xử lý ngắt Timer 2, vì không cần thiết cho bài toán của bạn. Bạn cũng nên post code đầy đủ thông tin vào lần sau, đừng post code không đầu không đuôi như trên, vì người đọc sẽ phải đoán những thông tin mà bạn không đưa ra, hoặc phải hỏi lại bạn nhiều lầ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 |
|
![]() |
![]() |
![]() |
#7 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
Đây là toàn bộ code (với mục đích đầu tiên là chỉ tạo xung 38kHz) đã đc sửa như chỉ dẫn. Ko biết còn thiếu xót gì ko, các bác chỉnh giùm em. Đo tại chân CCP1(chân 5) luôn là mức 1. Phần cứng đc sử dụng crystal = 4MHz lắp vào chân 2 & 3, chân 1 & 8 cấp nguồn, các chân còn lại bỏ trống.
Code:
#include <12F683.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) // defind crystal = 4MHz void main() { setup_timer_2(T2_DIV_BY_1,25,1);//setup_TIMER_2(mode, period, postscale); setup_ccp1(CCP_PWM); set_pwm1_duty(52); //50%duty, 38462Hz enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER2); while(TRUE); } |
![]() |
![]() |
![]() |
#8 | |
Trưởng lão PIC bang
|
Trích:
Code:
#include <htc.h> #include <pic12f683.h> __CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO); void Init_CCP1(void) { //Assuming 4 MHz system clock (from the internal oscillator) PR2 = 25; //for 38.46 kHz PWM output at CCP1 pin T2CON = 0x00; //with 1:1 prescaler, 1:1 postscaler TMR2IF = 0; CCP1CON = 0x0C; //PWM mode, active high CCPR1L = 13; //50% duty cycle (2 LSBs are '00' in CCP1CON) TMR2ON = 1; //Turn on Timer 2 } void main(void) { GPIO = 0x00; CMCON0 = 0x07; //Turn off comparator, GP0 .. GP2 are I/O pins ANSEL &= 0xF0; //GP0 .. GP2 and GP4 are digital pins TRISIO = 0xFA; //GP0 and GP2 are outputs Init_CCP1(); while (1) { if (TMR2IF == 1) { GPIO0 = GPIO0 ^ 1;; //Toggle every Timer 2 cycle TMR2IF = 0; //Clear Timer 2 IF for next cycle } }; } 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 |
|
![]() |
![]() |
![]() |
#9 |
Đệ tử 1 túi
Tham gia ngày: Dec 2005
Bài gửi: 20
: |
Nói chung là bạn chua nắm được cơ bạn, lt pic bằng ccs . trước khi bạn muốn làm việc ,với 1 chân hay cả 1 cổng port nào đó bạn phải định nghĩa cho nó là cổng xuất hay nhập, chân đó nằm ở mức cao hay thấp.
vd set_tris_c(0x00); xuat dl output_c(0x00); tất cả port c nằm mức thấp |
![]() |
![]() |
![]() |
#10 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
Cảm ơn các bác đã nhiệt tình giúp đỡ. Đúng là em chưa đc cơ bản lắm trong việc làm pic. Mới nhảy từ AT89 lên... chắc phải đọc thêm sách rồi. Em sẽ chú ý lời khuyên của các bác. Một lần nữa xin cảm ơn!
|
![]() |
![]() |
![]() |
#11 |
Đệ tử 4 túi
Tham gia ngày: May 2007
Bài gửi: 81
: |
Em đã tạo đc rồi các bác à! em đã tham khảo ở đây http://cblog.cari.com.my/html/32/53232-112634.html và sửa thành
set_pwm1_duty(15); thì chạy ngon lành. Không hiểu ra làm sao nữa. |
![]() |
![]() |
![]() |
#12 | |
Trưởng lão PIC bang
|
Trích:
Code vừa sửa của bạn sẽ tạo duty cycle = 50% nếu bạn dùng set_pwm1_duty(13). 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 |
|
![]() |
![]() |
![]() |
#13 |
Đệ tử 1 túi
|
prescale
Sử dụng chức năng search trên 4r hay thật,lơ ngơ tìm đúng bài mình đang cần.hoho.Cảm ơn.Mỗi tội chưa biết cách tính timer0,1. Có ai có công thức tính timer ko,cho mình xin với. Mà cái gọi là bộ đếm gộp trước(prescaler) là gì vậy,mình vẫn chưa hiểu. Ý nghĩa và tác dụng của nó.
|
![]() |
![]() |
![]() |
#14 |
Nhập môn đệ tử
Tham gia ngày: Oct 2008
Bài gửi: 1
: |
cho em hỏi tí
Em dùng pic 16f877a viết theo chương trình các anh hướng dẫn và đã tạo ra được sóng 38khz tại chân ccp1 . Nhưng điều em muốn hỏi là làm sao để điều kiển được chân ccp1 ( vì nó cứ phát xung liên tục không ngừng ) .
VD : trong mạch em thêm 1 cái nút nhấn , khi nhấn nút thì chân ccp1 mới phát ra xung trong khoảng 1s rùi tắt thì phải làm sao ? Em dùng ccs c , lệnh #setup_ccp1 (CCP_OFF) có tác dụng gì vậy các anh ? |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|