lunes, 19 de marzo de 2012

Recursos de Microcontroladores y Familia de los PIC

Recursos


Los fabricantes de microcontroladres tienen diferentes versiones de una arquitectura básica de microcontrolador. En algunas versiones se tiene más memoria, en otras se añaden nuevos recursos, etc. El diseñador tiene que encontrar el modelo mínimo que satisfaga todos los requerimientos de su aplicación. Con esto minimizar el coste, el hardware y el software. Aquí mencionaré los principales recursos que tienen los microcontroladores:

Temporizadores o Timers

Se utilizan para controlar periodos de tiempo (temporizadores) y para llevar la cuenta de los sucesos que se llevan a cabo en el exterior (contadores).

Para medir los tiempos se carga un registro con el valor adecuado y después este valor se incrementa o decrementa al ritmo de los impulsos de reloj o algún múltiplo hasta que se desborde y llegue a 0. Cuando se quieren contar sucesos que se materializan por cambios de nivel en alguna de las patitas del microcontrolador, el registro se va incrementando o decrementando al ritmo de estos impulsos. El registro es un valor numérico en una posición fija de memoria. Un ejemplo de esto es cuando se tiene un segundero en un reloj digital, este va aumentando hasta que llega a 60, pero en la pantalla aparece 00, esto quiere decir que se desborda, cuando esto pasa da un aviso y se incrementan los minutos. En este ejemplo, el registro sería el segundero; estos son fijos.


Perro guardián o Watchdog

Cuando tenemos una falla con algún aparato por ejemplo el módem puedes pulsar el botón de reset y se reincida el sistema. Pero en el caso de los microcontroladores, funcionan sin el control de un supervisor y de forma continuada las 24 horas del día. El perro guardián consiste en un contador que al llegar al máximo provoca un reset automáticamente en el sistema.

Protección ante fallo de alimentación o Brownout

Se trata de un circuito que resetea al microprocesador cuando el voltaje de alimentación (VDD) es inferior a un voltaje mínimo (brownout). Mientras el voltaje de alimentación sea inferior al de brownout el dispositivo se mantendrá reseteado, comenzando a funcionar normalmente cuando se sobrepase el valor.

Estado de reposo o de bajo consumo

Son muchas las situaciones reales de trabajo en las que el microcontrolador debe esperar, sin hacer nada, a que se produzca un evento externo que lo ponga otra vez en funcionamiento. Para ahorrar energía, los microcontroladores tienen una instrucción especial (SLEEP en los PIC), que los pasa al estado de reposo o de bajo consumo, en el que los requerimientos de potencia son mínimos. Cuando se encuentran en ese estado, el reloj principal se detiene y se congelan sus circuitos asociados. 

Conversor A/D (CAD)

Los microcontroladores que tienen un Conversor A/D (Analógico/Digital) pueden procesar señales analógicas.  La mayoría tienen un multiplexor que permite aplicar a la entrada del CAD diferentes señales analógicas desde las patillas del circuito integrado.

Conversor D/A (CDA)

Transforma los datos digitales que se obtienen del procesamiento del computador en su correspondiente señal analógica que saca al exterior por una de las patillas del chip. 

Comparador analógico

Algunos microcontroladores tienen internamente un amplificador operacional que actúa como comparador entre una señal fija de referencia y otra variable que se aplica por una de las patillas de la cápsula. La salida del comparador brinda un nivel lógico 1 ó 0 según una señal sea mayor o menor que la otra.

Modulador de anchira de impulsos o PWM

Son circuitos que brindan en su salida impulsos de anchura variable, que se ofrecen al exterior mediante las patitas del encapsulado.

Puertos digitales E/S

Los microcontroladores destinan algunas de sus patillas para soportar líneas de E/S digitales. Normalmente, estas líneas se agrupan de ocho en ocho formando puertos. Las líneas digitales de los puertos se pueden configurar como entrada o salida cargando un 1 ó 0 en el bit que corresponde a un registro. 

Puertos de comunicación

Con el fin de hacer posible que el microcontrolador se pueda comunicar con otros dispositivos externos, otros buses de microprocesadores, buses de sistemas, buses de redes se pueden adaptar con otros elementos bajo ciertas normas y protocolos, existen algunos modelos que tienen recursos que permiten realizar esa comunicación. Entre ellos destacan:

UART, adaptador de comunicación serie asíncrona (Ej. Puerto Serie)
USART, adaptador de comunicación serie síncrona y asíncrona
USB (Universal Serial Bus), moderno bus serie para los PC
Bus I2C, interfaz serie de dos hilos 
CAN (Controller Area Network), permite la adaptación con redes de conexionado multiplexado.


Familia de los PIC



La familia PIC fue desarrollada por la casa Microchip, esta dividida en cuatro gamas: enana, baja, media y alta. Las principales diferencias en estas gamas está en el número de instrucciones y su longitud, el número de puertos y funciones, la complejidad interna y de programación y en el número de aplicaciones. 

La gama baja o gama enana es de 8 patas. Es un grupo de PIC que tiene como principal característica que es pequeño, ya que solo tiene 8 patitas. Se alimentan con un voltaje de corriente mínima de entre 2,5 V y 5,5 V y consumen menos de 2 mA cuando trabajan a 5 V y 4 MHz. El formato de instrucciones puede ser de 12 o 14 bits y su repertorio es de 33 o 35 instrucciones. 

La gama enana a pesar de que sólo tienen 8 patitas, se pueden destinar hasta 6 como líneas de E/S para los periféricos ya que disponen de un oscilador interno R-C. Los modelos 12C5xx pertenecen a la gama baja y su tamaño de instrucciones es de 12 bits, los 12C6xx son de gama media y sus instrucciones son de 14 bits, los 12F6xx tienen memoria Flash para el programa y EEPROM para los datos. Estos últimos son una serie de PIC de recursos limitados, sus versiones tienen 18 y 28 patitas y se alimentan de una tensión de 2,5 V, tienen un consumo de menos de 2 mA a 5 V y 4 MHz. Tienen un repertorio de 33 instrucciones de 12 bits. 

Al igual que todos los miembros de la familia PIC16/17, los de gama baja se caracterizan por tener los siguientes recursos: Sistema Power On Reset, Perro guardián (Watchdog o WDT), código de protección, etc. Sus principales desventajas son que la pila solo tiene dos niveles y que no admiten interrupciones.

Gama media. PIC16CXXX con instrucciones de 14 bits

Es la gama más variada y completa de los PIC. Abarcan modelos desde 18 hasta 68 patitas, dentro de esta gama se encuentra el PIC16X84 y sus variantes. 

En esta gama se agregan más cosas de las que tienen los de gama baja, admiten interrupciones, tienen comparadores de magnitudes analógicas, convertidores A/D, puertos serie y temporizadores. El repertorio de instrucciones es de 35 de 14 bits cada una y compatible con el de la gama baja. Dentro de esta gama también se encuentra el PIC14C000 que soporta el diseño de controladores inteligentes para cargadores de baterías, pilas pequeñas, fuentes de alimentación ininterrumpibles, etc. 

Gama alta. PIC17CXXX con instrucciones de 16 bits

En esta gama tiene un repertorio de instrucciones de 58 con 16 bits y sus modelos tienen un sistema de gestión de interrupciones vectorizadas muy potente. Tienen también diferentes controladores de periféricos, puertos de comunicación serie y paralelo con elementos externos, multiplicador hardware de gran velocidad y mayores capacidades de memoria.

La principal característica de los elementos de esta gama es que su arquitectura es abierta, que consiste en la posibilidad de ampliación del microcontrolador con elementos externos. Para lograr esto, las patitas sacan al exterior las líneas de los buses de datos, direcciones y control, a las que se conectan memorias o controladores de periféricos. 

Microcontroladores

Un microcontrolador es un dispositivo electrónico que es capaz de realizar procesos lógicos. Estos procesos o acciones se programan en lenguaje ensamblador por el usuario y se introducen en el microcontrolador a través de un programador. 

Actualmente, podemos encontrar microcontoladores en el hogar, en nuestro trabajo, en nuestra vida. Se encuentran controlando el funcionamiento de los teclados y ratones de las computadoras, en los teléfonos, en los hornos microondas, en las televisiones, etc. Algunos fabricantes de microcontroladores superan el millón de unidades de un modelo determinado producido en una semana. 

Tipos de arquitecturas de microcontroladores



Arquitectura Von Neumann






La arquitectura tradicional de las computadoras y microprocesadores está basado en la arquitectura Von Neumann, en donde la unidad central de proceso (CPU), está conectada a una memoria única donde se guardan las instrucciones del programa y los datos. El tamaño de la unidad de datos o instrucciones está definido por el ancho del bus que comunica la memoria con la unidad central de proceso. Por ejemplo un microprocesador de 8 bits con un bus de 8 bits, tendrá que tener datos e instrucciones de una o más unidades de 8 bits de longitud. Si se quiere acceder a una instrucción o dato de más de un byte de longitud se tendrá que hacer más de un acceso a la memoria. Teniendo un sólo bus hace que el microprocesador sea más lento en su respuesta, debido a que no puede buscar en memoria una nueva instrucción mientras no finalicen las transferencias de datos de la instrucción anterior. 


Arquitectura Harvard






La arquitectura Harvard tiene la unidad central de proceso (CPU) conectada a dos memorias (una con las instrucciones y otra con los datos) a través de dos buses diferentes. Una de las memorias tiene solamente las intrusiones del programa y la otra sólo almacena los datos. Los dos buses son independientes y pueden ser de diferentes anchos. Para procesar un set de instrucciones reducido (RISC), el set de instrucciones y el bus de memoria de programa pueden diseñarse de forma que todas las instrucciones tengan una sola posición de memoria de programa de longitud. Una ventaja de que los buses sean independientes es que la CPU puede acceder a los datos para completar la ejecución de una instrucción y al mismo tiempo leer la siguiente instrucción.


Ventajas
  • El tamaño de las instrucciones no se relaciona con el de los datos, por lo tanto se puede optimizar para que cualquier instrucción ocupe una sola posición de memoria de programa y con esto tener mayor velocidad y menor longitud de programa.
  • El tiempo de acceso a las instrucciones se puede superponer con el de los datos y con esto lograr una mayor velocidad en cada operación.
Desventajas
  • Los procesadores deben tener instrucciones especiales para acceder a tablas de valores constantes que pueda ser necesario incluir en los programas, ya que estas tablas se encontrarán físicamente en la memoria de programa.

Estructura y elementos de los microcontroladores

El procesador


Es el elemento principal del microcontrolador, determina las principales características en nivel software y hardware. Es responsable de direccionar la memoria de instrucciones, recibir el código OP de la instrucción actual, su decodificación y la ejecución de la operación que implica la instrucción, así como la búsqueda de los operandos y el almacenamiento del resultado. 

Tipos de procesadores


CISC


En los microcontroladores se utilizan un gran número de procesadores que se basan en la filosofía CISC (Computadores de Juego de Instrucciones Complejo). Tienen más de 80 instrucciones máquina, de las cuales algunas son muy potentes y complejas y requieren de muchos ciclos para ejecutarse. Una ventaja es que ofrecen al programador instrucciones complejas que actúan como macros.

RISC


Computadores de juego de instrucciones reducido (RISC), en estos procesadores las instrucciones máquina son muy reducidas, las instrucciones son simples y se ejecutan en un ciclo. Esto permite que se pueda optimizar el hardware y software del procesador.

SISC


SISC (Computadores de juego de instrucciones específico), estos procesadores se utilizan en microcontroladores destinados a aplicaciones muy concretas, las instrucciones son reducidas y específicas y se adaptan a las necesidades de la aplicación prevista.




Memoria


En los microcontroladores la memoria de instrucciones y datos está integrada en el chip. Una parte de la memoria es no volátil, tipo ROM, y tiene el programa de instrucciones de la aplicación. Otra parte de la memoria es tipo RAM, volátil, y ahí se guardan las variables y los datos. 


A diferencia de las computadoras personales, en este caso los microcontroladores no tienen almacenamiento masivo como disco duro. Los microcontroladores sólo se destina a una sola tarea en la memoria ROM, sólo se almacena un único programa de trabajo. En estos dispositivos la RAM es de poca capacidad ya que sólo contiene las variables y los cambios de información que se produzcan en el transcurso del programa. 


ROM con máscara


Es una memoria no volátil de sílo lectura, su contenido se graba en la fabricación del chip. Los chips se fabrican en obleas que tienen varias decenas de chips. Las obleas se fabrican a partir de procesos fotoquímicos, donde se impregnan capas de silicio y oxido de silicio y se erosionan al exponerlos a la luz. 


OTP


El microcontrolador tiene una memoria no volátil de sólo lectura programable una sola vez por el usuario. OTP (One Time Programmable), el usuario es quien escribe el programa en el chip a través de un programador controlado por un programa desde la computadora. 


EPROM


Algunos microcontroladores tienen memoria EPROM (Erasable Programmable Read Only Memory) en la cual puede programarse, borrarse y grabarse muchas veces. La grabación se realiza con un programador manejado desde la computadora. Si se desea borrar el contenido, tienen una ventana de cristal en la superficie por la que se somete a la EPROM a rayos ultravioleta durante varios minutos. 


EEPROM, E2PROM 


Son memorias de sólo lectura, programables y borrables eléctricamente EEPROM (Electrical Erasable Programmable Read Only Memory). La programación y el borrado se hacen eléctricamente desde el propio programador y bajo el control programado de una computadora. 


Flash


Es una memoria no volátil, que se puede escribir y borrar, funciona como una ROM y una RAM pero consume menos y es más pequeña. Es más rápida y de mayor densidad que la EEPROM, tolera más ciclos de escritura/borrado. Las memorias EEPROM y Flash son muy útiles ya que permiten que los microcontroladores que las tienen puedan ser reprogramados 
en circuito. 




Puertas de Entrada y Salida


Las puertas de entrada y salida (I/O) hacen posible la comunicación al procesador con el mundo exterior, por medio de interfaces, o con otros dispositivos. También se llaman puertos y son la principal utilidad de las patitas o pines de un microprocesador. 


Reloj principal

Todos los microcontroladores tienen un circuido oscilador que genera una onda cuadrada de alta frecuencia, que configura los impulsos de reloj en la sincronización de todas las operaciones del sistema. Esta señal de reloj es el motor del sistema y la que hace que el programa y los contadores avancen. 




Referencias
Microcontroladores

domingo, 11 de marzo de 2012

Introducción al lenguaje ensamblador

El lenguaje ensamblador es un lenguaje de bajo nivel que representa más directamente el código máquina específico para cada arquitectura de computadoras legible por un programador.

Se utiliza para mejorar la eficiencia de alguna rutina específica, para realizar tareas que no son soportadas por lenguajes de alto nivel, para obtener acceso a otras funciones de bajo nivel del procesador, entre otras cosas.

Es el lenguaje de programación más básico disponible de algún procesador. Con el lenguaje ensamblador, un programador trabaja con operaciones implementadas directamente desde el hadware (CPU físico). El lenguaje ensamblador carece de variables y funciones, y no es portatil entre algunas familias de procesadores.

¿Porqué usar lenguaje ensamblador?
Un programa en ensamblador es más rápido que uno generado por un compilador en un lenguaje de alto nivel.

Éste lenguaje es el lenguaje de programación más poderoso que existe, le permite a los programadores tener la percepción requerida para escribir adecuadamente y de una manera más óptima los lenguajes de alto nivel. Aprender lenguaje ensamblador vale el tiempo y esfuerzo que le dedique.

Cuando un código es escrito en lenguaje de alto nivel, éste debe ser compilado, traducido a lenguaje máquina, y luego ser interpretado por otro programa.

Con el lenguaje ensamblador es diferente, sus instrucciones corresponden y tienen mucho parecido al lenguaje máquina, por lo que es más fácil interpretarse y requiere menos tiempo y recursos.

El lenguaje ensamblador permite al programador utilizar representación simbólica de códigos de operación de máquina, ubicaciones de memoria, registros, entre otras partes de una instrucción.

Ejemplo

Tenemos éste código escrito en ensamblador:

MOV AX, 47104
MOV DS, AX
MOV [3998], 36
INT 32

Cuando se lee este programa, cada una de las líneas de código escritas se convierten en instrucciones para el CPU. Este programa utiliza dos tipos de instrucciones: MOV y INT. La función de MOV mueve la información, mientras que ING transfiere el control del procesador a los drivers del dispositivo o al sistema operativo.

Con esto podemos decir que la instrucción MOV AX, 47104 le dice a la computadora que copie el número 47104 en la ubicación AX.

La siguiente instrucción: MOV DS, AX, le dice a la computadora que copie el número en AX a la ubicación DS.

Después, MOV [3998], 36 le dice a la computadora que ponga el número 36 en la ubicación 3998 de la memoria.

ING 32 termina el programa y se regresa al sistema operativo.

¿Cómo funciona éste programa?

Dentro del CPU existen varias ubicaciones llamadas registros, donde se almacena un número. Existen registros tales como AX, que son de no realizan acciones especiales, sin embargo, otros registros como DS, controlan la forma en la que el CPU funciona.

DS es el registro del segmento, se usa para seleccionar en qué área de la memoria puede escribir el CPU. En el programa escrito anteriormente escribimos el número 47104 en DS, esto le dice al CPU que accese a la memoria en la tarjeta de video.

Después nuestro programa ubica el número 36 en 3998 de la tarjeta de video. 36 es el código para el signo "quot; y 3998 es la ubicación de ña esquina inferior derecha de la pantalla. Entonces un signo $ va a aparecer en la pantalla por unos microsegundos. Después, nuestro programa le dice al CPU que haga una interrupción. Una interrupción se usa para detener un programa y ejecutar otro en su lugar. En este caso, vamos a interrumpir 32 y terminar nuestro programa para que se regrese al prinicipio.

Bibliografía

Introduction to assembly language

Assembly language









Tarea 1 - Proyecto PIC

En este post describiré cómo hacer un letrero luminoso 


Material necesario:




Material para soldar




Primeramente vamos a trabajar con el ventilador:


1. El primer paso es insertar el led infrarojo por debajo de la entrada de 12 V del ventilador.
2. La resistencia de 560 Ohms (verde, azul y café) debe ser soldada al cátodo del led (patita más corta), dejando una separación de 1.5 cm entre el led y la resistencia.




3. Aislamos la conexión con cinta.
4. Ahora tenemos que conectarla por debajo del ventilador al cable de color azul que viene en el abanico y soldar. La otra patita del led que no tiene resistencia se conecta al cable rojo.
Nota: Para conectar el cable con la resistencia es necesario pelar el cable en la parte en la que se va a conectar sin cortar el resto. Soldamos esa parte y aislamos con cinta.




Para probar si el abanico funciona debemos conectar los cables rojo y azul que quedaron arriba a un eliminador (cargador) o una fuente de luz. El abanico debe girar. 

Ahora sigamos con el circuito:
Aqui se muestra un diagrama que tenemos que seguir para que el circuito sea formado correctamente




Tenemos una tablita con el circuito ya impreso, solamente tenemos que colocar las piezas en el orden y posición adecuados.




Aqui se muestra cómo se van a colocar las piezas descritas previamente en el material y la manera en la que se deben acomodar.
La base del circuito integrado debe estar en posición U3.
Las resistencias deben estar en sus respectivas posiciones (R1-R2).
Los leds tienen que ir acomodados en la posición correcta, tenemos que verificar que el cátodo esté en la parte de abajo. (La patita más corta del led es el cátodo).
El regulador tiene que estar ubicado en posición U2.
El capacitor debe estar en posición C1. Es importante verificar la posición de la terminal positiva.


Cuando terminemos de acomodar estos componentes debemos soldarlos, de manera que quede fijo el circuito.
También debemos soldar los cables del porta pila.
Después tenemos que cortar los excesos de metal.


Después de tener nuestro circuito tenemos que soldar también el foto transistor (D1). Éste debe ir soldado a 1.5 cms sobre la tabla, ya que después se doblará y se colocará hacia abajo. También debemos soldar y cortar los excesos de metal.


El circuito debe quedar de la siguiente manera:




Ahora colocamos el circuito sobre el abanico en la base y le agregamos una batería de 9 Volts.

Al final debe quedar de la siguiente manera:


Si queremos probar si funciona bien, podemos insertar un led en la base de pic. Tiene que estar en la linea numero 5, contando desde el lado donde está el regulador. El foco del led debe encender.


El ventilador debe ir atornillado a una base para que no se mueva mucho.


Ahora tenemos que programar el pic que va a ir en la base. Este pic es el que hará que prendan los leds del letrero luminoso y forme las palabras que queremos.


Para esto necesitamos:


Hardware:










Software:
  • Steren PIC-600 (USB PIC Programmer)
  • MikroBasic Pro for PIC
Primeramente necesitamos generar un archivo .hex usando el código que le queremos programar a  nuestro pic. 
Para esto vamos a utilizar el MikroBasic:


1. Creamos un nuevo proyecto




2. Le cambiamos el nombre al proyecto
3. Identificamos el tipo de pic que vamos a programar. En este caso el que utilizamos fue el P16F628A.

Podemos seleccionar archivos para el proyecto pero no es necesario.
Incluimos todas las librerías.

Después en el panel principal introducimos el código de nuestro programa.
Donde dice program debemos escribir el nombre del proyecto.

Ejemplo: program pic (A nuestro proyecto lo llamamos pic)


Tenemos que editar el proyecto para ponerle algunas especificaciones y que pueda funcionar en nuestro proyecto.

Ahora tenemos que cambiarle éstas opciones:


Tenemos que deshabilitar el masterclear y cambiar el oscilador

Ahora vamos a generar el .hex presionando el botón de build (El que está señalado con la flecha morada)


Si todo salió bien deberíamos ver que abajo diga: Finished successfully.

Ahora ya tenemos el .hex y vamos a programarlo en el pic.

Primero tenemos que cerrar este programa y abrir el Steren PIC 600.

Ahora insertamos el pic en el programador y lo conectamos a la computadora con el cable usb.

El pic tiene que ir acomodado de la siguiente manera:


Cuando abramos el programa nos va a aparecer una pantalla como ésta

Tenemos que detectar el pic presionando el botón que dice "Identify PIC in programmer"


Después seleccionamos el archivo HEX que vamos a utilizar. Ahi tenemos que buscar el que se generó con el programa anterior.



Tenemos que asegurarnos que el PIC no tenga nada programado, si no es un pic nuevo, es recomendable presionar "Erase PIC".

Tenemos que asegurarnos que la información seleccionada en éstos campos sea la adecuada al tipo de pic que utilizamos:


Ahora vamos a cambiarle un poco a la configuración del PIC. Tenemos que irnos a la pestaña PIC Configuration, cambiarle el oscilador y deshabilitarle el Master Clear


Ya que tenemos todo esto listo podemos darle click donde dice write HEX-FILE into PIC


Ahora nuestro PIC ya está programado. Antes de retirarlo tenemos que presionar remove CP para poder quitarlo. Una vez que hayamos hecho esto ya podemos quitar el PIC y ponerlo en la base de nuestro sistema.


Ahora tenemos que probar si funciona...

Proyecto Carmen

Código
program monohola

symbol sensor = PortA.1
' Declarations section
dim i,r as longint
dim mov as short
dim mov_uno, mov_dos, mov_tres as BYTE

sub procedure mov1
const uno as byte[68]=
($00,$00,$10,$08,$EF,$FE,$EF,$08,$10,$00,
$00,$00,$00,$00,$00,$FF,$08,$08,$08,$FF,
$00,$00,$00,$5F,$00,$00,$00,$FD,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00)

for i= 0 to 68
         for mov_uno = 0 to 3 '//determina el ancho de la letra
               portb = uno [i]
               delay_us (75)
               portb = 0
               delay_us (30)
       next mov_uno
    next i

end sub

sub procedure mov2
const dos as byte[68]=
($00,$00,$04,$08,$EF,$FE,$EF,$08,$04,$00,
$00,$00,$00,$00,$00,$FF,$08,$08,$08,$FF,
$00,$00,$00,$5F,$00,$00,$00,$FD,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00)

for i= 0 to 68
         for mov_dos = 0 to 3 '//determina el ancho de la letra
               portb = dos [i]
               delay_us (75)
               portb = 0
               delay_us (30)
         next mov_dos
    next i
end sub

sub procedure mov3
const tres as byte[68]=
($00,$00,$08,$08,$EF,$FE,$EF,$08,$08,$00,
$00,$00,$00,$00,$00,$FF,$08,$08,$08,$FF,
$00,$00,$00,$5F,$00,$00,$00,$FD,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00)

for i= 0 to 68
         for mov_tres = 0 to 3 '//determina el ancho de la letra
               portb = tres [i]
               delay_us (75)
               portb = 0
               delay_us (30)
         next mov_tres
    next i
end sub

main:
'   Main program
portB=0
cmcon=7

trisb = 000000
trisa = 000010

mov = 0

sinc:
     if sensor = 1 then '//los leds prenden hasta que reciban señal IR
             goto sinc
     end if

while true

mov1
mov2
mov3

wend

goto main
end.


Video letrero de Carmen

video

Programa Gaby

program pic
symbol sensor = PortA.1

dim i as longint
dim letra, num as byte

sub procedure num_diez
const diez as byte[10] =($00,$00,$42,$FE,$02,$00,$FE,$82,$FE,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = diez [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_nueve
const nueve as byte[10] =($00,$00,$F2,$92,$92,$FE,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = nueve [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_ocho
const ocho as byte[10] =($00,$00,$FE,$92,$92,$FE,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = ocho [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_siete
const siete as byte[10] =($00,$00,$80,$90,$90,$FE,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = siete [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_seis
const seis as byte[10] =($00,$00,$FE,$92,$92,$9E,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = seis [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_cinco
const cinco as byte[10] =($00,$00,$F2,$92,$92,$9E,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = cinco [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_cuatro
const cuatro as byte[10] =($00,$00,$F0,$90,$90,$FE,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = cuatro [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_tres
const tres as byte[10] =($00,$00,$82,$92,$92,$FE,$00,$00,$00,$00)
    for i = 0 to 10
         for letra = 0 to 2
               portb = tres [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_dos
const dos as byte[10] =($00,$00,$9E,$92,$92,$F2,$00,$00,$00,$00)
    for i = 0 to 9
         for letra = 0 to 2
               portb = dos [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

sub procedure num_uno
const uno as byte[10] =($00,$00,$22,$42,$FE,$02,$02,$00,$00,$00)
    for i = 0 to 9
         for letra = 0 to 2
               portb = uno [i]
               delay_us (75)
               portb = 0
               delay_us (30)
        next letra
    next i
end sub

main:

portB=0
cmcon=7
' //inicialización del PIC
trisb = 000000
trisa = 000010

num = 0

sinc:
if sensor = 1 then
   goto sinc
   end if
   
while true

num_diez
num_nueve
num_ocho
num_siete
num_seis
num_cinco
num_cuatro
num_tres
num_dos
num_uno

wend

goto main

end.

Video letrero de Gaby

video



Agradecimientos

Alejandro Avendaño
Victor Alex Briones
Osvaldo Hinojosa
Roberto Martinez