Iluminando Led
1. Introducción:
Realizaremos el primer proyecto en el cuál manipularemos los leds de la placa. Este proyecto toma como base la plantilla creada en el
apartado "Creando un proyecto nuevo".
También será necesario tener una función que nos genere un retardo controlado.
2. Leds de la placa:

3. Explicación de la función DELAY:
La definición de la función se encuentra en el fichero "pic18.h":
//NOTE: To use the macros below, YOU must have previosly defined _XTAL_FREQ
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000.0))
#define __delay_Ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0))
Para que las funciones anteriores realicen el retardo correcto, debemos definir _XTAL_FREQ.
Nota: _XTAL_FREQ no se refiere a la frecuencia del cristal que
estamos usando, si no a la frecuencia a la que funciona el reloj interno. Nosotros tenemos montado un cristal de 16MHz, pero
internamente el uControlador a través de prescaler, corre a 48MHz.
#define _XTAL_FREQ 48000000
Debemos diferenciar entre:
- __delay(unsigned long cycles).
- __delay_ms(unsigned long ms).
La primera función hace un retardo basándose en el número de instrucciones pasadas; es decir, usa el ciclo de instrucción para
realizar un retardo.
Como máximo permite 50 463 240 (he visto en manuales del XC8 que para los pic18 sólo permite 179 200 instrucciones, sin embargo, realizando
pruebas con el compilador, nos sale error si nos pasamos de 50 463 240 instrucciones):
"main.c:32: error: (1274) delay exceeds maximum limit of 50463240 cycles"
La segunda función, hace un retardo de milisegundos requeridos usando la función anterior. Le pasamos los milisegundos, y calcula los
ciclos de instrucción necesarios a pasar a la función _delay().
Ejemplo:
Para calcular el retardo máximo que podemos hacer con la macro __delay_ms() haremos lo siguiente:
48 000 000 / 4 000 = 12 000
50 463 240 / 12 000 = 4 205,27 mS
El máximo delay que nos permite esta función son 4200 mS. Un delay mayor provoca un desbordamiento y error.
Para solucionar esto y hacer retardos mayores, se usará una función que integre esa macro:
void delay_s (int i) { for (int x=0; x<i; x++) { delay_ms(1000); } }
4. Adaptando las liberí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
led de nuestra placa.
Después con sólo incluirlas en nuestro proyecto, ya tendremos configurado lo relativo a leds.
Nos vamos al siguiente directorio: C:\Program Files(x86)\Microchip\MLA\v2016_11_07\bsp\picdem_fs_usb

Modificaremos estos dos ficheros ya que nuestra placa tiene 8 led y en terminales diferentes.
Nota:
- Los registros TRIS, son usados para configurar los pines como entrada (1), o salida (0).
- Los registros LAT, son usados para cambiar el estado de la salida. Es el registro que debemos modificar para encender
o apagar el led.
4.1. Adaptando "led.h":

4.2. Adaptando "led.c":






5. Ejemplo Parpadeo led:
En este primer ejemplo, usaremos las librerías creadas anteriormente para realizar el parapadeo de un led.
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" #define _XTAL_FREQ 48000000 // se define la frecuencia FOSC -- Hay que tener en cuenta los preescalers usados void delay_s(uint8_t); unsigned long value = 0; void main(void) { LED_Enable(LED_D3); while (true) { LED_Toggle(LED_D3); __delay_ms(200); } }
Compilamos, cargamos el .hex y ya lo tenemos funcionando.
Como se puede observar, primero habilitamos el led que nos interese y luego, usamos la función "toggle" para hacerlo parpadear.
6. Ejemplo función Delay:
En este segundo ejemplo, haremos parpadear un led, pero un periodo controlado por una función de retardo de segundos:
/* * File: main.c * Author: Eduardo * * Created on 5 de junio de 2017, 17:16 */ #include#include "config.h" #include "typedefs.h" #include "led.h" #define _XTAL_FREQ 48000000 // se define la frecuencia FOSC -- Hay que tener en cuenta los preescalers usados void delay_s(uint8_t); unsigned long value = 0; void main(void) { LED_Enable(LED_D3); while (true) { LED_Toggle(LED_D3); delay_s(15); } } void delay_s(uint8_t i) { for ( uint8_t x=0; x < i; x++ ) { __delay_ms(1000); } }
Nota: Acordarse que hay que usar la frecuencia interna: #define _XTAL_FREQ 48000000
7. Ejemplo efecto "coche fantástico":
En este tercer ejemplo, intentaremos hacer el efecto de luces del coche fantástico:
/* * File: main.c * Author: Eduardo * * Created on 5 de junio de 2017, 17:16 */ #include#include "config.h" #include "typedefs.h" #include "led.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; uint8_t b = 1; void main(void) { for (a=0; a<8; a++) { LED_Enable(LED_D1 + a); LED_Off(LED_D1 + a); } while (true) { if (a > 6) b = -1; if (a < 1) b = 1; LED_On(LED_D1 + a); delay_ms(100); LED_Off(LED_D1 + a); a=a+b; } } void delay_ms(uint16_t i) { for ( uint16_t x=0; x < i; x++ ) { __delay_ms(1); } }
- Efecto coche fantástico:
6. Descargas: