Ejemplos de programación con JALv2 y Multiboard PIC Trainer

(1/4) > >>

Ariel:
Hola!
Este hilo va a contener una serie de ejemplos de programación con el lenguaje JALv2. No hay demasiado material sobre este compilador, así que es posible que esta pequeña colección de ejemplos sea un buen punto de partida para comenzar a utilizarlo.

Los ejemplos van a utilizar solamente el compilador JALv2 (gratuito) y la placa entrenadora Multiboard PIC Trainer (gratuita) diseñada por Felixls. Para poder llevar a cabo los diferentes ejercicios utilizaremos algunos módulos del PIC TRAINER de uControl (gratuito también).



El PIC que voy a utilizar como base para los ejemplos es el PIC18F4550, que tiene mucho para ofrecer por muy poco dinero ;) Por supuesto, nada impide que -en la mayoría de los ejemplos- utilices prácticamente cualquier otro micro, simplemente cambiando el encabezado del código fuente y volviendo a compilar.


Están invitados a colaborar con sus propios ejemplos o plantear sus inquietudes. ;)
INDICE DE EJEMPLOS:

- 001 - LED parpadeando con 18F4550
- 002 - 2 LEDs parpadeando alternadamente con 18F4550
- 003 - 8 LEDs "Coche Fantástico" con PIC18F4550 (Versión 1)
- 004 - PWM con un Led. PIC16F877A (versión 1)
- 005 - 8 LEDs "Coche Fantástico" con PIC18F4550 (Versión 2)

LCD y GLCD:

- LCD Alfanumérico - Ejemplo 01
- LCD Alfanumérico - Ejemplo 02

http://www.youtube.com/v/B80iB-DvCRY http://www.youtube.com/v/wM3OFNscOoE http://www.youtube.com/v/gq6GUxe5GzY


Esta es la disposición de los pines en los conectores de la Multiboard PIC Trainer:


Ariel:
001 - LED parpadeando con 18F4550

Este es el "hola mundo" de los programas para PIC: un led que enciende y apaga continuamente, controlado mediante un pin E/S del microcontrolador.



Esta es la parte más importante del programa:

-- Incluyo la librería que contiene las rutinas de demoras:
include delay

-- Configuro los pines de E/S------------------------------------------------
enable_digital_io()          -- Todos los pines configurados como E/S
alias LED1  is pin_b7        -- LED1 será equivalente al pin 40 (RB7)
pin_b7_direction = output    -- El pin que tiene el LED es una SALIDA
LED1 = off                   -- Apago el LED1

-- Declaro las constantes y variables a utilizar en el programa -------------
const word tiempo_encendido  = 500  -- Milisegundos que permanecerá encendido.
const word tiempo_apagado    = 500  -- Milisegundos que permanecerá apagado.

-- --------------------------------------------------------------------------
-- Comienzo del bucle principal del programa  
-- --------------------------------------------------------------------------

forever loop  -- Bucle que se repite indefinidamente
        LED1 = on                    --Enciendo el LED1...
        delay_1ms(tiempo_encendido)  --Y espero el tiempo prefijado
        LED1 = off                   --Apago el LED1...
        delay_1ms(tiempo_apagado)    --Y espero el tiempo prefijado
end loop      -- Fin del bucle.

- Fin del programa

Como puede verse, el código es muy simple y está comentado. Si tienes alguna duda, utiliza el hilo especial para los comentarios y sugerencias ;)

Veamos que es lo que hace cada una de las instrucciones que hemos utilizado:

- En primer lugar, tenemos que saber que cada linea que comienza con "--" o con ";" es un comentario y es ignorada por el compilador. Como ocurre en cualquier lenguaje de programación, es muy conveniente utilizar los comentarios para documentar el código que uno escribe. Esto lo hace mucho más legible para los demás (y para uno mismo ;) )

- include delay le indica al compilador que incluya la libreria "delay". En ella (puedes ver su código dentro de la carpeta "jalv2/lib/" de tu ordenador) se encuentran las rutinas encargadas de proporcionar retardos.

- enable_digital_io() hace que todos los pines del micro se comporten como pines de E/S digital. De esa manera, se deshabilitan comparadores, conversores A/D y cualquier otra función semejante.

- alias LED1  is pin_b7  hace que podamos utilizar la cadena "LED1" en lugar de "pin_b7". Esto se denomina "alias" y es un recurso muy interesante, ya que si nuestro hardware cambia (por ejemplo, conectando el led al pin RD3) simplemente hay que cambiar esa linea y el resto del programa permanece inalterado.

- pin_b7_direction = output configura el pin en que se encuentra el led (pin_b7) como salida.

- LED1 = off hace que la salida en la que está el led -fijate: hemos utilizado el alias en lugar de pin_b7-   se ponga en cero. JALv2 proporciona muchas formas equivalentes de decir "cero": off, low, 0 y false  son algunas de ellas.

- const word tiempo_encendido  = 500  crea una constante -una región de la memoria del micro en la que se alojará un valor que permanecerá inalterado a lo largo de todo el programa- del tipo "word" (dos bytes) llamada "tiempo_encendido" y le asigna el valor (decimal) "500".

- forever loop .... end loop es una estructura de control. Todas las sentencias que se encuentran entre una y otra de estas instrucciones se repetirán indefinidamente. Otros lenguajes de programación permiten esto a partir de sentencias del tipo "do" o "while", pero JALv2 posee una estructura especialmente creada para ello. Es posible salir de este loop, como veremos más adelante.

- LED1 = on es lo opuesto a "LED1 = off":  hace que la salida en la que está el led  se ponga en uno. JALv2 proporciona muchas formas equivalentes de decir "uno": on, high, 1 y true  son algunas de ellas.

-  delay_1ms(tiempo_encendido) utiliza la función "delay_1ms()" de la libreria "delay" para crear una demora de la cantidad de milisegundos que indica el valor de "tiempo_encendido" (en este caso 500, o lo que es lo mismo, medio segundo).

Este es el resultado:

http://www.youtube.com/v/B80iB-DvCRY

NOTA: Adjunto el programa fuente completo y el HEX listo para grabar.

Volver al índice

Ariel:
002 - 2 LEDs parpadeando alternadamente con 18F4550

Una pequeña "evolución" del ejemplo anterior. Ahora tenemos dos LEDs encendiendo alternadamente.  



Esta es la parte más importante del programa:

-- Incluyo la librería que contiene las rutinas de demoras:
include delay

-- Configuro los pines de E/S------------------------------------------------
enable_digital_io()            -- Todos los pines configurados como E/S
alias LED1       is pin_b7     -- LED1 será equivalente al pin 40 (RB7)
alias LED2       is pin_b6     -- LED2 será equivalente al pin 39 (RB6)
pin_b7_direction = output      -- El pin que tiene el LED1 es una SALIDA
pin_b6_direction = output      -- El pin que tiene el LED2 es una SALIDA

LED1 = off                     -- Apago el LED1
LED2 = off                     -- Apago el LED2

-- Declaro las constantes y variables a utilizar en el programa -------------
const word tiempo  = 500       -- Milisegundos entre cambios.
-- --------------------------------------------------------------------------
-- Comienzo del bucle principal del programa  
-- --------------------------------------------------------------------------
forever loop  -- Bucle que se repite indefinidamente
   LED1 = on          --Enciendo el LED1...
   LED2 = off         --y apago el LED2.
   delay_1ms(tiempo)  --Espero el tiempo prefijado
   LED1 = off         --Apago el LED1...
   LED2 = on          --y enciendo el LED2.
   delay_1ms(tiempo)  --Espero el tiempo prefijado
end loop      -- Fin del bucle.

Como puede verse, el código es muy simple y está comentado. Si tienes alguna duda, utiliza el hilo especial para los comentarios y sugerencias ;)

No hemos utilizado más instrucciones que las vistas en el ejemplo anterior, así que directamente te mostramos el resultado:

http://www.youtube.com/v/wM3OFNscOoE

NOTA: Adjunto el programa fuente completo y el HEX listo para grabar.

Volver al índice

Ariel:
003 - 8 LEDs "Coche Fantástico" con PIC18F4550 (Versión 1)

Este es el clásico efecto del punto luminoso que "va y viene", como el juego de luces que tenía el coche de la serie "El coche fantástico" en su frente. Esta es la forma de hacerlo "a lo bruto", controlando individualmente cada LED. Es posible hacerlo con las instrucciones vistas en los ejemplos anteriores. En el ejemplo siguiente veremos como hacer lo mismo de una forma mucho más eficiente.



Este es el código fuente del programa:

Código:

--------------------------------------------------------------------------------
--                Ejemplos de programación con JALv2
--
-- Ejemplo 003 c/PIC18F4550 y Multiboard PIC Trainer
-- Más detalles en http://www.ucontrol.com.ar/forosmf/jal-y-jalv2/
--------------------------------------------------------------------------------
-- Descripcion:
-- 8 LEDs en el portB realizan el típico movimiento del "coche fantástico"
-- sin sutilezas (ver ejemplo 004)
--
--------------------------------------------------------------------------------
-- Módulos utilizados:
--
-- Multiboard Pic Trainer  
-- (http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/multiboard-pic-trainer-2-0/)
--
-- Módulo 8 E/S            
-- (http://www.ucontrol.com.ar/forosmf/circuiteca-la-biblioteca-de-circuitos-y-proyectos-de-ucontrol/pic-trainer/msg103/#msg103)
--
--------------------------------------------------------------------------------
-- Resumen uso E/S:
--
-- #Pin | Puerto | Función
--  ---------------------------------------------------------------------------
--  33  | RB0-RB7| Ochos LEDs, cada uno de ellos con el anodo conectado a uno de
--   a  |        | los pines del PIC y el cátodo a GND a través de una R de 220
--  40  | RB7    |  ohms.
--      |        |
--  ----------------------------------------------------------------------------  
-- Oscilador con cristal de 20MHz
--------------------------------------------------------------------------------

-- Configuración de módulos del chip y fuses-----------------------------------
include 18f4550
pragma target clock       48_000_000

pragma target PLLDIV        P5          -- divide por 5 - 20MHZ_INPUT
pragma target CPUDIV        P2          -- OSC1_OSC2_SRC_1_96MHZ_PLL_SRC_2
pragma target USBPLL        F48MHZ      -- CLOCK_SRC_FROM_96MHZ_PLL_2
pragma target OSC           HS_PLL
pragma target FCMEN         DISABLED
pragma target IESO          DISABLED
pragma target PWRTE         DISABLED    -- power up timer
pragma target VREGEN        ENABLED     -- USB voltage regulator
pragma target VOLTAGE       V20         -- brown out voltage
pragma target BROWNOUT      DISABLED    -- no brownout detection
pragma target WDTPS         P32K        -- watch dog saler setting
pragma target WDT           DISABLED    -- no watchdog
pragma target CCP2MUX       pin_C1      -- CCP2 pin
pragma target PBADEN        DIGITAL     -- digital input port<0..4>
pragma target LPT1OSC       LOW_POWER   -- low power timer 1
pragma target MCLR          EXTERNAL    -- master reset on RE3
pragma target STVR          DISABLED    -- reset on stack over/under flow
pragma target LVP           DISABLED    -- no low-voltage programming
pragma target XINST         ENABLED     -- extended instruction set
pragma target DEBUG         DISABLED    -- background debugging
pragma target CP0           DISABLED    -- code block 0 not protected
pragma target CP1           DISABLED    -- code block 1 not protected
pragma target CP2           DISABLED    -- code block 2 not protected
pragma target CP3           DISABLED    -- code block 3 not protected
pragma target CPB           DISABLED    -- bootblock code not write protected
pragma target CPD           DISABLED    -- eeprom code not write protected
pragma target WRT0          DISABLED    -- table writeblock 0 not protected
pragma target WRT1          DISABLED    -- table write block 1 not protected
pragma target WRT2          DISABLED    -- table write block 2 not protected
pragma target WRT3          DISABLED    -- table write block 3 not protected
pragma target WRTB          DISABLED    -- bootblock not write protected
pragma target WRTD          DISABLED    -- eeprom not write protected
pragma target WRTC          DISABLED    -- config not write protected
pragma target EBTR0         DISABLED    -- table read block 0 not protected
pragma target EBTR1         DISABLED    -- table read block 1 not protected
pragma target EBTR2         DISABLED    -- table read block 2 not protected
pragma target EBTR3         DISABLED    -- table read block 3 not protected
pragma target EBTRB         DISABLED    -- boot block not protected

-- Incluyo la librería que contiene las rutinas de demoras:
include delay

-- Configuro los pines de E/S ------------------------------------------------
enable_digital_io()            -- Todos los pines configurados como E/S
alias LED0       is pin_b0     -- LED0  será equivalente a RB0
alias LED1       is pin_b1     -- LED1  será equivalente a RB1
alias LED2       is pin_b2     -- LED2  será equivalente a RB2
alias LED3       is pin_b3     -- LED3  será equivalente a RB3
alias LED4       is pin_b4     -- LED4  será equivalente a RB4
alias LED5       is pin_b5     -- LED5  será equivalente a RB5
alias LED6       is pin_b6     -- LED6  será equivalente a RB6
alias LED7       is pin_b7     -- LED7  será equivalente a RB7

PORTB_direction = 0x00         -- Todo el puerto B como salidas

LED0 = off                     -- Apago el LED0
LED1 = off                     -- Apago el LED1
LED2 = off                     -- Apago el LED2
LED3 = off                     -- Apago el LED3
LED4 = off                     -- Apago el LED4
LED5 = off                     -- Apago el LED5
LED6 = off                     -- Apago el LED6
LED7 = off                     -- Apago el LED7

-- Declaro las constantes y variables a utilizar en el programa -------------
const word tiempo  = 100       -- Milisegundos entre cambios.

-- --------------------------------------------------------------------------
-- Comienzo del bucle principal del programa  
-- --------------------------------------------------------------------------

forever loop  -- Bucle que se repite indefinidamente
LED0 = on          --Enciendo el LED0...
delay_1ms(tiempo)  --Espero el tiempo prefijado
LED0 = off         --Apago el LED0...
LED1 = on          --Enciendo el LED1...
delay_1ms(tiempo)  --Espero el tiempo prefijado
LED1 = off         --Apago el LED1...
LED2 = on          --y enciendo el LED2.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED2 = off         --Apago el LED2...
LED3 = on          --y enciendo el LED3.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED3 = off         --Apago el LED3...
LED4 = on          --y enciendo el LED4.
delay_1ms(tiempo)  --Espero el tiempo prefijado
LED4 = off         --Apago el LED4...
LED5 = on          --y enciendo el LED5.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED5 = off         --Apago el LED5...
LED6 = on          --y enciendo el LED6.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED6 = off         --Apago el LED6...
LED7 = on          --y enciendo el LED7.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED7 = off         --Apago el LED7...
--Aqui comienza la vuelta....
LED6 = on          --Enciendo el LED6...
delay_1ms(tiempo)  --Espero el tiempo prefijado
LED6 = off         --Apago el LED6...
LED5 = on          --y enciendo el LED5.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED5 = off         --Apago el LED5...
LED4 = on          --y enciendo el LED4.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED4 = off         --Apago el LED4...
LED3 = on          --y enciendo el LED3.
delay_1ms(tiempo)  --Espero el tiempo prefijado
LED3 = off         --Apago el LED3...
LED2 = on          --y enciendo el LED25.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED2 = off         --Apago el LED2...
LED1 = on          --y enciendo el LED1.
delay_1ms(tiempo)  --Espero el tiempo prefijadojado
LED1 = off         --Apago el LED1...
end loop      -- Fin del bucle.

-- Fin del programa




Este es el resultado:

http://www.youtube.com/v/gq6GUxe5GzY

NOTA: Adjunto el programa fuente completo y el HEX listo para grabar.

Volver al índice

Leon Pic:
004 - PWM con un Led. PIC16F877A (versión 1)

Vamos aumentando un poco la dificultad con una aplicación interesante. El PWM se utiliza para muchas cosas, entre ellas controlar la velocidad de un motor de CC, dar efecto a luces de CC.



Código de programa.

Nota: Este programa, está en la carpeta de sample del JAL. Lo único que hice fue comentar, en castellano, el programa y doy una pequeña explicación.

Código:

-----------------------------------------------------------------
-- PWM CON UN LED
-----------------------------------------------------------------
--
-- El circuito está formado un cristal de 20Mhz
-- y un led en RC2
-----------------------------------------------------------------

-- Incluimos la librería del pic 16F877A
include 16f877a

pragma target clock 20_000_000                  -- xtal frequency
pragma target OSC        hs
pragma target   LVP disabled
pragma target   WDT disabled

-- COnfiguración de los pines.
alias lcd_bl is pin_c2
alias lcd_bl_direction is pin_c2_direction
   
enable_digital_io()

-- Configuracíon PWM
pin_ccp1_direction = output
include pwm_hardware
pwm_max_resolution(1)
pwm1_on()


forever loop
   
   var word i
   i = 0
   
   -- Resolución del PWM de 10 bit (duty < 1024)
   while i < 1020 loop -- Mientras i es menor a 1020
      pwm1_set_dutycycle_highres(i) -- cargamos el duty con el contenido de i
      _usec_delay(50000) -- Demora. Regulamos la velocidad del PWM
-- Si es muy chica la demora, no se apreciarán los cambios
-- Si es muy grande la demora, tardará mucho en ir de 0V a 5V
      i = i + 10 -- Incrementamos en 10 la variable i.
-- Modificando el incremento, también variamos la velocidad de barrido
-- del PWM
   end loop
   while i > 0 loop -- Aquí pasa lo mismo que el while anterior, pero en sentido inverso.
      pwm1_set_dutycycle_highres(i)
      _usec_delay(50000)
      i = i - 10
   end loop
   
   _usec_delay(50000) -- Tiempo de permanencia apagado el led una vez que terminó el ciclo anterior
   pwm1_off()
   _usec_delay(50000) -- Tiempo de permanencia encendido del led una vez que terminó el ciclo anterior
   pwm1_on()
    -- Si estos valores son chicos, o se anula esta parte del programa, el led variará
-- continuamente. Si es muy grande la demora, el led permanecera bastante tiempo
-- encendido y apagado hasta comenzar un nuevo ciclo del PWM
end loop


El resultado:

http://www.youtube.com/v/4Kc299xl1qY


Volver al índice

Navegación

[0] Índice de Mensajes

[#] Página Siguiente