E mới vào nghề,thắc mắc về CCP!
E dùng CCP bắt xung ngoài để đo tần số,vì e mới chuyển từ AT89 nên còn bỡ ngỡ mong đc chỉ bảo:
E có đoạn code như sau:
#include<16f877.h>
#fuses XT,NOLVP,NOWDT,PUT
#use delay (clock=4000000) // defind crystal = 4MHz
byte CONST MAP[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f};
//===========================================
// this function use to display number 00=99
// input : n = number to display
//===========================================
void display(int n)
{
char b;
b=((MAP[n/100]) ^ 0xff); //hang tram
if ((n/100)==(0)) b=0xff; //kill Led not Value
output_b(b);
output_low(PIN_D0);
delay_ms(1);
output_high(PIN_D0);
b=((MAP[(n%100)/10]) ^ 0xff); //hang chuc
if ((n/100)==(0)&&(n/10)==(0))
b=0xff; //kill Led not Value
output_b(b);
output_low(PIN_D1);
delay_ms(1);
output_high(PIN_D1);
output_b((MAP[n%10]) ^ 0xff); //hang dv
output_low(PIN_D2);
delay_ms(1);
output_high(PIN_D2);
}
long rise,fall,pulse_width;
unsigned int16 xung=0; // khai báo bie^'n encoder la so^' 16 bit
#int_ccp2
void isr()
{
++xung;
rise = CCP_1;
fall = CCP_2;
pulse_width = fall - rise; // CCP_1 is the time the pulse went high
}
//============================================
// main program
//============================================
void main()
{
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP2); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
while(TRUE) // vong lap lien tuc
{
displayxung);
}
}
Xin hỏi cả nhà là giá trị xung đếm được cất ở thanh ghi nào?đoạn code trên e có dùng 1 biến xung ở trong phần ngắt để đếm xung nhưng xuất ra = 0.Có nghĩa là ct không nhảy vào ngắt,tại sao vậy? E có mô phỏng trên Proteus,2 chân ccp1,ccp2 được cấp xung đầy đủ nhưng vẫn kô có ngắt.
Xin hỏi khai báo như trên đã đầy đủ chưa?
|