Académique Documents
Professionnel Documents
Culture Documents
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
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)
> 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:
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.
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
por la celda en Kg
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.
> 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
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.
[editar]
Introduccin
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.
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
[editar]
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]
#include <pic.h>
TRISB1 = 1;
TRISB2 = 0;
TXSTA = 0x24;
RCSTA = 0x90;
BRGH = 1;
SPBRG = 103;
[editar]
#include <pic.h>
TRISB2 = 0;
TXSTA = 0x24;
RCSTA = 0x90;
BRGH = 1;
SPBRG = 103;
__CONFIG( 0x3F09 );
[editar]
Introduccin
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]
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
[editar]
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
[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.
[editar]
Introduccin
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]
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
[editar]
Fotografas
[editar]
Ejercicios de programacin
[editar]
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]
'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:
[editar]
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.
'***************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
[editar]
LCD y ADC
[editar]
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:
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
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.
'--------------------------------------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
[editar]
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