Trích:
Nguyên văn bởi nhanh0112
Đâ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.
...
|
Tôi không dùng CCS C, và tôi cũng không thích dùng các hàm thư viện cho ngoại vi nếu không nắm được mã nguồn của chúng. Do đó, với yêu cầu tạo xung 38 kHz tại chân CCP1 của PIC12F683, từ clock 4 MHz, tôi thường viết code như sau (tôi dùng HTPIC C PRO for PIC10/PIC2/PIC16 ở Lite mode, theo link sau:
http://www.microchip.com/stellent/id...cName=en535448):
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
}
};
}
Chú ý: Tôi dùng bộ dao động nội của PIC12F683 (vì không muốn hàn thêm thạch anh vào mạch ứng dụng). Tần số tại chân GP0 sẽ bằng một nửa tần số tại chân GP2/CCP1. Code đã được thử nghiệm trên mạch thực.
Thân,