/*
 * Ejercicio resuelto en clase de Computación II
 * Fecha: 20/05/20
 * by Alejo S. Giles
 * 
Mapeo de contador: Mapear en salidas, los 4 (cuatro) bits menos                      
significativos (nibble bajo) de una variable contador. El contador deberá                    
incrementarse automáticamente cada un segundo, y reiniciase con cada                  
flanco ascendente en la entrada. 
 * 
 * https://pastebin.com/9pRMtSJh
 */
#include "config.h"
//BLINK
#define CONFIGURAR_LED_TEST		TRISD1=0
#define ENCENDER_LED_TEST		LD1=1
#define APAGAR_LED_TEST			LD1=0

//Para interactuar con las SALIDAS, utilizar:
#define CONFIGURAR_SALIDAS      TRISB=0
#define ACTIVAR_SALIDA0         LB0=1
#define DESACTIVAR_SALIDA0      LB0=0
#define ACTIVAR_SALIDA1         LB1=1
#define DESACTIVAR_SALIDA1      LB1=0
#define ACTIVAR_SALIDA2         LB2=1
#define DESACTIVAR_SALIDA2      LB2=0
#define ACTIVAR_SALIDA3         LB3=1
#define DESACTIVAR_SALIDA3      LB3=0


//Para interactuar con la ENTRADA, utilizar:
#define CONFIGURAR_ENTRADA	TRISA0=1
#define ENTRADA_ACTIVADA	RA0

void MapeoDeContador(void)
    {
	static unsigned char contador = 0; //0b0000 0000 0000 0000 //0x0000
    static unsigned long centiseg_ant = 0;
    static bit entrada_activada_ant=0;

    //Boton de reset
    if(ENTRADA_ACTIVADA != entrada_activada_ant)
        {
        entrada_activada_ant= ENTRADA_ACTIVADA;
        //Si detectó un flanco ascendente
        if(ENTRADA_ACTIVADA) contador=0;
        }
    
    //Incremento del contador
    if (centiseg - centiseg_ant < 3) return;
    centiseg_ant = centiseg;

    contador++;
    
    //Queremos copiar los cuatro bits menos significativos del contador, en PORTB
    
    //Mapeo del nibble bajo (4 bits menos significativos)
    PORTB &= 0b11110000; // "Limpiamos" los 4 bits menos significativos de PORTB
    PORTB |= contador & 0x0F;   //Copiamos los 4 bits menos significatovos de contador en PORTB
    }

void Blink(void)
    {
    static unsigned long centiseg_ant=0;
    static bit led=0;
    
    if((centiseg - centiseg_ant) < 5) return;
    centiseg_ant=centiseg;
    
    led=!led;
    
    if(led) ENCENDER_LED_TEST;
    else    APAGAR_LED_TEST;
    }

void main(void)
    {
    setup();
    CONFIGURAR_SALIDAS;
    CONFIGURAR_ENTRADA;
    CONFIGURAR_LED_TEST;
    APAGAR_LED_TEST;
    
    while (1)
        {
        Blink();
        MapeoDeContador();
        }
    }