Vous êtes sur la page 1sur 59

Potenciometro digital mediante 2

pulsadores y display de 7 segmentos


Este equipo esta basado en el microcontrolador pic 16f628, el cual actua a modo de
interruptor, de modo que combinando la conexion de 5 resistencias podemos crear
una escala de 10 valores.
Este circuito lo utilice en un equipo de electromedicina a modo de potenciometro
de volumen. Por falta de tiempo no he llegado a comprobar el ancho de banda de
frecuencia y de tension de la seal que podemos tener en la entrada, asi que si
alguno que monte este circuito lo realiza, le agradeceria que compartiera sus
esperiencias. email
Este microcontrolador pic de 18 pines solo me permite utilizar un digito, pero
perfectamente se puede adaptar el circuito y el programa a un microcontrolador
de mas pines, y de ese modo poner 2 displays y aumentar el numero de escalones.
Podeis ver el funcionamiento del circuito en este video, en donde se atenua una
seal senoidal de 1Khz y 1V.
Para que el microcontrolador actue a modo de interruptor no puede suministrar
tension por sus pines, asi que los pines que tengan que actuar a modo de
interruptor cerrado los tengo que configurar como SALIDAS en estado de "0" y el
resto los tengo que configurar como entradas, ya que asi quedan en modo de alta
impedancia.
En las siguientes imagenes se compara el microcontrolador como si se tratase de un
microinterruptor, indicando la tension que obtenemos en la salida cuando el la
entrada disponemos de una tension continua de 10V.

La seal de entrada tiene que estar comprendida entre -0,6v y 5,6v, ya que el circuito de
proteccion que incorpora el microcontrolador en cada una de sus pines recortara dicha seal,
distorsionandola.
Cuanto la tension de entrada supere los 5,6v entrara en conduccion D1, y en el caso que la
tension desciende de -0,6v sera D2 el que actue.

Podeis descargar el archivo generado por Proteus y el codigo Hex para su montaje o
simulacion

Tambien se puede utizar este circuito acoplandolo al TDA1524 o al LM1036 para


regular el volumen de una seal estereo, ya que estos integrados consiguen variar el
nivel de sonido dependiendo de la tension que exista en uno de sus pines. Para ello tan
solo tendremos que conectar la resistencia de entrada a Vdd, y la tension obtenida
acoplarla a alguno de estos integrados.

Circuitos bsicos de Entrada y Salida - FORO TODOPIC


LINKS: [Foro TodoPIC] [Hilo Circuitos E/S - Esquemas listos para usar original] [PDF]

CIRCUITOS DE E/S
APORTADOS POR
LOS USUARIOS DEL
FORO

TODOPIC

INTRODUCCIN:
Este documento se basa en un hilo del foro TodoPIC,
en el que se propuso armar una especie de biblioteca
virtual de circuitos que generalmente usamos para
resolver los problemas de entrada-salida de nuestros
proyectos.
Recomendamos SIEMPRE visitar el hilo original
dentro del foro, ya que esta siendo
permanentemente actualizado, cosa que no sucede
con este resumen, que tiene su razn de ser como
base para generar el documento PDF.
Se ha consignado en cada caso el autor del circuito,
usando como identificacin su nombre dentro del
foro.

INDICE:
> 001 - Activar un Rele (Aitopes)
> 002 - Manejo de lmparas y motores a 220v (Xocas06)
> 003 - RS-232 en 8 pines con DS275 (Xocas06)
> 004 - Adaptacin de sensor LM35 a PIC 16F877 (flacoclau)
> 005 - Adaptador de niveles de voltaje, 5-25 v a Vcc. ( RedPIC)
> 006 - RS-232 sin integrados, solo con componentes discretos
(Aitopes)
> 007 - RS-232 con MAX232(Aitopes)
> 008 - RELE desde el PIC, con luz piloto (Aitopes)
> 009 - LED, enciende con "0" o con "1" (Aitopes)
> 010 - Una Fuente de alimentacin de 5V sencilla (RedPIC)
> 011 - Optoacoplador para aislar una Entrada o una Salida
(RedPIC)
> 012 - LEDS en serie - Multiplexados para display(Aitopes)
> 013 - Salida con Optoacoplador y rele (MarioGuillote)
> 014 - CD4511(Aitopes)
> 015 - ON-OFF con el popular 555 (MarioGuillote)
> 016 - Protector de Alimentacin (MarioGuillote)
> 017 - Driver para Motores CC (MarioGuillote)
> 018 - Beep .... Beep .... Beep ! (MarioGuillote)
> 019 - Registro de desplazamiento para manejar 4x7segmentos
(+ 2 puntos)(Aitopes)
> 020 - Adaptador de niveles 5V/3.3V bidireccional (Manofwar)
> 021 - Mini-Amplificador de Audio con LM386 (MarioGuillote)
> 022 - Interfaz para medir temperatura con una termocupla y
un PIC (Charly29)
> 023 - Interfaz de celda de carga para usar con PIC (Charly29)
> 024 - Circuito para obtener la seal de un led que posee el
nodo a positivo (Charly29)
> 025 - Circuito para comandar display de 7 segmentos
(Charly29)
> 026 - Usar LM35 en todo el rango de temperatura con fuente
simple (Charly29)
> 027 - Inversor con 555 (Arlequin)

> 001 - Activar un Rele:


AUTOR: Aitopes
Circuito bsico que generalmente utilizo para activar un rele desde un pin del PIC.
Algunas aclaraciones: el diodo protege al transistor de la corriente devuelta por la
bobina del rele. El transistor puede ser reemplazado sin demasiados problemas por
algn TUN.

> 002 - Manejo de lmparas y motores a 220v:


AUTOR: Xocas06
El circuito es de lo mas genrico. La seal del pic llega, a travs de una resistencia
limitadora, al fototriac moc3041 que dispone de un alto nivel de aislamiento y un
detector de paso por cero en su interior. La resistencia R2 limita la corriente que
pasa por el fototriac para evitar que se dae y puede estar en el orden de los 360 a
470 ohm. Todas las resistencias usadas son de 1/2w exceptuando r1 que es de
1/4w. La eleccin del triac ira en funcin de nuestras necesidades. En este caso se
eligi un bta08600 (8A/600v) porque su parte metlica esta aislada (en muchos
casos esta parte metlica esta conectada a uno de los nodos, con el consiguiente
peligro de descarga) porque soporta sin necesidad de radiador hasta 500w y porque
esta indicado especialmente para cargas altamente inductivas segn su hoja de
datos. aunque podra ser perfectamente un bt136,137 etc. Se recomiendo la
lectura de la hoja de datos tanto del triac como del moc3041 antes de proceder. La
resistencia R4 y el condensador C1 no sern necesarias si la carga es resistiva
(lmparas).

Se deben de tomar las precauciones que se corresponden con el manejo de


una tensin de 220v

> 003 - RS-232 en 8 pines con DS275


AUTOR: Xocas06
Cuando pensamos en comunicar nuestro PIC va RS-232 a todos nos viene a la
cabeza el famoso max232 de Maxim. Es un chip con 16 pines y dos canales rs-232
de los cuales en muchos casos solo utilizamos uno. Maxim dispone tambin del
ds275 que puede servirnos en bastantes casos a nuestros propsitos, si nos
conformamos con un solo canal. en tan solo 8 pines y sin necesidad de
condensadores externos. Recomiendo una lectura de su hoja de datos:
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2929 . Aqu un sencillo esquema
que creo no requiere de ningn tipo de explicacin.

> 004 - Adaptacin de sensor LM35 a PIC 16F877


AUTOR: flacoclau
Aqu les comparto como adapt un LM35 a un 16f877, me funciona de maravilla,
est configurado para un fondo de escala de 102,3C
En la pata 5 (RA3) tenemos la Vref+ con un diodo de referencia de 2,5V que sera
el fondo de escala, o sea el valor 1023 en el conversor A/D, por lo tanto seran
2,5V/1023=2,44mV por cada paso del conversor, esto se obtiene calibrando el
preset de 1K (Yo uso un trimpot multivuelta) y midiendo con el tester en la pata 2
del lm35 para que en el display se lea lo mismo. Si el lm35 entrega 1mV por cada
dcima de grado (salvando la exactitud del bicho) tendra que amplificar la tensin
2,44 veces aproximadamente.

> 005 - Adaptador de niveles de voltaje, 5-25 v a Vcc.


AUTOR: RedPIC
Aqu tenis un muy simple adaptador de niveles de tensin. Cualquier cosa entre 5
y 25 voltios que pongis en la entrada tendris Vcc en la salida:

> 006 - RS-232 sin integrados, solo con componentes discretos:


AUTOR: Aitopes
Este es el esquema para utilizar conexiones RS-232 sin necesidad del MAX232 o
similares. A veces, para salir de un apuro, con unos pocos componentes discretos
que seguro tenemos en un cajn podemos resolver el problema.

> 007 - RS-232 con MAX232


AUTOR: Aitopes
El mas popular de los esquemas de conversin TTL <-> RS-232 :

> 008 - RELE desde el PIC, con luz piloto


AUTOR: Aitopes
Esta es una variacin sobre el primer circuito del hilo, solo agrega un led que indica
visualmente si el rele esta o no energizado.

> 009 LED, enciende con "0" o con "1"


AUTOR: Aitopes
El led de arriba enciende cuando el pin del PIC esta en 0. En el segundo caso,
cuando el pin esta en 1.

> 010 - Una Fuente de alimentacin de 5V sencilla


AUTOR: RedPIC
Si este esquema, u otro similar, nada de lo que hagamos sirve para nada .

> 011 - Optoacoplador para aislar una Entrada o una Salida


AUTOR: RedPIC
Una forma fcil de proteger un pin del PIC

> 012 - LEDS en serie - Multiplexados para display


AUTOR: Aitopes

Bueno, el titulo de este esquema era medio complicado, pero la idea es la


siguiente: Se trata de un display de 7 segmentos gigante, donde cada segmento de
cada digito esta formado por varios leds en serie. Como son varios dgitos, los
tengo que multiplexar, y poder desde el PIC seleccionar que segmento de que digito
voy a encender.
La solucin que encontr es usar dos transistores, uno para la seleccin del digito, y
otro para el segmento. El nodo del primer LED de cada segmento de un digito
estn unidos a un transistor (el de arriba), de forma de poder seleccionarlo
independientemente de los otros, y los ctodos del ultimo led de cada segmento
(por ejemplo el del medio de cada digito) unido a otro transistor que se encarga de
seleccionar el segmento adecuado. Es un lo la explicacin, pero el esquema se
entiende mejor.
Puse el mismo esquema 4 veces, para cubrir los 4 posibles estados, donde se ve
que el segmento enciende solo cuando el digito se selecciona con un"0" y el
segmento con un "1". Por supuesto, se supone que dos pines del PIC controlan los
voltajes que ingresan por las resistencias de 1K.
La resistencia limitadora se puede calcular haciendo R = (V - NLeds x VLed) / ILed.
Tener en cuenta la cada de tensin en el transistor. V debe ser por supuesto mayor
a NLeds x VLed. El transistor de arriba debe ser elegido para que soporte la
corriente que circulara por todos los LEDS implicados. Un BC327 puede ser mejor
que el sugerido.

> 013 - Salida con Optoacoplador y rele


AUTOR: MarioGuillote
No hay mucho que decir sobre el.

> 014 - CD4511


AUTOR: Aitopes
Este integrado nos permite controlar un display de 7 segmentos mediante cuatro
pines del PIC. No es muy complicado multiplexarlo para usar mas de un digito con
solo un integrado (y un pin adicional por digito, para el multiplexado).

> 015 - ON-OFF con el popular 555


AUTOR: MarioGuillote

Este circuito es muy til para el encendido/apagado de nuestros proyectos.


Segn cmo se conecte C1, arranca el circuito, si se conecta a GND arranca con un
cero a la salida, por el contrario, si se conecta a VCC el circuito arrancar con un
uno a la salida. Pulsamos una vez el botn, ON ... pulsamos otra vez, OFF. Sencillo
y til.
Esa salida la podemos conectar a cualquiera de los circuitos propuestos para rels u
optotriacs y con eso activar cargas importantes. Una funcin ON-OFF que nos
puede ahorrar lneas de programa y terminales del PIC.

> 016 - Protector de Alimentacin


AUTOR: MarioGuillote
Muchos de los que nos dedicamos a esto de la Electrnica, hacemos nuestros
ensayos de los proyectos con fuentes variables, generalmente entre 2 o 3 Volts y
unos 18 Volts, construidas con un transformador de algunos amperes, unos diodos
que andaban por ah, un electroltico sper-gigante que no se usaba en
absolutamente nada y nos vino brbaro para nuestra fuente. El LM317, el/los
2N3055 o TIP35 , un par de capacitores ms, (los ms puristas, el 723) y listo!
Nuestra fuente de laboratorio!
Y lgicamente como todo proceso de existencia, alguna vez trabajando con un
circuito de 5 Volts ....... PIFFFF ! , los transistores se ponen en corto por algn error
de manipulacin nuestro y adis circuito.
Aqu les propongo un circuito que encontr hace muchos aos y es tan sencillo
como eficiente.
El fusible de entrada se va a colocar de acuerdo al consumo del circuito a alimentar,
como se calculan siempre los fusibles, tema ya tratado en el foro. El zener debe ser
de 1V ms que el circuito a alimentar y de potencia 1W. El tiristor puede ser

cualquiera, con un TIC226 anda perfecto, pero tambin depende de la aplicacin a


usar.
El funcionamiento habla por s solo, viendo el esquema:
1) Ante una inversin de polaridad se ceba el triac, funde el fusible y circuito
salvado.
2) Ante una suba de tensin de alimentacin, por el zener circula una corriente
inversa que ceba el triac y funde el fusible.
3) No provoca cada de tensin en el circuito que se intercale.
Sencillo, barato, muy eficaz y lo mejor de todo ..... Es a prueba de genios como
nosotros. Espero sea til.

> 017 - Driver para Motores CC


AUTOR: MarioGuillote
En este ltimo tiempo he estado usando unos motores CC de casi 1 Amper (para
que tengan una idea, un poco ms grandes que los usados en los reproductores de
cassete) y utilic este esquema que lo operaba desde un 16F84A. Los motores
deslizaban unas puertas pequeas de vidrio y la posicin de la mismas se
detectaban con switch's en las correderas usadas. Pocos componentes, til y fcil
de construir. Este tipo de circuito se usa en algunos equipos de audio para la
bandeja de 3 CD (Open/Close).

> 018 - Beep .... Beep .... Beep !


AUTOR: MarioGuillote
El tpico pi-pi-pi-pi ..... ("nerviosador") de activacin de algn sistema de alerta. R1
y C1 determinan la frecuencia de activacin de los beep, mientras que R2 y C2
determinan el tono del mismo. Para BUZ1 he usado con estridente xito los
piezoelctricos (campanillas) de los telfonos de mesa. Cualquier tweeter barato es
til para esta aplicacin.
Menos lneas de cdigo nunca vienen mal.

> 019 - Registro de desplazamiento para manejar 4x7segmentos (+ 2


puntos)
AUTOR: Aitopes
El presente esquema esta pensado para controlar 4 displays LED de 7 seg.
mediante unas pocas lneas de control desde el PIC: Clock, Data, Reset y una para
el apagado del display (puede ser til para evitar parpadeos durante el refresco).
Hay que tener en cuenta que las entradas de datos del 74LS164 estn NEGADAS,
por lo que se debe escribir un "0" para que la salida correspondiente este activa.
Tener en cuenta el estado del RESET.
El primer bit que se ingresa va siendo "empujado" hacia el "fondo" por los dems,
por lo que si metemos 32 bits, el primero en entrar seria el que queda en la ultima
posicin del registro. Si seguimos enviando mas bits, se empiezan a "perder" por el
"fondo". Se pueden conectar mas en cascada.

> 020 - Adaptador de niveles 5V/3.3V bidireccional


AUTOR: Manofwar

> 021 - Mini-Amplificador de Audio con LM386


AUTOR: MarioGuillote
Alimentando el circuito, como muestra la figura, con tensiones entre 5 y 12 Volts,
obtendremos sobre un pequeo parlante una potencia de audio de entre 300 y 800
mW. Ms que suficientes para algn speech para los sonidos "DING DONG !" de
los indicadores de turnos en los cajeros del banco, o para cualquier aplicacin que
requiera un poquito de sonido.

> 022 - Interfaz para medir temperatura con una termocupla y un PIC
AUTOR: Charly29
Hola a todos, aqu les dejo un circuito que permite por medio de una termocupla
medir temperaturas de ms de 1000C, el mismo posee compensacin de la unin
fra para conservar la linealidad, el esquema es el siguiente:

Como se puede apreciar, a la entrada de la termocupla se la filtra fuertemente para


evitar cualquier tipo de interferencias.
Las 2 bobinas que estn sobre la misma se construyen sobre un nico ncleo
toroidal de ferrita con un dimetro de entre 10 y 15 mm, en el mismo y con doble
alambre de 0.2mm de cobre esmaltado (de los usado para bobinar transformadores
y motores elctricos) se realizan entre 30 y 40 vueltas, al ser el alambre doble una
ves realizadas las 30 vueltas ya se tendr construidas ambas bobinas. Entonces las
2 puntas pertenecientes al principio del bobinado se sueldan del lado de la
termocupla, y las 2 pertenecientes al final se sueldan del lado del circuito.
Luego del filtrado la seal es amplificada por un OA tipo OP07 que es de bajo offset
y alta ganancia, para luego atacar la entrada del conversor A/D del PIC.
El LM35 (sensor de temperatura) debe ser instalado lo ms prximo posible de la
unin donde los hilos de la termocupla se conectan a la PCB, para unir la
termocupla a la PCB es conveniente usar un conector ya que la misma ser muy
difcil de soldarla directamente, por lo tanto el sensor de temperatura debe estar lo
ms cerca posible de este conector.
La seal entregada por el LM35 es filtrada y amplificada por un OA del tipo LM358
para luego introducirla al conversor del PIC
El circuito integrado LM336-2.5 es usado como tensin de referencia de 2.5V para
los conversores, ya que si usramos de referencia la tensin de alimentacin del
propio PIC, las lecturas de temperatura podran tener grandes errores.
Por ultimo queda aclarar que la compensacin de la unin en fro se realiza
mediante software, como la termocupla a temperatura ambiente entrega a su salida

una tensin igual a 0V lo nico que hay que realizar es la suma de la temperatura
medida por la termocupla y la temperatura entregada por el sensor, de tal manera
que:
TC = Tcupla + Tsensor
Por lo tanto este circuito solo medir temperaturas iguales o mayores a la
temperatura ambiente, siendo imposible medir temperaturas inferiores a la
ambiente.
Para calibrar el circuito se debe hacer lo siguiente:
1) Retirar la termocupla y en su lugar realizar un puente con un cable lo ms corto
posible.
2) Ajustar el preset del LM358 hasta que la temperatura leda sea igual a la
ambiente.
3) Retirar el puente y conectar la termocupla (prestar atencin que posee
polaridad)
4) Usando un termmetro como referencia y ambos (termocupla y termmetro)
sumergidos en agua hirviendo ajustar el preset del OP07 hasta que el circuito
indique la misma temperatura que el termmetro.

> 023 - Interfaz de celda de carga para usar con PIC


AUTOR: Charly29
Hola a todos, como lo prometido es deuda, aqu les dejo un circuito que estoy
usando para una celda de carga y funciona lindo:

El esquema hace uso de los OA tipo OP07, los mismos pueden ser reemplazados
por los OP77 o los OP177, pero no garantizo su correcto funcionamiento si son

reemplazados por otro tipo de amplificador operacional.


La ganancia del circuito de entrada puede ser regulada entre 200 y 1000
aproximadamente, por lo tanto no impide que se usen celdas con distintos
coeficiente de salida.
Una ves puesto en funcionamiento el circuito hay que ajustar el preset del LM336Z2.5 hasta que en el emisor del transistor BC548 nos indique una tensin de 5V.
Luego sin peso sobre la celda se ajusta OFFSET hasta que el pin 7 del 12F675 se
encuentre en cero volts, para esto es muy conveniente usar un voltmetro en la
escala de 200mV o menor.
Por ultimo con un peso conocido sobre la celda debe ajustarse el preset de
GANANCIA hasta que sobre el pin 7 del PIC nos indique la tensin correcta para ese
peso. Para saber la tensin segn el peso conocido se realiza el siguiente clculo:
Vpin7 = ( peso colocado en Kg * 5 ) / carga admitida

por la celda en Kg

Es muy importante el uso de resistencias de 1% en las posiciones indicadas caso


contrario se perder exactitud en las lecturas.
Personalmente e usado dicho circuito con una celda de 50 Kg que posea un
coeficiente de 2mV por cada volt de alimentacin a la misma, y con el PIC indicado
y dicha celda e conseguido mediciones muy buenas de hasta 50 Kg con exactitudes
de 50 gr.
Cmo funciona la parte que genera la referencia con el lm336,el operacional y el
transistor?
El LM336-Z2.5 regulado adecuadamente entrega una referencia de 2.5V, que se
introduce al pin12 del OA, a la salida del mismo (pin14) tenemos un transistor
conectado como seguidor de emisor el cual oficia de driver para proporcionar una
buena corriente a la regulacin ya que por medio de esta tambin alimentamos la
celda (pueden tener resistencias de 350 ohms) y usamos esta misma tensin como
referencia para el A/D del PIC, al usar la misma tensin para la celda y la referencia
conseguimos que no haya errores en las lecturas por las pequeas derivas trmicas
de los componentes usados.
Desde el emisor del transistor y por medio de 2 resistencias de 10K se consigue un
divisor de tensin que divide a la mitad la tensin de dicho emisor y esta es la
tensin que se introduce al pin 13 del OA para que el mismo quede configurado
como buffer o seguidor de tensin, en realidad a la ves de buffer el OA acta
tambin de multiplicador con una ganancia de 2.
Con esa tensin de 5V muy estable y regulada se consigue en el pin 7 del OA una
tensin de referencia de -5V haciendo que el mismo actu como amplificador
inversor de ganancia unitaria.
Y con esas dos tensiones (5V y -5V) se atacan las resistencias en los extremos del
preset OFFSET, por lo tanto esas resistencias estn alimentadas de 5V y -5V
respectivamente, como las mismas poseen un valor de 100K y el preset 10K nos
queda que:
Ej ramal positivo:
Resistencia de 100K + preset de 5K, el preset se divide su valor a la mitad ya que
la otra mitad corresponde al ramal negativo, por lo tanto
(5V / 105K) * 5K = 0.238095V
Por lo tanto tenemos una variacin de +/- 0.24V, lo que es lo mismo un variacin
de pico a pico de 0.48V aproximadamente.
El resto del circuito esta conformado de un clsico amplificador diferencial con
ganancia unidad (al cual se le regula el offset por medio del pin 8 del TL084) con
sus respectivos amplificadores de entrada con ganancia de 200 a 1000 regulable

por medio del preset y por un sencillo seguidor de tensin o buffer que es el
encargado de otorgar la baja impedancia que necesita el convertidor A/D del PIC.
Los diodos 1N4148 conectados al pin 7 del PIC le ofrecen una proteccin por sub o
sobre tensiones a la entrada del mismo.
El condensador de 0.1uF y la resistencia de 470 ohms ofician de filtro pasa bajos,
para la seal que proviene del pin 1 del OA, la misma funcin realizan el
condensador y la resistencia conectados al pin 3 del TL084, pero al ser la frecuencia
de corte de este ultimo filtro muy baja tambin estamos conseguimos que la lectura
sea ms estable.
Los condensadores de 0.1uF y las resistencias de 1K presentes en cada entrada
hacen la funcin del filtros contra cualquier interferencia proveniente desde la celda,
otorgando junto a la bobina y el amplificador diferencial muy buena inmunidad bajo
cualquier condicin de trabajo.

> 024 - Circuito para obtener la seal de un led que posee el nodo a
positivo
AUTOR: Charly29
Este circuito que permite obtener la seal de un led. Cuando un led de un equipo
cualquiera esta conectado a positivo y esta tensin es superior a los 5Vcc de la
alimentacin del PIC podemos usar este sencillo circuito que nos entregar un alto
cada ves que el led este encendido, la seal obtenida se la puede introducir al PIC
para que este actu de la manera programada.

> 025 - Circuito para comandar display de 7 segmentos


AUTOR: Charly29
Como se puede ver en el esquema, este circuito es apto para funcionar con
cualquier tensin de alimentacin hasta un mximo de 30Vcc, la intensidad mxima
por cada segmento puede ser de asta 300mA.
Las entradas son todas activas en alto, las 3 superiores pertenecen una a cada
display y las 7 inferiores una a cada segmento, por lo tanto para hacer un refresco
adecuado de los display se debe hacer lo siguiente:
1)
2)
3)
4)
5)

Colocar las seales en los pines de control de los segmentos.


Colocar en alto la seal de control del display que corresponda.
Esperar un tiempo adecuado.
Colocar en bajo la seal de todos los display.
Volver a comenzar con el siguiente display.

> 026 - Usar LM35 en todo el rango de temperatura con fuente simple.
AUTOR: Charly29
El circuito que les propongo en esta ocasin hace uso del sensor de temperatura
LM35, el mismo puede medir temperatura desde -50C asta 150C (mirar data
sheet), pero para medir todo el rango normalmente es necesario el uso de una
fuente simtrica.
Bueno con la idea de simplificar la fuente de alimentacin cuando nuestra aplicacin
debe ser de bajo costo, con el circuito mostrado ms arriba obtenemos lo deseado.
Su implementacin es muy sencilla y para tal es necesario en uso de 2 entradas
anlogas del PIC y la entrada de tensin de referencia para el convertidor.
Las resistencia de 1K5 y 3K3 (deben ser de 1%) proveen la tensin de referencia y
con tales valores ser de aproximadamente 3.5Vcc
Los diodos 1N914 le otorgan al LM35 de una tensin de masa superior a la masa
real del circuito y esto es lo que nos permite medir temperaturas por debajo de
0C.
Por el motivo anterior y considerando que la tensin que el LM35 tomar como
masa puede variar con la temperatura es necesario conoces esa tensin para luego
con los consiguientes clculos matemticos obtener la temperatura real, para
conoces esa tensin de "masa" se usa la entrada AN1.
La seal de salida del LM35 es introducida al PIC por medio de AN0, entonces a
esta altura ya tenemos todas las seales necesarias dentro del PIC, por lo que solo

falta realizar los clculos.


Para los mismo se hace lo siguiente:
Si AN0 > AN1
(Valor de AN0) - (Valor de AN1) = (Valor Temp.)
Si AN0 < AN1
(Valor de AN1) - (Valor de AN0) = (Valor Temp.)
Una ves obtenido Valor Temp hacemos:
(Valor Temp.) * (344 / 1023) = Temp ----------> si usamos conversor de 10 bits
(Valor Temp.) * (344 / 255 ) = Temp ----------> si usamos conversor de 8 bits
donde:
344 = tensin de referencia * 100
Entonces ya tenemos la temperatura real, solo faltara saber si es por sobre o
debajo de cero grado, para lo cual analizamos nuevamente cual de los 2 valores de
entrada era el mayor:
Si AN0 > AN1 la temperatura es por sobre cero grado centgrado o sea +XXC
Si AN0 < AN1 la temperatura es por debajo de cero grados centgrados o sea -XXC
Este circuito que obtener la seal de un led. Cuando un led de un equipo cualquiera
esta conectado a positivo y esta tensin es superior a los 5Vcc de la alimentacin
del PIC podemos usar este sencillo circuito que nos entregar un alto cada ves que
el led este encendido, la seal obtenida se la puede introducir al PIC para que este
acte de la manera programada.

> 027 - Inversor con 555


AUTOR: Arlequin
El circuito que se muestra a continuacin, nos da la posibilidad de obtener una
inversin de tensin. El mismo puede ser utilizado con amplificadores operacionales
o en cualquier circuito donde se necesite de una tensin negativa, con un bajo
consumo de corriente.

El corazn del circuito es el famoso 555, donde por medio del mismo y en
conjuncin con elementos comunes se obtiene una configuracin sencilla y
funcional. La tensin +VCC debe estar comprendida entre +5V y +15V.

> 028 - Circuito de Entrada


AUTOR: Fer_TACA

Comunicacin inalmbrica entre PICs a 434MHz.

[editar]

Introduccin

Mdulo LAIPAC TLP434A

Para algunos de los proyectos de control se hace necesaria la comunicacin entre microcontroladores de forma inalmbrica. Esta es
una tarea relativamente sencilla si se hace con las herramientas adecuadas, tales como un buen par de radios, un buen compilador de
micros, y un mejor algoritmo para el trfico de la informacin.

En este proyecto se puede aprender de forma sencilla como establecer una comunicacin inalmbrica entre dos
microcontroladores, enviando un cuarteto de bits, que posteriormente se puede ver en el micro receptor. La implementacin del
sistema esta desarrollado con un par de micros PIC16F628A, y dos mdulos de radio.
Tabla de contenidos
[esconder]

1 Introduccin
2 Mtodo
3 Implementacin
4 Circuitos
5 Software
5.1 Programa del MICRO TX
5.2 Programa del MICRO RX
6 Revista uControl

[editar]

7 Autor

Mtodo

La clave fundamental de este proyecto esta en el medio de transmisin que se utilice. En el comercio se pueden conseguir una gran
gama de radios de trasmisin y recepcin, con diferentes caractersticas como: costo, alcance, formas de modulacin, y complejidad
en el manejo entre otras.

Para este proyecto trabajaremos con un par de radios muy sencillos de la compaa canadiense LAIPAC que produce diferentes
soluciones en el campo de comunicaciones inalmbricas. Se trata de un par de radios de los cuales uno es transmisor y el otro es
receptor.

Las referencias son TLP434A y RLP434A, que son el transmisor y el receptor respectivamente. Este juego de radios trabaja una seal
portadora de 434MHz y modulan en ASK, de tal manera que pueden transmitir valores lgicos 1 y 0.

La modulacin ASK es similar a la modulacin AM de la radio comercial de la banda de AM. En la modulacin ASK un 0 lgico se
representa con la ausencia de la seal portadora y un 1 lgico con la presencia de esta.

Los mdulos de radio que se utilizan en este proyecto tienen un alcance de 100 metros si tienen una adecuada instalacin de las
antenas. La modulacin ASK al igual que la modulacin AM es supremamente propensa a las interferencias y al ruido. Por esta razn
es importante implementar dentro de la programacin del PIC una rutina que permita detectar cuando un dato ha llegado con errores
para que sea descartado, ya que los mdulos de radio no incluyen ningn mtodo de software ni hardware para la deteccin de estos
errores.

Los mdulos de radio tienen la capacidad de transmitir a una velocidad de 9600 bits por segundo y de recibir a una velocidad de
4800 bits por segundo pero estos son los casos extremos de los mdulos. Para establecer una comunicacin ms confiable,
trabajaremos a una velocidad de 2400 bits por segundo.

La instalacin de estos mdulos de radio es muy simple, se utiliza dos pines para alimentar el modulo, uno con Vcc y otro con GND,
un pin para la antena y otro para la entrada o salida de datos de forma serial.

El modulo transmisor se puede alimentar con una tensin de entre 3V y 12V. La potencia de transmisin ser mayor a mayor voltaje.
El modulo receptor solo se puede alimentar con 5V.

[editar]

Implementacin

Para establecer la comunicacin entre los dos PIC trabajamos con el modulo USART de cada uno de los micros. Esto implica que uno
de ellos ser el transmisor y el otro el receptor.Estos micros los llamaremos, de aqui en adelante, TX y RX. En el micro TX se
evalan constantemente cuatro pines, en los cuales estn instalados sendos pulsadores que son los cuatro bits de informacin que
deseamos transmitir. Esta informacin es empaquetada y transmitida serialmente por la USART.

Aspecto del mdulo RLP434A.

Para evitar los errores en los datos de llegada, es necesario implementar algn mtodo que garantice la veracidad de la informacin.
Para esto existen formas complejas de control de errores pero para este proyecto implementaremos un mtodo muy sencillo conocido
como redundancia, el cual consiste en transmitir repetidamente el mismo dato y verificar si el dato que llega en el micro RX es igual,
para determinar que el dato no tiene errores.

En el micro RX estn instalados cuatro LEDs que permiten ver el dato que llega de manera inalmbrica.

[editar]

Circuitos

A continuacin estn los esquemtico del proyecto:

Circuito del emisor (TX).

[editar]

Circuito del receptor (RX).

Software

Este es el cdigo fuente en C de los micros TX y RX. El compilador utilizado es el CCS PICC de Hi-Tech, pero puede ser emigrado a
cualquier otro compilador que trabaje en C:

[editar]

Programa del MICRO TX

#include <pic.h>

void TxSerial( char d_ ) // Funcin para transmitir un dato de forma serial


{
TXREG = d_;
while( !TRMT );
}

void InicioSerial( void ) // Funcin d inicio de la USART


{

TRISB1 = 1;
TRISB2 = 0;
TXSTA = 0x24;
RCSTA = 0x90;
BRGH = 1;
SPBRG = 103;

// Configuracin de la USART a 2400 bits por segundo

void main( void ) // Funcion principal


{
char DATO;
INTCON = 0;
// Configuracin de las interrupciones
TRISB = 0xFF; // Se configuran los pines de los leds como salidas
RBPU = 0; // Se activan las resistencias PULL-UP
InicioSerial(); // Funcin d inicio de la USART
while(1)
{
DATO = (~PORTB>>4)&15; // Se guarda en la variable DATO el valor de los 4 pulsadores
TxSerial( 170 ); // Se transmite una bandera de inicio con la secuencia de bits: 10101010
TxSerial( DATO ); // Se transmite el dato de manera redundante. 8 veces
TxSerial( DATO );
TxSerial( DATO );
TxSerial( DATO );
TxSerial( DATO );
TxSerial( DATO );
TxSerial( DATO );
TxSerial( DATO );
}
}
__CONFIG( 0x3F09 );

[editar]

Programa del MICRO RX

#include <pic.h>

// Declaracin de variables de trabajo


char n=0;
char Trama[4]={1,2,3,4};
char DATO;

void InicioSerial( void )// Funcin para la configuracin de la USART.


{
TRISB1 = 1;

TRISB2 = 0;
TXSTA = 0x24;
RCSTA = 0x90;
BRGH = 1;
SPBRG = 103;

void interrupt VET( void ) // Vector de interrupciones.


{
if( RCIF ) //Interrupcin serial
{
DATO = RCREG; //Lectura del buffer de entrada serial
switch( DATO ) // Se evala el dato que llega
{
case 170: for( n=0; n<4; n++ )Trama[n]=n; n=0; break; // bandera de entrada.
// Se guardan los datos de entrada en el bfer de la trama.
default : Trama[n++]=DATO;
// Se evalua cuanda a llega el cuarto byte de la trama.
if( n==4 )
{
// Se comparan los datos 1,2,3 del bufer de la trama
if( Trama[1]==Trama[2] )
if( Trama[2]==Trama[3] )//y verifica que sean iguales.
{
// cuando el dato es correcto se muestra por
// el puerto b en los LEDs
PORTB = Trama[1]*16;
for( n=0; n<8; n++ )Trama[n]=n;
}
n=4;
}
}
RCIF=0;
}

void main( void ) // Funcion principal.


{
INTCON = 0; // Se apagan todas las interrupciones.
PEIE=1; // Se activan las interrupciones perifricas.
RCIE=1; RCIF=0; // Se activan las interrupciones por recepcin serial.
GIE = 1; // Se activan las interrupciones de forma general.
TRISB = 0x0F; // Se configuran los pines b como entrada y salida.
PORTB = 0; // Se apagan los pines del puerto b
InicioSerial(); // Se inicializa la USART.
while(1); // bucle infinito para la espera de interrupciones.
}

__CONFIG( 0x3F09 );

Ampliacin de 128 Entradas/Salidas para PIC (u ordenador)

[editar]

Introduccin

64 entradas y 64 salidas para PIC

Hay muchas tcnicas para ampliar el nmero de entradas y salidas de un microcontrolador: circuitos dedicados como el i8255,
registros paralelo como el SN74LS273 y de colector abierto como el SN74LS244, multiplexado de entradas etc.

Unos sistemas necesitan demasiadas patas y cableado, el multiplexado no permite activar muchas entradas simultneamente, cada
uno tiene sus ventajas e inconvenientes.
Tabla de contenidos
[esconder]

1 Introduccin
2 El circuito
3 Principio de funcionamiento: Entradas
3.1 El software
4 Principio de funcionamiento: Salidas
4.1 El software
5 Ampliaciones
6 Descargas

[editar]

7 Notas finales
8 Autor

El circuito

Este circuito ya lo he utilizado antes con otros micros, su fiabilidad est fuera de toda duda. Se trata de un conjunto de registros
paralelo/serie para leer datos y otro de serie/paralelo para escribir datos.

Estos registros de desplazamiento son CMOS serie B convencionales, muy baratos. Para conectarlo al PIC bastan 5 pines libres,
aunque hay otras configuraciones que usan ms. En este ejemplo he usado 4 circuitos integrados CD4014 para las entradas y 4
circuitos integrados CD4094 para las salidas, que proporcionan un total de 64 bits de entrada y otros 64 de salida. Sera como tener
un PIC de ms de 128 patas..

[editar]

Este es el esquema del circuito. (hacer click sobre l para ampliarlo).

Principio de funcionamiento: Entradas

El funcionamiento es el siguiente: para leer los datos primero se pone a nivel alto la seal LOAD_CD4014 y a continuacin se aplica
un pulso alto a CLK_CD4014, despues se pone a nivel bajo LOAD_CD4014. Con esta operacin hemos hecho que los registros

CD4014 memoricen en sus latch internos los datos que haba presentes en sus entradas paralelas P1 a P8.

Tras este primer pulso el estado de DATO_CD4014 es el estado de P8 del primer CD4014. Ahora vamos aplicando pulsos altos a
CLK_CD4014 con LOAD_CD4014 a nivel bajo. De esta forma, a cada pulso, los CD4014 desplazan sus datos de Pn a Pn+1. Al
primer pulso sale por DATO_CD4014 el dato ledo de P7, despus P6 etc. Por la entrada SI de cada CD4014 introducimos el dato
saliente Q8 del CD4014 siguiente en la cadena. Los datos atraviesan en serie los registros que tienen a su derecha hasta llegar al
PIC, donde el programa los va agrupando de nuevo en bytes, en mi programa uso el array DatosCD4014[NumeroCD4014].

[editar]

El software

Este es un ejemplo de como implementar el software, utilizando CCS:

// Primero carga TODOS los datos en paralelo en los registros


output_high(LOAD_CD4014); // LOAD activo
output_high(CLK_CD4014); // CLK activo, carga los datos en paralelo
output_low(CLK_CD4014); // CLK inactivo
output_low(LOAD_CD4014); // LOAD inactivo

// Ahora vamos leyendo en serie en grupos de 8 bits N veces


for (bytes = 0; bytes < NumeroCD4014; bytes++)
{
data = 0;
for (bits = 0; bits < 8; bits++)
{
data <<=1;
if (input (DATA_CD4014)) data|=0x01;
output_high(CLK_CD4014); // CLK activo, desplaza
output_low(CLK_CD4014); // CLK inactivo
}
DatosCD4014[bytes] = data; // Copiamos el dato compuesto al array

[editar]

Principio de funcionamiento: Salidas

Las salidas funcionan de forma parecida: Se pone en DATO_CD4094 el dato que queremos enviar al ultimo bit de los CD4094. Se
aplica un pulso alto en CLK_CD4094 y este dato pasa al registro interno Q1, el dato que haba en Q1 a Q2 etc. El dato que haba en
QS se enva al siguiente CD4094. De esta forma tras 64 pulsos (en este caso de 4 registros) el primer dato introducido ha llegado
hasta Q8 del ltimo CD4094. Sin embargo los datos no estn presentes en las salidas, que permanecen fijas con los ltimos datos
cargados, se encuentran en unos registros internos. Al aplicar un pulso alto en LOAD_CD4094 estos datos pasan de los registros
internos a los registros de salida y aparecen, todos a la vez, en las patas Q8 a Q1 de los CD4094 para ser usados.

[editar]

El software

Esto puede hacerse as:

for (bytes = NumeroCD4094; bytes > 0; )


{
data = DatosCD4094[--bytes]; // Pre-decremento, la cuenta comienza en NumeroCD4094-1
for (bits = 0; bits < 8; bits++)
{
if (data & 0x80) output_high(DATA_CD4094);
else output_low(DATA_CD4094);
output_high(CLK_CD4094); // CLK activo, desplaza
output_low(CLK_CD4094); // CLK inactivo
data <<=1;
}
}
// Ahora transfiero los datos enviados a las salidas
output_high(LOAD_CD4094); // LOAD activo
output_low(LOAD_CD4094); // LOAD inactivo

[editar]

Ampliaciones

Otra ventaja de este sistema es que es fcilmente ampliable, basta con aadir ms registros a la cadena. Por ejemplo pueden unirse
varios como el del diseo de arriba conectando SL10 de uno con SL9 de otro, amplindolo as en grupos de 64+64 entradas/salidas.

[editar]

Descargas
Este es el esquema con Eagle 4,15 del circuito anterior, por si alguien quiere construirlo.
Este es un programa en C (compilable con CCS 3.236) para PIC16F876A que muestra como funciona el circuito del ejemplo y

contiene las funciones de lectura y escritura de los registros CD40x4 en el fichero "shift_io.c". Est bastante comentado como para
comprender su funcionamiento. Para utilizarlo en otras aplicaciones solo hay que poner en "hardware.h" y en "shift_io.h" los
valores adecuados segn nuestro hardware e incluir en el programa principal #include "shift_io.c".

[editar]

Notas finales

Como yo utilizo pulsos de clock muy cortos podran ser demasiado estrechos para algunos CMOS convencionales debido a la alta
velocidad del PIC. Dependiendo de la longitud de los cables y la capacidades parsitas podra ser interesante ampliarlos duplicando
las instrucciones de output (port).

Evidentemente aunque aqu he propuesto utilizarlo con PIC puede utilizarse con cualquier otro micro. Yo lo ha utilizado en muchos
proyectos con i8051, con unos resultados muy buenos. Ya solo queda disear la parte de potencia para las salidas CD4094 y la parte
de adaptacin de seales de entrada para CD4014, si queremos conectarlo a circuitos no CMOS.

Placa entrenadora PIC EBASIC

[editar]

Introduccin

Placa entrenadora PIC EBASIC

PIC EBASIC es una placa entrenadora de bajo coste para poder iniciarse en el mundo de los PIC, rene una serie de cualidades que
nos permitir practicar con ella a distintos niveles de dificultad, desde principiantes hasta niveles avanzados sin perder la cualidad de
ser una herramienta de bajo coste.

Esta placa y los ejemplos que acompaan en artculo fueron desarrollados por Carlos "Dogflu66", quien los fue posteando en el foro
TODOPIC. Carlos a autorizado la publicacin de su trabajo en uControl.

Tabla de contenidos
[esconder]

1 Introduccin
2 Caractersticas
3 El circuito
4 Fotografas
5 Ejercicios de programacin

[editar]

5.1 Configuracion del PSI


5.2 Escribir "A" en el LCD
5.3 Teclas y LEDs
5.4 DS1307: Un reloj en tu LCD
5.5 LCD y ADC

5.5.1 Sin usar funciones

5.5.2 Usando funciones

5.5.3 Video demostrativo


5.6 TIMER1 y las Interrupciones del PIC
6 Temas relacionados
7 Autor

Caractersticas

Se ha elegido como base de esta placa al microcontrolador PIC16F88, que mantiene una cierta compatibilidad con el pinour del
PIC16F84, pero internamente posee una cantidad y variedad de mdulos que lo hace casi nico dentro de su categora.

La placa contiene los siguientes elementos para poder interactuar con ella:
Display LCD de 16x2 caracteres con su ajuste de contraste.
Control de la retroiluminacion del LCD para hacer practicas con el modulo CCP del PIC.
Reloj calendario por I2C, con una batera no recargable de litio y LED indicador.
Dos pulsadores en placa.
Dos LED que se pueden controlar mediante el PIC.
Un resistor ajustable para poder hacer pruebas con el mdulo ADC.

[editar]

Conexin exterior para el puerto I2C y el Pin RA4 del ADC u otro uso como controlar servomotores, reles, etc.
Puerto serie para ser usado como RS-232.
Puerto ICSP que permite programar el PIC directamente en la placa.
Proteccin contra inversin de polaridad de la alimentacin y medidas bsicas contra interferencias.

El circuito

Este es el esquema electrico de la PIC EBASIC:

Circuito de la PIC EBASIC

[editar]

Fotografas

Aqui ponemos un par de fotografas de la placa terminada:

[editar]

Ejercicios de programacin

[editar]

Configuracion del PSI

Los ejemplos estan realizados con el entorno de trabajo del PIC SIMULATOR IDE,y compilados con su [BASIC (PSI)|compilador
Basic].

Deberemos instalar el PIC SIMULATOR IDE, y configurar su entorno de trabajo como sigue:
En el men Options seleccionar el PIC16F88 a utilizar mediante Select MIcrocontroller.
Elegir la frecuencia del cristal en MHz del microcontrolador, desde Options -> Change Clock Frequency.
Seleccionar el modo de trabajo del microcontrolador desde Option -> Configuration Bits.

Todo esto queda ya configurado para otras ocasiones, pero de todas formas cada vez que se entra en el PIC SIMULATOR IDE es
conveniente el comprobar que Configuration Bits no ha cambiado, ya que es sensible a algunas modificaciones.

Y ya solo resta indicar en que se va a trabajar en [BASIC (PSI)|Basic] o ASM mediante Tools -> BASIC Compiler.

Estamos listos para comenzar. Si surgen dudas sobre en el entorno de programacin, puede consultarse el artculo correspondiente
en uControl. Y para comprender el [BASIC (PSI)|Basic], puede consultarse la [BASIC (PSI)|guia] sobre este lenguaje de

programacin.

[editar]

Escribir "A" en el LCD

Este es el codigo a compilar y cargar en el microcontrolador:

'NOMBRE:16F88_PicEBasic
'MICRO: PIC16F88/8Mhz reloj interno
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'**********************************************************************
'----------Puertos del LCD--------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto A
Define LCD_RSBIT = 7 'se usara el RA7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto A
Define LCD_EBIT = 6 'se usara el RA6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no
protesta
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5 '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta
una vez en Seg.
'--------------------------------------------------------------'Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta linea
en simulacion
'---Definicion de puertos y registros---------------------------ANSEL = 0x00 'los pin I/O digitales (no analogicos)
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07 'comparador a off
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
'---------------------Inicio------------------------------------Lcdinit 'inicializa el lcd sin cursor
WaitMs 500 'pausa para estabilizar
main: 'comienza el programa principal
Lcdcmdout LcdClear 'borra el display
WaitMs 1000 'hace una pausa de 1Seg.
Lcdout "A" 'escribe el caracter "A" en el display
WaitMs 1000 'hace una pausa de 1Seg.
Goto main 'impide que termine el programa principal
End 'es conveniente ponerlo siempre segun el manual

El resultado es una letra "A" que parpadea en la primer posicin de la primer fila del display LCD. Permanece durante un segundo,
desaparece durante otro segundo, y vuelve a comenzar.

[editar]

Teclas y LEDs

Este ejemplo simplemente lee el estado de las teclas, mostrando en el display LCD el estado de las mismas, a la vez que enciende el
LED correspondiente:

'************ PIC Entrenadora BASIC (PicEBasic)******************************


'NOMBRE: 16F88_LCD_I/O
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS
'DESCRIPCION: MUESTRA EN EL DISPLAY EL ESTADO DE LA TECLA ACTIVANDO EL LED ASOCIADO
'*****************************************************************************
'-------------------tos del LCD----------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
'Define LCD_RWREG = PORTx 'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n 'se usara el Rxn como RW (no se usa)
'
Define LCD_COMMANDUS = 2000
'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una
vez en mSeg.
'
'*****************DEFINICION DE VARIABLES**************************************
'--------------------Variables Programa---------------------------------------Dim tecla_s1 As Byte 'guarda el estado de la tecla hasta terminar la maniobra
Dim tecla_s2 As Byte 'guarda el estado de la tecla hasta terminar la maniobra
'
'------------------------ASIGNACIONES-----------------------------------------tecla_s1 = 0
tecla_s2 = 0
'
'********************DEFINICION DE PUERTOS*************************************
'-----ASIGNACION DE I/O y valores de inicio de las salidas--------------------ANSEL = %00000000 'los pin I/O digitales
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
TRISA.4 = 1 'como entrada (RA4, adc)
TRISA.6 = 1 'como entrada (RA6, tecla S1)

TRISA.5 = 1 'como entrada (RA5, tecla S2)


PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off
PORTB.0 = 1 'led verde a off
'
'******************Inicio Programa*********************************************
Lcdinit 'inicializa el lcd sin cursor
WaitMs 1000 'espera 1Seg
Lcdout "16f88_LCD_I/O" 'escribe en el lcd
Lcdcmdout LcdLine2Home 'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I/O" 'escribe en el lcd
WaitMs 3000 'espera 3Seg
'------------------Main Programa----------------------------------------------main:
If RA6 = 0 Then tecla_s1 = 1 'lee el estado de la tecla S1
If RA5 = 0 Then tecla_s2 = 1 'lee el estado de la tecla S2
Gosub print_lcd 'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100
If tecla_s1 = 1 Then 'si la tecla S1 fue pulsada
Toggle RA7 'invierte el estado de RA7, led amarillo
tecla_s1 = 0 'tecla queda en reposo
Endif
If tecla_s2 = 1 Then 'si la tecla S2 fue pulsada
Toggle RB0 'Invierte el estado de RB0, led verde
tecla_s2 = 0 'tecla queda en reposo
Endif
WaitMs 100 'hace una pausa de 100mSeg
Goto main
End
'---------------------FIN DEL MAIN--------------------------------------------'
'*********************Subrrutinas**********************************************
print_lcd: '____________________muestra los datos por el display
Lcdcmdout LcdLine1Clear 'borra la primera linea y cursor al principio
Lcdout " S1 ", #tecla_s1, " -- S2 ", #tecla_s2 'imprime en el lcd
Lcdcmdout LcdLine2Clear 'borra la segunda linea y cursor al principio
Lcdout "----------------" 'muestra los datos en el lcd
REturn
End

[editar]

DS1307: Un reloj en tu LCD

El siguiente ejemplo muestra como implementar un reloj utilizando el DS1307. Recordemos que los registros de dicho circuito
integrado se leen y escriben en formato BCD.

'************ PIC Entrenadora BASIC (PicEBasic)******************************


'NOMBRE: 16F88_LCD_RTC
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS
'DESCRIPCION: MUESTRA EN EL DISPLAY LA FECHA Y LA HORA
'para transferir la hora al reloj dejar pulsada la tecla S1
'****************************************************************************
'--------------------Puertos del LCD----------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de nrol RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de nrol E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
'Define LCD_RWREG = PORTx 'el bit de nrol RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n 'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000
'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una
vez en mSeg.
'
'---------------------Puerto I2C--------------------------------------------Symbol sda = PORTB.1 'asignamos nombre al pin que hara de SDA del puerto I2C
Symbol scl = PORTB.4 'asignamos nombre al pin que hara de SCL del puerto I2C
'
'***************DEFINICION DE VARIABLES**************************************
'
'------------------Variables Programa---------------------------------------Dim aux_4h As Byte 'contendra el nibble alto del dato leido por el I2C
Dim aux_4l As Byte 'contendra el nibble bajo del dato leido por el I2C
Dim i As Byte 'variable indice
Dim reg(7) As Byte 'contendra los valores finales de fecha y hora en el sistema decimal
'
'----------------------ASIGNACIONES-----------------------------------------'******************DEFINICION DE PUERTOS*************************************
'-------------ASIGNACION DE I/O y valores de inicio de las salidas----------ANSEL = %00000000 'los pin I/O digitales
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
TRISA.4 = 1 'como entrada (RA4, adc)
TRISA.6 = 1 'como entrada (RA6, tecla S1)
TRISA.5 = 1 'como entrada (RA5, tecla S2)
PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off
PORTB.0 = 1 'led verde a off
'

'***************Inicio Programa**********************************************
Lcdinit 'inicializa el lcd sin cursor
WaitMs 1000 'espera 1Seg
Lcdout "16f88LCD_RTC/I2C" 'escribe en el lcd
Lcdcmdout LcdLine2Home 'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con I2C" 'escribe en el lcd
WaitMs 3000 'espera 3Seg
Lcdcmdout LcdClear
'--------------------inicializacion del reloj--------------------------------'
'------------Aqui escribimos los valores para cargar al RTC------------------If RA6 = 0 Then 'si la tecla S1 esta pulsada pasaremos los datos al reloj
I2CWrite sda, scl, 0xd0, 0, 0x00 'segundos, escrito en hex, porque coincide en este caso con BCD
del RTC
I2CWrite sda, scl, 0xd0, 1, 0x59 'minutos
I2CWrite sda, scl, 0xd0, 2, 0x23 'horas
I2CWrite sda, scl, 0xd0, 3, 0x01 'dia de la semana
I2CWrite sda, scl, 0xd0, 4, 0x31 'dia del mes
I2CWrite sda, scl, 0xd0, 5, 0x12 'mes
I2CWrite sda, scl, 0xd0, 6, 0x06 'ao
I2CWrite sda, scl, 0xd0, 7, 0x10 'salida a 1hz
Endif
'
'-----------------------Main Programa----------------------------------------main:
Gosub print_lcd 'actualiza la hora
WaitMs 100 'pausa de 100mSeg.
Goto main
End
'
'--------------------------FIN DEL MAIN---------------------------------------'
'**********************Subrrutinas*********************************************
'
'lee la hora del RTC, la pasa a decimal y la envia al lcd
print_lcd:
i = 0
While i <= 6 'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a
6
I2CRead sda, scl, 0xd0, i, reg(i) 'lectura de la direccion de memoria indicada del RTC,
formato BCD
aux_4l = reg(i) And %00001111 'eliminamos los bit de configuracion del RTC y dejamos solo el
nibble bajo
If i = 0 Then aux_4h = reg(i) And %01110000 'segundos, borrado de bit configuracion y almacena
nibble alto
If i = 1 Then aux_4h = reg(i) And %11110000 'minutos, almacena nibble alto
If i = 2 Then aux_4h = reg(i) And %10110000 'horas, borrado de bit configuracion y almacena
nibble alto
If i = 3 Then aux_4h = reg(i) And %11110000 'dia_semana, almacena nibble alto
If i = 4 Then aux_4h = reg(i) And %11110000 'dia_mes, almacena nibble alto

If i = 5 Then aux_4h = reg(i) And %11110000 'mes, almacena el nibble alto


If i = 6 Then aux_4h = reg(i) And %11110000 'ao, almacena el nibble alto
aux_4h = ShiftRight(aux_4h, 4) 'convierte el nibble alto en bajo
reg(i) = (aux_4h * 10) + aux_4l 'fusiona los nibbles alto y bajo en una sola variable en
formato decimal
i = i + 1 'incrementa la variable indice con cada repeticion del bucle While/Wend
Wend 'fin del bucle y salta a While
Lcdcmdout LcdLine1Home 'cursor del lcd a la izquierda en la linea 1
If reg(2) < 10 Then Lcdout "0" 'si horas es inferior a 10 escribe el cero delante
Lcdout #reg(2), ":" 'escribe la hora y el separador
If reg(1) < 10 Then Lcdout "0" 'si minutos es inferior a 10 escribe el cero delante
Lcdout #reg(1), ":" 'escribe los minutos y el separador
If reg(0) < 10 Then Lcdout "0" 'si segundos es inferior a 10 escribe el cerodelante
Lcdout #reg(0) 'escribe los segundos
Lcdcmdout LcdLine2Home 'cursor del lcd a la izquierda en la linea 2
If reg(3) = 1 Then Lcdout "Dom" 'asigna el literal al dia de la semana
If reg(3) = 2 Then Lcdout "Lun"
If reg(3) = 3 Then Lcdout "Mar"
If reg(3) = 4 Then Lcdout "Mie"
If reg(3) = 5 Then Lcdout "Jue"
If reg(3) = 6 Then Lcdout "Vie"
If reg(3) = 7 Then Lcdout "Sab"
Lcdout "/" 'escribe separador
If reg(4) < 10 Then Lcdout "0" 'si dia del mes es inferior a 10 escribe cero
Lcdout #reg(4), "/" 'escribe el dia del mes y el separador
If reg(5) < 10 Then Lcdout "0" 'si mes es inferior a 10 escribe cero
Lcdout #reg(5), "/20" 'escribe el mes, separador y los dos primeros digitos del ao de 4 digitos
If reg(6) < 10 Then Lcdout "0" 'si ao es inferior a 10 escribe primero el cero
Lcdout #reg(6) 'escribe el ao
Return
End

[editar]

LCD y ADC

[editar]

Sin usar funciones

El siguiente ejemplo muestra como utilizar el conversor Analgico/Digital del PIC16F88 y como mostrar los resultados por el display
LCD. Como siempre, el cdigo esta perfectamente documentado:

'************* PIC Entrenadora BASIC (PicEBasic)******************************


'NOMBRE: 16F88_LCD_ADC
'VERSION: 1.0
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06 - By COS
'DESCRIPCION: MUESTRA EN EL DISPLAY EL VALOR DE LA ENTRADA
'ANALOGICA CON DOS DECIMALES Y EN VOLTIOS
'*****************************************************************************
'---------------Puertos del LCD-----------------------------------------------

Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
'Define LCD_RWREG = PORTx 'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n 'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una
vez en mSeg.
'********************DEFINICION DE VARIABLES**************************************
'----------------Variables del ADC y Rutina division-----------------------------Dim num_1 As Word 'valor del adc y retorna la parte entera
Dim num_2 As Word 'factor de la escala y retorna el primer decimal
Dim num_3 As Word 'segundo decimal
Dim dvdo As Word 'dividendo operacion
Dim dvsor As Word 'divisor operacion
'------------------------Variables Programa---------------------------------------'
'----------------------------ASIGNACIONES-----------------------------------------'
'************************DEFINICION DE PUERTOS*************************************
'--------ASIGNACION DE I/O y valores de inicion de las salidas--------------------ANSEL = %00000000 'los pin I/O digitales
Define ADC_SAMPLEUS = 0 'el minimo, configuracion del ADC
Define ADC_CLOCK = 5 '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion
ADC
'
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
'ANSEL = %00010000 'los pin I/O digitales y RA4 analogico
'ADCON0 = %01100000 'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
'ADCON1 = %01000000 'voltage reference (AVdd/AVss) y seleccion de escala division clock/2
ADCON1.ADCS2=1
'
'_______________________________________________________________________________
CMCON = 0x07 'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00 'Puerto A como salidas
TRISB = 0x00 'puerto B como salidas
TRISA.4 = 1 'como entrada (RA4, adc)
TRISA.6 = 1 'como entrada (RA6, tecla S1)
TRISA.5 = 1 'como entrada (RA5, tecla S2)
PORTB.3 = 1 'luz lcd a on (RB3)
PORTA.7 = 1 'led amarillo a off
PORTB.0 = 1 'led verde a off
'
'*******************Inicio Programa*********************************************
Lcdinit 'inicializa el lcd sin cursor

WaitMs 1000 'espera 1Seg


Lcdout "16f88_LCD_ADC" 'escribe en el lcd
Lcdcmdout LcdLine2Home 'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con ADC" 'escribe en el lcd
WaitMs 3000 'espera 3Seg
'
'-------------------Main Programa----------------------------------------------main:
Gosub lee_adc 'salto con retorno, rutina de lectura de la entrada ADC
Gosub division_dos_decimales 'salto con retorno, rutina de conversion de valor adc a voltios
Gosub print_lcd 'salto con retorno, rutina que imprime los valores en el lcd
WaitMs 100 'hace una pausa de 100mSeg
Goto main
End
'----------------------FIN DEL MAIN--------------------------------------------'
'**********************Subrrutinas**********************************************
'--------------------------------------Subrrutina lectura ADC, division y LCD
lee_adc: '_______________________lee la entrada analogica
Adcin 4, num_1 'lee el valor de la entrada analogica y lo carga en num_1
num_2 = 205 'asigna factor de correccion, para 5V
Return
'
'________Rutina division con dos decimales y conversion a voltios
division_dos_decimales:
dvdo = num_1 'asigna dividendo
dvsor = num_2 'asigna divisor
If dvdo > dvsor Then 'calcula la parte entera
num_1 = dvdo / dvsor
dvdo = dvdo Mod dvsor
Else
num_1 = 0
Endif
dvdo = dvdo * 10
If dvdo > dvsor Then 'extrae el primer decimal
num_2 = dvdo / dvsor
dvdo = dvdo Mod dvsor
Else
num_2 = 0
Endif
dvdo = dvdo * 10
If dvdo > dvsor Then 'extrae el segundo decimal
num_3 = dvdo / dvsor
Else
num_3 = 0
Endif
Return
'
'____________________muestra los datos por el display
print_lcd:
Lcdcmdout LcdLine1Clear 'borra la primera linea y cursor al principio

Lcdout "ENTR. ADC ", #num_1, ".", #num_2, #num_3, "V" 'muestra los datos en el lcd
Lcdcmdout LcdLine2Clear 'borra la segunda linea y cursor al principio
Lcdout "Lectura Pin RA4" 'muestra los datos en el lcd
Return

[editar]

Usando funciones

Este es el programa modificado. Se han utilizado funciones, que estan disponibles en una de las licencias del PIC SIMULATOR IDE.

'********************************** PIC Entrenadora BASIC (PicEBasic)******************************


'NOMBRE: 16F88_LCD_ADC_Funcion_12
'VERSION: 1.2
'MICRO: PIC16f88A
'FECHA/AUTOR: 12/06, 13/07, 24/2/7 - By COS
'Version: 1.0
'DESCRIPCION: MUESTRA EN EL DISPLAY EL VALOR DE LA ENTRADA ANALOGICA CON DOS DECIMALES Y EN VOLTIOS
'Version: 1.1
'se acelera la rutina del display
'se implementa una rutina tipo funcion para la division
'version: 1.2
'simplificado de la rutina de division
'modificacion de la rutina print_lcd, para hacerla compatible con el nuevo formato salida de datos
de la division
'********************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1
'-----------------------------Puertos del LCD----------------------------------------------Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
'Define LCD_RWREG = PORTx 'el bit de control RW sera del puerto x(no se usa)
'Define LCD_RWBIT = n 'se usara el Rxn como RW (no se usa)
Define LCD_COMMANDUS = 2000
'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 1 '50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una
vez en mSeg.
'***********************************************************************************************
Define SIMULATION_WAITMS_VALUE = 1
'**********************************DEFINICION DE VARIABLES**************************************
'------------------------------Variables del ADC y Rutina division-----------------------------Dim entero As Word
'parte entera
Dim decimal As Word
'los dos decimales
Dim division As Long 'almacenara el numero con los dos decimales
Dim adc_4 As Word 'contendra el valor de la entrada del ADC
Dim factor_escala As Word 'contiene el factor de correcion para pasar el valor del ADC a voltios,
max. 5V

'--------------------------------------Variables Programa---------------------------------------'------------------------------------------ASIGNACIONES-----------------------------------------entero = 0
decimal = 0
division = 0
adc_4 = 0
factor_escala = 205 'factor de escala maximo 5V,en este caso
'**************************************DEFINICION DE PUERTOS*************************************
'----------------------ASIGNACION DE I/O y valores de inicio de las salidas--------------------ANSEL = %00000000 'los pin I/O digitales
Define ADC_SAMPLEUS = 0 'el minimo, configuracion del ADC
Define ADC_CLOCK = 5 '16Tad a 8Mhz = 2uSeg, minimo permitido por el micro 1.5uSeg, configuracion
ADC
'_______________registros afectados por Define ADC_CLOCK y ADCIN________________
AN SEL = %00010000 'los pin I/O digitales y RA4 analogico
ADCON0 = %01100000 'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.uSeg), channel RA4
ADCON1 = %01000000 'voltage reference (AVdd/AVss) y seleccion de escala division clock/2
ADCON1.ADCS2=1
'_______________________________________________________________________________
CMCON = 0x07
'comparador a off
OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00
'Puerto A como salidas
TRISB = 0x00
'puerto B como salidas
TRISA.4 = 1
'como entrada (RA4, adc)
TRISA.6 = 1
'como entrada (RA6, tecla S1)
TRISA.5 = 1
'como entrada (RA5, tecla S2)
PORTB.3 = 1
'luz lcd a on (RB3)
PORTA.7 = 1
'led amarillo a off
PORTB.0 = 1
'led verde a off
'**************************************Inicio Programa*********************************************
Lcdinit 'inicializa el lcd sin cursor
WaitMs 1000 'espera 1Seg
Lcdout "16f88_LCD_ADC" 'escribe en el lcd
Lcdcmdout LcdLine2Home 'seleciona la linea dos como proxima para escritura
Lcdout "Pruebas con ADC" 'escribe en el lcd
WaitMs 3000 'espera 3Seg
Lcdcmdout LcdClear 'borra el display, y cursor al principio de la primera linea
Lcdout "Lectura Pin RA4" 'muestra los datos en el lcd
'--------------------------------------Main Programa----------------------------------------------main:
Gosub lee_adc 'salto con retorno, rutina de lectura de la entrada ADC
division = dvsion_2dcmles(adc_4, factor_escala) 'llama a la funcion dvsion_2dcmles, que retorna
un long
Gosub print_lcd 'salto con retorno, rutina muestra los datos por el LCD
WaitMs 100 'hace una pausa de 100mSeg
Goto main
End
'--------------------------------------FIN DEL MAIN--------------------------------------------'**************************************Subrrutinas**********************************************
'--------------------------------------Subrrutina lectura ADC, division y LCD
'_______________________lee la entrada analogica

lee_adc:
Adcin 4, adc_4 'lee el valor de la entrada analogica y lo guarda en adc_4
Return
'
'____________________muestra los datos por el display
print_lcd:
entero = division.HW 'sede el word alto a entero, parte entera
decimal = division.LW 'sede el word bajo a decimal
Lcdcmdout LcdLine2Home 'selecciona la primera linea y cursor al principio
Lcdout "ENTR. ADC ", #entero, "." 'muestra los datos en el lcd
If decimal < 10 Then Lcdout "0" 'asegura que decimal siempre se escribira con dos digitos
Lcdout #decimal, "V " 'muestra los datos en el lcd
Return
'
'____Rutina funcion division con dos decimales
'____Argumentos de entrada: 2 word, dividendo y divisor, salida: variable tipo long
Function dvsion_2dcmles(dvdo As Word, dvsor As Word) As Long
Dim f_entera As Word 'variable local, contendra la parte entera
Dim f_resto As Word 'varable local, contendra el resto
Dim f_decimal As Word 'contendra la parte decimal
f_entera = dvdo / dvsor 'obtengo la division
f_resto = dvdo Mod dvsor 'obtengo el resto
f_decimal = (f_resto * 100) / dvsor 'calculo los 2 decimales, para obtener 3 decimales
multiplicar por 1000
dvsion_2dcmles.HW = f_entera 'almacena la parte entera en el word alto
dvsion_2dcmles.LW = f_decimal 'almacena la parte decimal word bajo
'Recuerda que la parte decimal tiene que ser mostrada en el display con plantilla de dos digitos
siempre
End Function

End

[editar]

Video demostrativo

El siguiente video muestra el programa anterior funcionando:

[editar]

TIMER1 y las Interrupciones del PIC

'***************** Placa Entrenadora **********************************


'NOMBRE:16F88_PicEBasic_LCD_4Bit_No_RW_Timer1
'MICRO: PIC16F88/8Mhz reloj interno
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'Activacion del Timer1 por rebose cada 1mSeg.
'implementacion de timer (bases de tiempos)por soft
'refresco del display segun la base de tiempos asignada
'cambio de estado del RA7 de forma ciclica (led intermitente)
'**********************************************************************
'-----------------Puertos del LCD--------------------------------------

Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit
Define LCD_DREG = PORTA 'el bus de datos sera el puerto A
Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB 'el bit de control RS sera del puerto B
Define LCD_RSBIT = 7 'se usara el RB7 como RS
Define LCD_EREG = PORTB 'el bit de control E sera del puerto B
Define LCD_EBIT = 6 'se usara el RB6 como E
'Define LCD_RWREG = PORTA 'el bit de control RW sera del puerto A (si se suprime el compilador no
protesta)
'Define LCD_RWBIT = 5 'se usara el RA5 como RW (si se suprime el compilador no protesta)
Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5 '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta
una vez en mSeg.
'-----------------------------------------------------------------------Define SIMULATION_WAITMS_VALUE = 1 'suprime los tiempos de espera Waitms, solo activar esta linea
en simulacion
'---------------declaracion de variables--------------------------------'******************variables de los timer********************************
Dim timer_base As Byte 'tiempo referencia para los timer por soft del programa
Dim timer_base_tiempo As Byte 'contiene el valor del tiempo del timer_base
Dim timer1_ms As Word 'base de tiempos en ms
Dim timer2_ms As Word 'base de tiempos en ms
Dim timer3_ms As Word 'base de tiempos en ms
Dim timer1_100ms As Byte 'base de tiempos msx100
Dim timer2_100ms As Byte 'base de tiempos msx100
Dim timer3_100ms As Byte 'base de tiempos msx100
Dim timer1_ms_tiempo As Word 'contiene el valor del tiempo del timer1_ms
Dim timer2_ms_tiempo As Word 'contiene el valor del tiempo del timer2_ms
Dim timer3_ms_tiempo As Word 'contiene el valor del tiempo del timer3_ms
Dim timer1_100ms_tiempo As Byte 'contiene el valor del tiempo del timer1_100ms
Dim timer2_100ms_tiempo As Byte 'contiene el valor del tiempo del timer2_100ms
Dim timer3_100ms_tiempo As Byte 'contiene el valor del tiempo del timer3_100ms
'-----------------------Variable General--------------------------------Dim flag As Byte 'se utiliza para controlar el parpadeo de "A"
'---------asignacion de valores a las variables-------------------------timer_base = 0
timer1_ms = 0
timer2_ms = 0
timer3_ms = 0
timer1_100ms = 0
timer2_100ms = 0
timer3_100ms = 0
timer_base_tiempo = 100 'cuenta 100mSeg
timer1_ms_tiempo = 5 'cuenta 5 mSeg.
timer2_ms_tiempo = 5
timer3_ms_tiempo = 5
timer1_100ms_tiempo = 1 'cuenta 0.1 Seg.
timer2_100ms_tiempo = 1
timer3_100ms_tiempo = 1
flag = 1 'flag=0 permite que se imprima "A", flag=1 permite que se borre el display

'-------------Definicion de puertos-------------------------------------ANSEL = 0x00 'los pin I/O digitales (no analogicos)


OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07 'comparador a off
TRISA = 0x00 'Puerto A como salidas
TRISA.5 = 1 'como entrda, no permite ser usada como salida digital
TRISB = 0x00 'puerto B como salidas
'
'-----------Inicializacion de Interrupciones----------------------------T1CON.TMR1CS = 0 'asigna el reloj interno al timer1, se incrementa cada ciclo de instruccion
T1CON.T1CKPS0 = 0 'factor del preescales del timer1, 0
T1CON.T1CKPS1 = 0 'factor del preescales del timer1, 0
TMR1H = 0xf8 'carga el registro del contador para que desborde cada 1mSeg, byte alto
TMR1L = 0x30 'carga el registro del contador para que desborde cada 1mSeg, byte bajo
T1CON.TMR1ON = 1 'habilitacion del TMR1, comienza a incrementarce
'PIE1.TMR1IE = 1 'activa las interrupciones del timer1
INTCON.PEIE = 1 'bit de habilitacion de interrupciones de perifericos
Enable 'INTCON.GIE habilita todas las interrupciones globales
'-----------------Inicio-----------------------------------------------Lcdinit 'inicializa el lcd sin cursor
WaitMs 500 'pausa para estabilizar
Lcdout "Listo" 'muestra en el display
WaitMs 500 'pausa de 0,5Seg
timer1_ms_tiempo = 2
timer2_ms_tiempo = 3
PIE1.TMR1IE = 1 'activa las interrupciones del timer1
'------------------------------------rutinas del Programa---------------------main: 'comienza el programa principal
If timer1_ms >= timer1_ms_tiempo Then 'refresco el display cada timer1_ms_tiempo
If flag = 1 Then Lcdcmdout LcdClear 'borra el display
If flag = 0 Then Lcdout "A" 'escribe el caracter "A" en el display
flag = flag + 1 'incrementa flag, controla el parpadeo de "A"
If flag > 1 Then flag = 0 'hace reset al flag
timer1_ms = 0 'reinicio el timer1_ms
Endif
If timer2_ms >= timer2_ms_tiempo Then 'cambio de estado el pin RA7 cada timer2_ms_tiempo
Toggle RA7
timer2_ms = 0 'reinicio el timer2_ms
Endif
Goto main 'impide que termine el programa principal
End 'es conveniente ponerlo siempre segun el manual
'-----------------------Interrupciones-----------------------------------------On Interrupt 'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System 'Guarda los valores del sistema para poder reemprender el curso normal del programa
If PIR1.TMR1IF = 1 Then 'comprueba que la interrupcion del timer1 es activa
'********************base de tiempos********************************************
timer_base = timer_base + 1
If timer1_ms < timer1_ms_tiempo Then timer1_ms = timer1_ms + 1
If timer2_ms < timer2_ms_tiempo Then timer2_ms = timer2_ms + 1
If timer3_ms < timer3_ms_tiempo Then timer3_ms = timer3_ms + 1
If timer_base >= timer_base_tiempo Then

If timer1_100ms < timer1_100ms_tiempo Then timer1_100ms = timer1_100ms + 1


If timer2_100ms < timer2_100ms_tiempo Then timer2_100ms = timer2_100ms + 1
If timer3_100ms < timer3_100ms_tiempo Then timer3_100ms = timer3_100ms + 1
timer_base = 0
Endif
'*************************fin base de tiempos**********************************
Endif
TMR1H = 0xf8 'recarga el contador del timer1 para que desborde pasado 1mSeg, byte alto
TMR1L = 0x30 'recarga el contador del timer1 para que desborde pasado 1mSeg, byte bajo
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
Resume 'activa las interrupciones y retorna al curso normal del programa antes del salto
'
End

Vous aimerez peut-être aussi