//******************************************************************************
// PIC_captur - Demostra o uso do módulo de captura
// 
// Desenvolvido por: Arne
// versão 1.0 - 03/09/2025
//
// Compilador: XC8 2.40
// IDE       : MPLAB-X 6.00 Linux
// Plataforma: placa PE-PIC16F628A com cristal de 8MHz
// Gravador  : PICKIT3
//
// Pinos utilizados:
// PORTB:
// RB3: entrada módulo CCP - captura
// RB4: LED5 - Led Live
//*****************************************************************************

//******************************************************************************
// O Copyright deste programa está reservado para Márcio José Soares e seu
// conteúdo está protegido pela Lei de Direitos Autorais LEI Nº 9.610, de
// 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou
// parcial dos conteúdos aqui apresentados sem prévia autorização, por escrito,
// do autor.
//******************************************************************************

//*****************************************************************************
// Bit fuses
#pragma config FOSC = HS        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

//*****************************************************************************
// Define frequência de trabalho
#define _XTAL_FREQ 8000000UL

//*****************************************************************************
// Inclui arquivos
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pic_comm.h"
#include "pic_ccp.h"
#include "my_defines.h"

//******************************************************************************
// Constantes globais
const char eraseMinicom[4] = {0x1B, '[', '2', 'J'};
const char msg1[5][32] = {"\n\r\n\rBem-vindo ao LAB do Arne! ",
                          "\n\rExperiencia com modulo CCP PIC",
                          "\n\rmodo captura",
                          "\n\r\n\rvalor -> 0000",
                          " frequencia -> 0000Hz"};

//*****************************************************************************
// Variáveis globais do módulo
uint8_t volatile count_timer0 = 0;
uint8_t volatile autoriza = 0;
uint8_t count_aut = 0;
uint16_t mydata = 0;
uint16_t old = 0;
uint32_t total = 0;
uint32_t freq = 0;

char TxBuffer[64];
char p[20];

//*****************************************************************************
// Declara funções do módulo

//*****************************************************************************
// trata_int_ccp - trata int do módulo ccp (aqui captur)
//
// Entradas: nenhuma
// Saídas  : nenhuma
//*****************************************************************************
void show_captur(void){
    
    uint8_t i;
    
    //*************************************************************************
    // Arruma tela - Minicom
    for(i=0;i<35;i++)                           // retorna cursor
        mputch(BS);
    
    for(i=0;i<35;i++)                           // preenche com espaços
        mputch(ESP);
    
    for(i=0;i<35;i++)                           // retorna cursor
        mputch(BS);
    
    //*************************************************************************
    // Calcula frequencia
    if(total)
        freq = (uint32_t)(2000000 / total);
    else
        freq = 0;
    
    //*************************************************************************
    // Mostra na tela
    sprintf(p, "valor -> %04d", total);         // arruma string
    putch_str(&p[0]);                           // envia
    
    sprintf(p, " frequencia -> %04dHz", freq);  // arruma string
    putch_str(&p[0]);                           // envia
  
    total = 0;                                  // limpa para próxima média
    
}

//*****************************************************************************
// Função principal
//
// Entradas: nenhuma
// Saídas  : nenhuma
//*****************************************************************************
void main(void) {
    
    uint8_t i = 0;
    
    //**************************************************************************
    // Setup inicial PIC
    PORTA = 0;                      //zera ports
    PORTB = 0;  
    
    INTCON = 0x00;                  // desliga interrupções
    CCP1CON = 0x00;                 // desliga CCP
    
    TRISA = 0xFF;                   // portA entrada
    TRISB = 0x0A;                   // portB saída, exceto RB3 - captur, RB1 -RX
    
    init_usart();                   // inicia USART a 9600,8,n,1
    init_ccp(CAPTUR);               // inicia módulo ccp como captur
    
    setLEDLive;                     // liga LED live
        
    __delay_ms(1000);                // tempo dummy
    
    //**************************************************************************
	// Apaga tela Minicom
    for(i=0;i<4;i++)
        mputch(eraseMinicom[i]);
    
    __delay_ms(100);                // tempo dummy após apagar tela
    
    //**************************************************************************
	// Envia msgs Minicom
    for(i=0;i<5;i++){ 
        memcpy(TxBuffer, msg1[i], sizeof(msg1[i]));
        putch_str(&TxBuffer[0]);
        __delay_ms(50);
    }
    
    //**************************************************************************
    // Habilita ints
    INTCONbits.PEIE = 1;            // ativa ints dos periféricos
    INTCONbits.GIE = 1;             // ativa ints globais
    
    //**************************************************************************
	// Laço principal
    while(TRUE){
        if(autoriza){
            show_captur();          // se autorizado mostra
            __delay_ms(500);        // tempo dummy para troca de valor
            toggleLEDLive;      // troca estado do LED Live
            autoriza = 0;       // autoriza mostrar novamente
        }
    }
    
}

