PIC 18F4550 Aufnahmemodus

Ich möchte mit dem PIC 18F4550 im Capture-Modus einen Puls messen. Dieser Impuls wird vom PIC-Mikrocontroller selbst erzeugt.

Dazu verwende ich eine Funktion, die die Rolle des XOR-Logikgatters spielt (Sie finden die Funktion, die ich unten verwendet habe), wobei RC0 und RC2 die Eingänge und RC6 der Signalausgang sind. Der Impuls, der RC6 verlässt, tritt in CCP2 ein, um gemessen zu werden.

schematisch

Das Problem, das ich gefunden habe, ist, dass der CCP2 den vom Mikrocontroller erzeugten Impuls nicht erkennen kann. Ich weiß nicht, ob es irgendwelche Bedingungen gibt, um die Pins des Mikrocontrollers oder so etwas anzuschließen.

Wenn jemand eine Antwort oder einen Hinweis hat, um dies zu beheben, bin ich dankbar und wenn Sie Fragen haben, können Sie diese gerne stellen.

#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);
    } 
}

Antworten (1)

Der xor()muss sich innerhalb der Endlosschleife befinden. Insbesondere innerhalb der while (!PIR2bits.CCP2IF)Schleifen.
In allen Fällen, wenn Sie keine Interrupts verwenden, ist es sinnlos, den Capture-Vergleich für eine interne Funktion zu verwenden.

Danke für Ihre Interaktion, ich möchte nur mehr über Interrupts wissen, sollte ich es für die xor-Funktion verwenden oder es verwenden, um die Impulsbreite zu berechnen?
Der Interrupt des Capture-Vergleichs vermeidet das Warten in Schleifen und gibt Ihnen die Möglichkeit, weitere Funktionalitäten parallel hinzuzufügen. In Bezug auf die xor () -Funktion denke ich, dass in diesem Fall die Verwendung eines externen xor eine Option ist. In Ihrem xor-Code brauchen Sie die zweite if-Bedingung nach else nicht.