Я хотел бы измерить ширину импульса с помощью pic 18f4550 CCP в режиме захвата. Идея такова: когда модель CCP получает нарастающий фронт, запускается timer1, и после каждого прерывания Timer 1, x который является константой с начальным значением 0 увеличивается на 1, когда модель CCP получает задний фронт timer1 останавливается, и увеличение x также должно прекратиться, чтобы его значение можно было использовать при расчете пульса. проблема, которую я обнаружил, заключается в том, что увеличение x не останавливается, а код работает как счетчик, и, поскольку я новичок в программировании изображений, я не мог найти ошибку. если кто может помочь буду признателен. код, который я использую, приведен ниже. Благодарность!
#include <stdio.h>
#include <stdlib.h>
#include "osc_config.h"
#include "LCD_8bit_file.h"
#include <string.h>
int x=0;
void main()
{
unsigned long comtage;
unsigned long DEPHASAGE[20];
float Deph_tempo;
TRISCbits.TRISC2=1;
IRCF0=1;
IRCF1=1;
IRCF2=1;
LCD_Init();
LCD_String_xy(0,0,"pulse");
PIE1bits.CCP1IE=1;
PIR1bits.CCP1IF=0;
CCP1CON=0b00000101;
CCPR1=0;
T1CONbits.RD16=0;
T1CKPS0=0;
T1CKPS1=0;
TMR1CS=0;
while(1)
{
CCP1CON = 0b00000101;
PIR1bits.CCP1IF = 0;
TMR1ON = 0;
TMR1 = 0;
while (!PIR1bits.CCP1IF)
;
TMR1ON = 1;
CCP1CON = 0b00000100;
PIR1bits.CCP1IF = 0;
if (TMR1IF==1)
{
x++;
TMR1IF=0;
}
while (!PIR1bits.CCP1IF)
;
comtage = x;
Deph_tempo = ((float)comtage /7843.13 );
sprintf(DEPHASAGE,"%.5f ",Deph_tempo);
LCD_String_xy(2,0,DEPHASAGE);
}
x = 0;
}
``
x = 0;
находится за пределами вашего бесконечного цикла и, следовательно, недостижимо. Вы должны переместить этот оператор внутрь цикла while. Желательно ближе к началу цикла, рядом с операторомTMR1 = 0;
, это упростит чтение кода и его осмысление. - person Michaël Roy   schedule 19.03.2021