this code is for decoding an unknow remote control protocolby caturing the time of every rising and falling edge using ccp module mikroc pro for pic and pic16f877a
int m ;char txt1[9],txt2[9],char txt3[9];
int time1=0,time2=0;
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
void main()
{
CMCON=7;//disable comparator
TRISC=255;// portc as input.
TRISB=0;portb as output.
PORTC=0;
PORTB=0;
T1CON=0B00000101;//enabling timer one in asynchronized timer mode.
INTCON=0B11000000;//enabling GIE and PEIE bits to allow interrupts
PIR1=0; //CCP1IF and TMR1IF are both zeros
TMR1L=0;
TMR1H=0;// initializing TMR1L and TMR1H
LCD_INIT();
LCD_CMD(_LCD_CLEAR);
LCD_CMD(_LCD_CURSOR_OFF);
while(1){
CCP1CON=0B00000101; capture every rising edge (the first one) and as i understood when first rising edge is captured CCP1IF will be 1
PIE1=0B00000101;//TMR1IE and CCP1IE bits are enabled
if(CCP1IF_BIT==1){// when this bit is 1 the first rising edge is captured
time1=CCPR1L+(256*CCPR1H);//the time of the first rising edge
TMR1IF_BIT=0;//set the interrupt flag to zero to enable another oncoming one
CCP1IF_BIT=0;
}
CCP1CON=0B00000100;// capture every falling edge () the first falling edge)
PIE1=0B00000101;// CCP1IE and TMR1IE bits are enabled
if(CCP1IF_BIT==1){ if the first falling edge is captured
time2=CCPR1L+(256*CCPR1H);// the time of the first falling edge
TMR1IF_BIT=0;//set the interrupt flag to zero to enable another oncoming one
CCP1IF_BIT=0;
}
m=time2-time1;//m presents the time of an on pulse only i mean the 1 part (the positive part of the pulse)
inttostr(m,txt1);
inttostr(time1,txt3);
inttostr(time2,txt2);
LCD_OUT(1,1,txt3);//view the time of rising edges
LCD_OUT(1,7,txt2);//view the time of falling edges
LCD_OUT(2,1,txt1);// view the positive part of the pulse time
delay_ms(100);
}
}
the problem is the time of the falling edges is always negative
the time of the rising edges is always zero
int m ;char txt1[9],txt2[9],char txt3[9];
int time1=0,time2=0;
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
void main()
{
CMCON=7;//disable comparator
TRISC=255;// portc as input.
TRISB=0;portb as output.
PORTC=0;
PORTB=0;
T1CON=0B00000101;//enabling timer one in asynchronized timer mode.
INTCON=0B11000000;//enabling GIE and PEIE bits to allow interrupts
PIR1=0; //CCP1IF and TMR1IF are both zeros
TMR1L=0;
TMR1H=0;// initializing TMR1L and TMR1H
LCD_INIT();
LCD_CMD(_LCD_CLEAR);
LCD_CMD(_LCD_CURSOR_OFF);
while(1){
CCP1CON=0B00000101; capture every rising edge (the first one) and as i understood when first rising edge is captured CCP1IF will be 1
PIE1=0B00000101;//TMR1IE and CCP1IE bits are enabled
if(CCP1IF_BIT==1){// when this bit is 1 the first rising edge is captured
time1=CCPR1L+(256*CCPR1H);//the time of the first rising edge
TMR1IF_BIT=0;//set the interrupt flag to zero to enable another oncoming one
CCP1IF_BIT=0;
}
CCP1CON=0B00000100;// capture every falling edge () the first falling edge)
PIE1=0B00000101;// CCP1IE and TMR1IE bits are enabled
if(CCP1IF_BIT==1){ if the first falling edge is captured
time2=CCPR1L+(256*CCPR1H);// the time of the first falling edge
TMR1IF_BIT=0;//set the interrupt flag to zero to enable another oncoming one
CCP1IF_BIT=0;
}
m=time2-time1;//m presents the time of an on pulse only i mean the 1 part (the positive part of the pulse)
inttostr(m,txt1);
inttostr(time1,txt3);
inttostr(time2,txt2);
LCD_OUT(1,1,txt3);//view the time of rising edges
LCD_OUT(1,7,txt2);//view the time of falling edges
LCD_OUT(2,1,txt1);// view the positive part of the pulse time
delay_ms(100);
}
}
the problem is the time of the falling edges is always negative
the time of the rising edges is always zero
Attachments
-
84.6 KB Views: 27
Last edited: