Ir ao conteúdo

Posts recomendados

Postado

Boa tarde galera,

Já sofri que so com esse programa, na minha visão esta tudo certo, porém quando leio o ccp_1 ele da um valor muito diferente do que era pra receber. estou injetando uma onda quadrada com duty de 50% as duas variaveis que coloquei para ler o tempo high e o tempo low do ciclo registram a mesma coisa, porém quando mudo o duty ele ainda fica mostrando a mesma coisa, já fiz na pratica li no osciloscopio e persiste o erro. Alguem poderia me ajudar?

 

programa

 

#include <18f4550.h>
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7,bits=8)
#fuses HS,nowdt,nolvp,noprotect,brownout,noput,nocpd,nowrt,nodebug,cpudiv1,pll5


char dado='0';
unsigned int16 sub=0,des=0,p_total=0;
float periodo=0.0;
unsigned int n=0,pulso=1,m1=0;

#use fast_io (a)
#use fast_io (b)
#use fast_io (c)
#use fast_io (d)


#INT_CCP1
void pulsos_encolder()
{
     
   if(pulso==0&&m1==0)
   {
     
      sub=ccp_1;
      setup_ccp1(CCP_CAPTURE_FE);
      pulso=1;
   }
   if(pulso==1&&m1==0)
   {
      set_timer1(0);
      des=ccp_1;
      setup_ccp1(CCP_CAPTURE_RE);
      m1=1; 
      set_timer1(0);
   }
      
  
 
      

}

#int_timer0
void varredura(){

      if(n==10)
      {
      output_toggle(pin_d0);
      n=0;
      }
      else
      {
      n++;
      }
    
}

void main()
{

enable_interrupts(global);
enable_interrupts(int_ccp1);
setup_ccp2(CCP_OFF); 
setup_comparator(NC_NC_NC_NC); 
enable_interrupts(int_timer0);
setup_timer_0(rtcc_internal|RTCC_DIV_2);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);


setup_ccp1(CCP_CAPTURE_RE);
 
set_tris_c(0b10000110);
set_tris_b(0b00000011);
set_tris_a(0b11111111);
set_tris_d(0b00000000);
set_timer1(0);


 
   output_low(pin_d0);
   
// printf("E1)-%ld\n\n ",sub);
// printf("E1)-%ld\n\n 2)-%ld\n\n",sub,des);
         while(1)
         {
           
               if(m1==1)
               {
               //printf("*");
               printf("1)%lu\n\n 2)%lu\n\n ",sub,des);
               //printf("*");
               m1=0;
               pulso=0;
               }
            
            
         }
      
}


 

simulaçao.rar

Postado

Pelo pouco que lembro do CCP como capture, ele armazena o valor do timer em duas variáveis de 16 bits.

(CCP1 high e CCP1 low). Utilizei ele uma vez para medir frequência.

Tem que configurar um timer e a cada estouro do CCP, gera uma interrupção que salva o valor do tempo entre subidas, por exemplo.

Abs

 

Postado

isso, mesmo mas no 18f4550.h ele pega os registros CPP1_H e CPP1_L  e condensa os dois no registro CPP_1,pelo menos é assim no CCS, o que eu nao estou entendendo é a saida do CPP_1, ou seja, o que ta sendo armazenado lá era pra ser muito simples, talvez seja uma besteira, mais eu não estou enxergando. obg pela informação.

Postado

Sim. Ele vai armazenar um valor. Você deverá converter esse valor

  Em 01/06/2017 às 18:44, Jardas Fernandes disse:

#INT_CCP1
void pulsos_encolder()
{
     
   if(pulso==0&&m1==0)
   {
     
      sub=ccp_1;
      setup_ccp1(CCP_CAPTURE_FE);
      pulso=1;
   }
   if(pulso==1&&m1==0)
   {
      set_timer1(0);
      des=ccp_1;
      setup_ccp1(CCP_CAPTURE_RE);
      m1=1; 
      set_timer1(0);
   }

Expandir  

 

Tire os ifs nesse bloco e veja se muda algo. o que me parece é que ele não está atribuindo os valores de ccp_1 à variável sub. Você está simulando no proteus? Se sim, rode no modo de depuração e veja se a cada volta no loop main o TMR1 está alterando e se a cada chamada da interrupção do CCP1 ele está atribuindo aquele valor ao sub. 

 

#INT_CCP1
void pulsos_encolder(){
      sub=ccp_1;
      set_timer1(0);

   }

 

 

 

Postado
  Em 01/06/2017 às 20:27, Jardas Fernandes disse:

Vou tentar , mas me tira uma dúvida o ccp_1 vai ser renovado a cada transiçao positiva no c2 então ele vai ler o mesmo valor sempre já que eu tô zerando o timer1, né?

Expandir  

 

Se você configurou seu modo CCP para interromper a cada subida de pulso sim.

As renovações da variável do CCP  (em um pic 16F) podem ser:

 

Capture mode, every falling edge  (a cada borda de descida)

Capture mode, every rising edge (a cada borda de subida)

Capture mode, every 4th rising edge  (a cada 4 bordas de descida) 

Capture mode, every 16th rising edge (a cada 16 bordas de descida)

 

Daí essa seleção é feita na função:

setup_ccp1(CCP_CAPTURE_RE)

 

DICA: Digita setup_ccp1 no help do ccs que ele explica direitinho o que faz (help do ccs é muito rico de informações)

 

OBS: pelo que li um pouco, o trexo do código no ccs para entrar em uma interrupção é:

 

#int_CCP1 
void  CCP1_isr(void) {

      sub=ccp_1;
      set_timer1;

}

 

abs

 

 

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Mostrar mais  

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

Mostrar mais  
×
×
  • Criar novo...