Я хотел бы измерить пульс с помощью PIC 18F4550 в режиме захвата. Этот импульс генерируется самим микроконтроллером PIC.
Для этого я использую функцию, которая играет роль логического вентиля XOR (функция, которую я использовал ниже), где RC0 и RC2 являются входами, а RC6 — выходным сигналом. Импульс, выходящий из RC6, поступает в CCP2 для измерения.
Проблема, которую я обнаружил, заключается в том, что CCP2 не может обнаружить импульс, генерируемый микроконтроллером. Я не знаю, есть ли условия для подключения контактов микроконтроллера или что-то в этом роде.
Если у кого-то есть ответ или подсказка, как это исправить, я буду благодарен, и если у вас есть какие-либо вопросы, не стесняйтесь спрашивать.
#include <stdio.h>
#include <stdlib.h>
#include "osc_config.h"
#include "LCD_8bit_file.h"
#include <string.h>
unsigned long comtage,capt0,x;
char pulse[20];
char cosinus[20];
float period,dephTempo,deph,phi;
void init (){
IRCF0 =1; /* set internal clock to 8MHz */
IRCF1 =1;
IRCF2 =1;
PIE2bits.CCP2IE=1;
PIR2bits.CCP2IF=0;
CCPR2 =0; /*CCPR1 is capture count Register which is cleared initially*/
T3CONbits.RD16=1;
T3CKPS0=0;
T3CKPS1=0;
TMR3CS=0;
TMR3IF=0;
T3CCP2=0; /*Timer3 is the capture clock source for CCP2*/
}
void xor()
{
if (PORTCbits.RC0==PORTCbits.RC2)
{
PORTCbits.RC6=0;
}
else if (PORTCbits.RC0!=PORTCbits.RC2)
{
PORTCbits.RC6=1;
}
}
void main()
{
TRISCbits.TRISC0=1;
TRISCbits.TRISC2=1;
TRISCbits.TRISC6=0;
xor();
LCD_Init();
while(1)
{
CCP2CON = 0b00000101;
PIR2bits.CCP2IF = 0;
TMR3ON = 0;
TMR3 = 0;
while (!PIR2bits.CCP2IF);
TMR3ON = 1;
CCP2CON = 0b00000100;
PIR2bits.CCP2IF = 0;
while (!PIR2bits.CCP2IF);
comtage = CCPR2;
dephTempo = (((float)comtage /30.518)/65536 );
sprintf(pulse,"%.3f ",dephTempo);
LCD_String_xy(0,0,"the pulse width is : ");
LCD_String_xy(2,9,pulse);
}
}
Должно xor()
быть внутри бесконечного цикла. В частности внутри while (!PIR2bits.CCP2IF)
петель.
Во всех случаях, если вы не используете прерывания, бесполезно использовать сравнение захвата для внутренней функции.
безумный на
Пол Гобрил