Pulsadores



1. Introducción:

 En esta práctica, habilitaremos el uso de los pulsadores de la placa y los combinaremos con los led para conseguir efectos.


2. Pulsadores de la placa:




3. Adaptando librerías existentes:

  Revisando el directorio dónde instalamos las MLA, se encuentran librerías que podemos adaptar para que nos sea más cómodo acceder a los pulsadores.

Modificaremos los ficheros "buttons.h" y "buttons.c" del directorio C:\Program Files(x86)\Microchip\MLA\v2016_11_07\bsp\picdem_fs_usb:


3.1. Adaptando "button.h":



3.2. Adaptando "button.c":





4. Ejemplo Pulsador controla led:

 En este primer ejemplo, usaremos las librerías creadas anteriormente para realizar el control de un led según el estado de un pulsador.

 La estructura y ficheros que integran este primer ejemplo es la siguiente:


				
/*
 * File:   main.c
 * Author: Eduardo
 *
 * Created on 5 de junio de 2017, 17:16
 */


#include 
#include "config.h"
#include "typedefs.h"
#include "led.h"
#include "button.h"

#define	_XTAL_FREQ	48000000		// se define la frecuencia FOSC -- Hay que tener en cuenta los preescalers usados

void delay_ms(uint16_t);
unsigned long value = 0;
uint8_t a = 0;

void main(void) 
{
    
    for (a=0; a<4; a++)
        {
            LED_Enable(LED_D1 + a);         //Habilitamos los led. Configura como salida los pines
            LED_Off(LED_D1 + a);            //Empezamos con todos los led apagados
            BUTTON_Enable(BUTTON_S1 + a);   //Habilitamos los pulsadores. Configura como entrada los pines
        }
    
    while (true)
    {
    for (a=0; a<4; a++)    
    {
        if (BUTTON_IsPressed(BUTTON_S1 + a))
            LED_On(LED_D1 + a);
        else
            LED_Off(LED_D1 + a);
        delay_ms(100);
    }
    }
}


void delay_ms(uint16_t i)
{
    for ( uint16_t x=0; x < i; x++ ) 
    { 
    __delay_ms(1); 
    }
}
					

 Compilamos, cargamos el .hex y ya lo tenemos funcionando.

 Como se puede observar, primero habilitamos los led y pulsadores a utilizar y luego consultamos secuencialmente el estado de los pulsadores .


- Ejemplo led y pulsadores simple:



5. Ejemplo Pulsadores y led avanzado:

  En este ejemplo, usaremos dos pulsadores. Uno modificará la frecuencia y el otro la función de los led.

				
/*
 * File:   main.c
 * Author: Eduardo
 *
 * Created on 5 de junio de 2017, 17:16
 */

////////////////////////////////////////////////////////////////////////////////
//                              JUEGO DE LED                                  //
//  S1 Modifica el modo                                                       //
//  S2 Modifica la frecuencia                                                 //
////////////////////////////////////////////////////////////////////////////////

#include 
#include "config.h"
#include "typedefs.h"
#include "led.h"
#include "button.h"

#define	_XTAL_FREQ	48000000		//Se define la frecuencia FOSC -- Hay que tener en cuenta los preescalers usados

void setup();
void delay_ms(uint16_t);
void botonPulsado();
void barridoIzq();
void barridoDer();
void barridoBid();

uint8_t a = 0;
uint8_t b = 1;
uint8_t modo = 0;   //Variable que almacena el modo seleccionado
uint8_t freq = 1;   //Variable que almacena la frecuencia seleccionada


void main(void) 
{
    setup();
    
    while (true)
    {
        if (modo == 0)  //Barrido a izquierda
            barridoIzq();
        else if (modo == 1)
            barridoDer();
        else if (modo == 2)
            barridoBid();
    }
}



void setup()
{
   for (a=0; a<8; a++)
        {
            LED_Enable(LED_D1 + a);         //Habilitamos los led. Configura como salida los pines
            LED_Off(LED_D1 + a);            //Empezamos con todos los led apagados
        }
    
    BUTTON_Enable(BUTTON_S1);   //Habilitamos los pulsadores. Configura como entrada los pines
    BUTTON_Enable(BUTTON_S2);   //Habilitamos los pulsadores. Configura como entrada los pines 
}

void botonPulsado()
{
    if (BUTTON_IsPressed(BUTTON_S1))
            modo ++;
    if (BUTTON_IsPressed(BUTTON_S2))
            freq ++;
    
    if (modo > 2)
            modo = 0;
    if (freq > 4)
            freq = 1;
    
    while (BUTTON_IsPressed(BUTTON_S1) || BUTTON_IsPressed(BUTTON_S2)); //Espera hasta soltar boton
}

void barridoIzq()
{
    for (a=8; a>0; a--)
    {
    LED_On(LED_D1 + a);
    delay_ms(100 * freq );
    LED_Off(LED_D1 + a);
    }
}

void barridoDer()
{
    for (a=0; a<8; a++)
    {
    LED_On(LED_D1 + a);
    delay_ms(100 * freq);
    LED_Off(LED_D1 + a);
    }
}

void barridoBid()
{
    if (a > 6)
        b = -1;
    if (a < 1)
        b = 1;
        
    LED_On(LED_D1 + a);
    delay_ms(100 * freq);
    LED_Off(LED_D1 + a);
    a=a+b;
}

void delay_ms(uint16_t i)
{
    if (BUTTON_IsPressed(BUTTON_S1) || BUTTON_IsPressed(BUTTON_S2))
            botonPulsado();
    
    for ( uint16_t x=0; x < i; x++ ) 
    { 
    __delay_ms(1); 
    }
}
				




- Ejemplo led y pulsadores avanzados:



6. Descargas:



www.microedu.es

Si chove, non orballa!