Pesquisar neste blog

01/11/2022

Ciclo com PIC 16F877A

Objetivo: Fazer um frequenciometro com pic 16F877A e exibe em tela seu pulso.

Resolução feita em CCS C Compiler

#include <16F877A.h>
#fuses xt, nowdt, noprotect, put, brownout
#use delay(clock = 4M)

#define RS PIN_E0
#define EN PIN_E1

void Inicializa(void);
void Lcd_Inst(char dado);
void Lcd_Dado(char dado);

int16 periodo1, periodo2;
int32 periodo;
boolean flag = 0;

void main(){

   Inicializa();
   Lcd_Inst(0x82);
   printf(lcd_dado, "\fPeriodo\n");

   while(TRUE){
      //TODO: User Code
      Lcd_Inst(0xC2);
      printf(lcd_dado, "TEMPO = %lu us", periodo);
      
   }

}

#int_ccp1
void ccp1_int(){
   if (flag == 0){
      periodo1 = CCP_1;
      flag = 1;
   }else{
      periodo2 = CCP_1;
      periodo = ((periodo2 - periodo1) * 2);
      Set_Timer1(0);
      flag = 0;
   }
}

void Inicializa(void){
   Setup_Timer_1(T1_INTERNAL|T1_DIV_BY_2);
   Setup_ccp1(CCP_CAPTURE_RE);
   Enable_Interrupts(GLOBAL);
   Enable_Interrupts(INT_CCP1);
   
   Lcd_Inst(0x38);
   delay_ms(1);
   Lcd_Inst(0x38);
   Lcd_Inst(0x0C);
   Lcd_Inst(0x06);
   Lcd_Inst(0x01);
   delay_ms(1);
}

void Lcd_Inst(char dado){
   Disable_Interrupts(GLOBAL);
   output_low(RS);
   output_d(dado);
   delay_cycles(2);
   output_high(EN);
   delay_ms(1);
   output_low(EN);
   Enable_Interrupts(GLOBAL);
}

void Lcd_Dado(char dado){
   Disable_Interrupts(GLOBAL);
   output_high(RS);
   output_d(dado);
   delay_cycles(2);
   output_high(EN);
   delay_ms(1);
   output_low(EN);
   Enable_Interrupts(GLOBAL);
}

Software: Proteus 7.9






















Nenhum comentário: