Lo Nuevo en PIC's

Cuantos  leds  se necesitan para representar los números del cero al nueve, también la mayoría de las letras, la respuesta correcta es  SIETE por tradición a estos leds se le denota con las letras a,b,c,d,e,f,g la combinación de estas, es decir el juego de luces forman los números deseados. Para mayor información Aqui

Como Utilizar el PIC16F84A y el Visualizador de 7 segmentos01

Ánodo Común: 
 Los leds poseen ánodo y cátodo como se enciendan dependerá de la configuración de  cada led tiene en el display de 7 segmentos.
Si es ánodo debemos poner el cátodo a tierra con una resistencia de protección
Cátodo Común: 
Si es cátodo el ánodo debe estar conectados a tierra  y los otros pines a vcc o corriente directa    
Aplicacion con PIC
EJEMPLO: 
Se desea visualizar las primeras 7 letras de nuestro abecedario, en mayúscula en un display de 7 segmentos, que se repitan una y otra vez.
Antes de empezar  a programar veamos la lógica según el  circuito que tengamos. 

Como Utilizar el PIC16F84A y el Display  Visualizador de 7 segmentos
En nuestro circuito se tiene un display ánodo común, esto es importante ya que nos indicaran como deben configurarse las salidas de datos de los pines; veamos la siguiente tabla: 

Acordarse que todo es binario para el pic, en la tabla se muestra cómo deben encenderse los leds del display, para que formen los caracteres que deseemos, si es ánodo los leds se activaran en bajo y si es cátodo se activaran en alto. 
VEAMOS ES CODIGO! 
'********************************PROGRAMA ********************************
'Un poco de seudocodigo
'1. Definir las variables del programa
‘2. Definir los puertos de salida del PIC16F84A
'3. Guardar los datos en posiciones de memoria del PIC con DATA @(dirección), valor
‘4. Hacer un recorrido por las direcciones de memoria donde se alojaron los datos
‘4.1. leer (READ) las posiciones de memoria read (dirección), valor
‘4.2. salida de los valores por el puerto B
‘4.3. realizar una pausa   
'5. Reiniciar 

i var byte 
B var byte 

trisb = 0
DATA @0, 8
DATA @1, 0 
DATA @2, 70
DATA @3, 64
DATA @4, 6 
DATA @5, 14

inicio: 
while (i <= 5 )
read i, B 
portb = B 
pause 1000
i = i+1 
wend
i = 0 
goto inicio  

'****************************FIN*********************************
EXPLICANDO! 
DATA @0, 8 ------> Se guarda el valor 8 en la direccion 0 
READ I,B   ---------> Se saca B de la direccion I
ojo: para un correcta y robusta implementacion del circuito las resistencias de proteccion son necesarias como tambien antes del testeo del display, todos los pines del display de 7 segmentos deben estar OK. 


MODIFICALO, USALO, CRITICALO, AS LO QUE QUIERAS :-)  

Un ejemplo práctico de lo útiles y prácticos que son los microcontroladores y como con el PIC16F84 que es un dispositivo de bajo coste, nos ahorramos muchos atolladeros de cabeza si tuviéramos que hacerlo con compuertas y memorias externas.
‘Proyecto: SEMAFORO PARA INTERSECCION DE DOS VIAS
El problema es de controlar el tráfico de las vías mediante los símbolos luminosos con las siguientes reglas:
ROJO: Orden de detención vehicular.
AMBAR: Prepararse para detenerse o seguir en marcha.
VERDE: Orden de movimiento vehicular.
En el grafico se muestra como es el supuesto sentido de los vehículos, lógicamente los tiempos para la simulación son menores.
Un poco de seudocódigo:
1.       Configurar los puertos de entrada y salida  
2.       Nombrara el programa
3.       Poner en bajo todos los puertos a usarse
4.       mientras el puerto del pin 4 este en bajo se ejecutara
5.       Activar las luces de verde horizontal, rojo vertical y desactivar las demás luces
6.       tiempo de espera para el cambio de luces pueden ser de 1 minuto a mas en pbp 1000 = 1 segundo
7.       Encender las luces Ámbar para el aviso de cambio de luces el tiempo de este es menor a 2 segundos
8.       Encender las luces rojas Horizontales y verdes verticales y las demás en bajo
9.       Accionar el Ámbar para el aviso de cambio
10.   Bucle mientras este desactivado el pin4
11.   FIN

‘*******************************PROGRAMA ******************************

TRISA = %10000
TRISB = 000000
'nombrar el programa'
luces:
'poner en bajo todos los puertos a usarse'
PORTB = 0
PORTA = 0
'mientras el puerto del pin 4 este en bajo se ejecutara'

WHILE PORTA.4 = 0       
               
                PAUSE 500
'Activar las luces de verde horizontal, rojo vertical y descativar las demas luces'

                HIGH PORTB.0
                LOW PORTB.1
                LOW PORTB.2

                HIGH PORTB.6
                LOW PORTB.7
                LOW PORTA.1

                HIGH PORTA.0
                LOW PORTA.3
                LOW PORTA.2

                HIGH PORTB.5
                LOW PORTB.4
                LOW PORTB.3
'tiempo de espera para el cambio de luces pueden ser de 1 minuto a mas en pbp 1000 = 1 segundo'

                PAUSE 4000
'encender las luces Ambar para el aviso de cambio de luces el tiempo de este es menor
'a 2 segundos
                                               PORTB.0 = 0
                                               HIGH PORTB.4
                                               LOW PORTB.5
                                               LOW PORTB.3

                                               HIGH PORTB.1
                                               LOW PORTB.6
                                               LOW PORTA.1

                                               HIGH PORTA.3
                                               LOW PORTA.2
                                               LOW PORTA.0

                                               HIGH PORTB.7
                                               LOW PORTA.1
                                               LOW PORTB.6

                PAUSE 1000
'Encender las luces rojas Horizontales y verdes verticales y las demas en bajo '
                HIGH PORTB.2
                LOW PORTB.1
                LOW PORTB.0

                HIGH PORTB.3
                LOW PORTB.5
                LOW PORTB.4

                HIGH PORTA.2
                LOW PORTA.3
                LOW PORTA.0

                HIGH PORTA.1
                LOW PORTB.7
                LOW PORTB.6
               
                PAUSE 4000

'accionar el Ambar para el aviso de cambio'
                                               HIGH PORTB.4
                                               LOW PORTB.5
                                               LOW PORTB.3

                                               HIGH PORTB.1
                                               LOW PORTB.6
                                               LOW PORTA.1

                                               HIGH PORTA.3
                                               LOW PORTA.2
                                               LOW PORTA.0

                                               HIGH PORTB.7
                                               LOW PORTA.1
                                               LOW PORTB.6


                PAUSE 500
WEND

GOTO luces 'bucle mientras este desactivado el pin4 '

‘*********************************** FIN **********************************
Semáforo con el PIC16F84A y Pic Basic Pro proteus


Este es un diseño básico con el PIC 16F84A en la actualidad se utilizan GPS  como reloj para sincronizar correctamente los semáforos, Un GPS nos da la posición exacta de un objeto, pero también nos da la hora exacta.
.
Nota: los microcntroladores pueden ser afectados por el medioambiente y otros factores que perturban su frecuencia de trabajo por lo tanto la equivalencia de tiempo.


Se utiliza cuando deseamos mantener la ejecución de un programa, las instrucciones entre WHILE Y WEND se ejecutaran hasta que se cumpla la condición, para finalizar o iniciar.
WHILE condición
                                               Instrucciones
WEND
En este caso la condición debe cumplirse para que se ejecuten las tareas.
Si no se cumple la condición, las instrucciones dentro de WHILE no se ejecutaran y pasara a la siguiente instrucción.
‘*********************************PROGRMA*****************************
'Juego de Luces con Pic Basic Pro y  PIC 16F84A con WHILE-WEND
'Un poco de seudocodigo
'1. definir el programa y los puertos a usar
'2. si el boton es activado
'3. dar un tiempo de 500 a X
'4. for para pulso pin 1
'               4.1 for pulso pin 2
'                              4.2 for pulso pin 3
'                                              4.3 for pulso pin 4                          
'5. Repetir programa
i var byte
x var byte
m var byte
n var byte
o var byte
p var byte

TRISA = 000001
TRISB = %11000001

luces:
PORTB = 0

WHILE PORTA.0 = 1
x = 500

FOR i = 1 TO 25 STEP 1

                               HIGH PORTB.1
                               PAUSE x
                               LOW PORTB.1
                               PAUSE x
                               x = x-4
                               m= 1

                                               FOR m = 1 TO 1 STEP 1

                                               HIGH PORTB.2
                                               PAUSE x
                                               LOW PORTB.2
                                               PAUSE x
                                               x = x-2
                                               n = 1

                                                               FOR n = 1 TO 1STEP 1
                                                               HIGH PORTB.3
                                                               PAUSE x
                                                               LOW PORTB.3
                                                               PAUSE x
                                                               x = x-2
                                                               o = 1

                                                                              FOR o = 1 TO 1 STEP 1
                                                                              HIGH PORTB.4
                                                                              PAUSE x
                                                                              LOW PORTB.4
                                                                              PAUSE x
                                                                              x = x-2

                                                                                              FOR p = 1 TO 1 STEP 1
                                                                                              HIGH PORTB.5
                                                                                              PAUSE x
                                                                                              LOW PORTB.5
                                                                                              PAUSE x
                                                                                              x = x-2

                                                                                             
                                                              
                                                                                              NEXT p
                                              
                                                                              NEXT o

                                                               NEXT n

                                               NEXT m

                NEXT i  

WEND
‘***************************************FIN***********************************

De nuestro proyecto anterior podemos remplazar el IF por un while y funcionara igual, el uso de cada estructura dependerá del programador. 



FORT- NEXT se encarga de generar un bucle finito, ósea repite un número determinado de veces las instrucciones dentro de este comando.
                FOR conteo = inicio TO final STEP incremento o decremento
                               Instrucciones
                NEXT conteo
Todo mejor con un ejemplo:
Este ejemplo consiste en generar un juego de luces con 4 leds los cuales se encenderán y apagaran en secuencia, a medida que transcurre el tiempo la frecuencia de encendido aumenta.   

'**********************PROGRAMA*******************'
'Juego de Luces con Pic Basic Pro y  PIC 16F84A con FOR-NEXT
'Un poco de seudocódigo
'1. definir el programa y los puertos a usar
'2. si el botón es activado
'3. dar un tiempo de 500 a X
'4. for para pulso pin 1
'               4.1 for pulso pin 2
'                              4.2 for pulso pin 3
'                                              4.3 for pulso pin 4                          
'5. Repetir programa
i var byte
x var byte
m var byte
n var byte
o var byte

TRISA = 000001
TRISB = %11000001

Luces:
PORTB = 0

IF PORTA.0 = 1 THEN

x = 500

                FOR i = 1 TO 50 STEP 1

                               HIGH PORTB.1
                               PAUSE x
                               LOW PORTB.1
                               PAUSE x
                               x = x-4
                               m= 1

                                               FOR m = 1 TO 1 STEP 1

                                               HIGH PORTB.2
                                               PAUSE x
                                               LOW PORTB.2
                                               PAUSE x
                                               x = x-2
                                               n = 1

                                                               FOR n = 1 TO 1STEP 1
                                                               HIGH PORTB.3
                                                               PAUSE x
                                                               LOW PORTB.3
                                                               PAUSE x
                                                               x = x-2
                                                               o = 1

                                                                              FOR o = 1 TO 1 STEP 1
                                                                              HIGH PORTB.4
                                                                              PAUSE x
                                                                              LOW PORTB.4
                                                                              PAUSE x
                                                                              x = x-2
                                              
                                                                              NEXT o

                                                               NEXT n

                                               NEXT m

                NEXT i

ENDIF


GOTO Luces
'****************************FIN*****************************'
 Juego de Luces led con Pic Basic Pro y  PIC 16F84A con FOR-NEXT
No olvidar que cada pin de los microcntroladores tienen un maximo de corriente aprox de 5mA por pin verificar datasheet de cada microcntrolador. 



En el mundo de la programación, se manejan estructuras de control estas nos facilitan el proceso lógico al realizar un programa.
En basic la estructura IF-ELSE suele utilizarse como IF-THEN y ENDIF, esta estructura funciona asi:
 SI (se cumple esto) ENTONCES (Ocurre esto) FIN
IF en BASIC para PBP:
                IF ocurre esto THEN
                Sucede esto
                ENDIF
Muy fácil! Es asi! se darán cuenta que todas las estructuras solo siguen una secuencia lógica, no se requiere ser un genio o tener  elevados conocimientos de matemáticas… si tienes un cerebro con 2 neuronas y un ordenador listo!,
La estructura SELECT CASE para PBP, es una variante del IF THEN para varias condiciones  
SELECT CASE (variable)
                Case (dato 1)
                               Conclusión 1
                Case (dato 2)
                               Conclusión 2
                Case (dato 3)
                               Conclusión 3
                Case Else
                               Conclusión 4
END SELECT
Mejor aprender de un ejemplo:
‘*********************PROGRAMA***********************************’
'Juego de luces con IF-THEN SELECT-CASE pjt002'
'Juego de luces con IF-THEN SELECT-CASE pjt002'
'Se pretende iniciar el parpadeo de led 1 con bt1 y led 2 con bt2'
'un poco de seudocodigo'
'1. Iniciar Progrmama luces'
'2. Definir que puertos del pic y pines de entrada y salida'
'3. si el pin 0 del pueto A esta en alto i= 1'
'4. si el pin 4 del puerto A esta en alto i= 2'
'5. caso si i=1 parpadeo x pin 1 del puerto A
'               si el pin 4 del puerto A esta en alto ir a led2'      
'6. caso si i=2 parpadeo x pin 2 del puerto A
'               si el pin 0 del puerto A esta en alto ir a led1''

i var byte  'Declaramos un variable tipo byte'

TRISB = 010001  'Define los pines del puerto B entradas o salidas'

luces:  'inicia el programa'
               
                IF PORTA.0 = 1 THEN  'si el pin 0 del puerto A esta en alto'
                i = 1                                                        'asignar 1 a la variable i '
                ENDIF                                                   'terminar IF'     
                IF PORTA.4 = 1 THEN
                i = 2
                ENDIF


                SELECT CASE i                    'elejir la variable i'

                CASE 1                                                 ' si el valor de i = 1'
                led1:                                                     ' Realizar'
                               IF PORTA.4 = 1 THEN 'durarante el bucle si el pin 4 del puerto A esta en alto'
                               i = 2                                       'asignar el valor de i = 2 '
                               GOTO luces                       'volvemos a luces'
                               ENDIF

                               high PORTA.1    'Iniciamos el tren de pulso, parpadeo de leds'
                               Pause 200
                               low PORTA.1
                               pause 200
                goto led1

                CASE 2                                                  'si el valor de i = 2 ejecutar'
                led2:
                               IF PORTA.0 = 1 THEN
                               i = 1
                               GOTO luces
                               ENDIF

                               high PORTA.2
                               Pause 200
                               low PORTA.2
                               pause 200
                goto led2

                END SELECT
               

goto luces                                            'volver a repetir el programa indefinidamente'

'**********************FIN**************************'
Lo nuevo en este programa es la instruccion TRIS: 
                        TRIS: Este comando define un puerto como entrada o salida, depende del valor asignado (1 para salida y 0 para entrada digital)  el comando se utiliza asi 
                                 TRISpuerto = valor Asignado
                                 TRISA = %11111111  significa que los 8 pines son de salida 

Juego de luces con el PIC16F84A IF-ELSE SELECT-CASE
NOTA: se nota que se añadio en el MCLR un button este funciona para resetear al pic. 



La programación estructurada o secuencial en los microcontroladores.
Sabemos que los PIC hablan en binario, el cual es muy difícil entender y programar para nosotros los humanos, preferimos lenguajes de medio o alto nivel.

El “paradigma de la programación estructurada”  esencialmente consiste en ejecutar las instrucciones paso a paso, línea por línea. No entrare en detalles informáticos lo mejor para aprender es un ejemplo. 

Ejemplo: Encender y Apagar un led con el PIC16F84A
Un poco de seudocódigo no hace daño (Recomiendo hacerlo siempre)
Primero: Nombrar al programa PARPADEOS
Segundo: Poner en alto el pin 1 del puerto A
Tercero:   Pausar la secuencia por 1 segundo
Cuarto: Poner en bajo  el pin 1 del puerto A
Quinto:   Pausar la secuencia por 1 segundo
Sexto: Volver a ejecutar PARPADEOS


'**********************Parpadeo Con Led*******************'
'********************************************************
'El Hola muno de los Microcontroladores'
'Consiste en prender y apagar un led dejando un intervalo de tiempo.

Parpadeos:                                        'Creo mi funcion e inicio del programa'
                High PORTA.1    'pone en alto el pin 1 del puerto A'
                pause 1000                        ' realizo una pausa de 1 segundo'
                Low PORTA.1    'pongo en bajo el pind 1 del mpueto A'
                Pause 1000                        ' realizo una pausa de 1 segundos  '       
goto Parpadeos                               ' retorno al inicio de la funcion indefinidamente'

'Ideasconpic.blogspot.com'
'*******************************************************
La figura representa el circuito básico de un micrcocontrolador y un LED.

 Encender y Apagar un led con el PIC16F84A
Consejos en el diseño electrónico.
  • El MCLR  posee un voltaje de +5v dc, el valor de la resistencia va de acuerdo al voltaje y el nivel de corriente permitido por el microcontrolador.
  • Es recomendable acoplar una resistencia al led, es común colocar una resistencia de 220 ohm pero este no es un valor adecuado para los diferentes colores de Leds cada color tiene un voltaje diferente y esto, esto influye en el valor de la resistencia.
  • En cuanto al oscilador, la frecuencia dependerá de los requerimientos de tu proyecto, cada PIC tiene una frecuencia máxima permitida, esta determina la frecuencia de trabajo del micro.
Derscargar el proyecto: Encender y apagar un LED con el PIC16F84A y PBP