Режим захвата PIC 18F4550

Я хотел бы измерить пульс с помощью 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);
    } 
}

Ответы (1)

Должно xor()быть внутри бесконечного цикла. В частности внутри while (!PIR2bits.CCP2IF)петель.
Во всех случаях, если вы не используете прерывания, бесполезно использовать сравнение захвата для внутренней функции.

спасибо за ваше взаимодействие, я просто хочу узнать больше о прерываниях, должен ли я использовать его для функции xor или использовать его для расчета ширины импульса?
Прерывание сравнения захвата позволяет избежать циклического ожидания и дает вам возможность параллельно добавлять дополнительные функции. Что касается функции xor(), я думаю, что в этом случае можно использовать внешний xor. В вашем коде xor вам не нужно второе условие if после else.