/*
 * File:   Crono.c
 * Author: Christian Mares
 *
 * Created on 14 de diciembre de 2017, 17:19
 */

#include "main.h"

double PRSeconds; // Tiempo del periodo del temporizador en segundos
double a = 0.9804;// Confianza del sensor. Es un valor arbitrario, pero se puede carcular por a == 3/(3+PR) (PR: periodo en segundos)

volatile bool go = false; // Flag que indica el final de la cuenta y libera el loop principal

#define BLP_PR 0
unsigned char BL_PID_Period = BLP_PR; // Cada cuantos ciclos del timer se ejecuta 
#define SPP_PR 0                      // la funcion. (ciclos-1 => 9 = 10ciclos)
unsigned char SP_PID_Period = SPP_PR;
#define go_PR 0
unsigned char go_Period = go_PR;

void Inic_Timer4(void){
    
    _TFCCON = 0x0000; //Todos los bits de control a 0
    
    _TFCPR = T4_Period; //Mirar en el .h
    _TFCTCKPS = 2;  // Valor del prescaler x64 -> T = 100ms = 0,1s
 /* PRSeconds == (PR+1)/fcy + prescaler */
    PRSeconds = ((double)(_TFCPR+1) / 16000000.0) * (_TFCTCKPS==0b0 ? 1: (_TFCTCKPS==0b1?8:(_TFCTCKPS==0b10?64:(_TFCTCKPS==0b11?256:0))));
    a = 3/(3+PRSeconds);
    
    _TFCIF = 0;   // Borra flag de interrupción
    _TFCIE = 1;  // Habilita interrupción del Timer 4
    
    _TFCTMR = 0;       // Cuenta del Timer a 0
    _TFCTON = 0;      // Pone en marcha el Timer 4
    
}

void __attribute__((interrupt(auto_psv))) _T_FC_Interrupt(void){
    
    if(!BL_PID_Period--){
        pid_cf.BALANCE = 1;
        
        BL_PID_Period = BLP_PR;
    }if(!SP_PID_Period--){
        pid_cf.SPEED = 1;
        
        SP_PID_Period = SPP_PR;
    }if(!go_Period--){
        go=1; //Liberar el main loop
        
        go_Period = go_PR;
    }
    _TFCIF = 0;
}