Uso Practico del Pic12F675
<keywords content="TTL 74Ls164N, electronica, circuito, pic, NE555, PIC BASIC, PIC SIMULATOR IDE, esquema, circuito impreso, proyecto, gratis, download, programa, CMOS, pin, e/s, i/o, ucontrol, PIC, 16F628a, 16f84a" /> <center>
| Inicio | Foro | Revista uControl | Circuiteca | Microcontroladores | Electrónica Básica | Herramientas y Software | Tutoriales | Colaboradores | Enlaces |
|
¿Ya descargaste los ejemplares GRATUITOS de la Revista uControl? ¡No te los pierdas!. | |||||||||
|
wikipage=Dado electrónico con PIC
tooltip=Dado electrónico con PIC
img_src=Image:dado100.jpg
img_width=150px
img_alt=Dado electrónico con PIC
</linkedimage> |
wikipage=Como trucar un servo
tooltip=Como trucar un servo
img_src=Image:trucaservo150.jpg
img_width=150px
img_alt=Como trucar un servo
</linkedimage> |
wikipage=Comunicación inalámbrica entre PICs
tooltip=Comunicación inalámbrica entre PICs
img_src=Image:TXRX150.jpg
img_width=150px
img_alt=Comunicación inalámbrica entre PICs
</linkedimage> |
wikipage=CCS - Libreria de gráficos para GLCD K0108
tooltip=CCS - Libreria de gráficos para GLCD K0108
img_src=Image:GLCD-100.gif
img_width=150px
img_alt=CCS - Libreria de gráficos para GLCD K0108
</linkedimage> |
wikipage=Funcionamiento de una matriz de LEDs
tooltip=Funcionamiento de una matriz de LEDs
img_src=Image:GNUxx.jpg
img_width=150px
img_alt=Funcionamiento de una matriz de LEDs
</linkedimage> |
![]() |
Todos los articulos y proyectos de uControl tienen su lugar en el foro. Si tienes dudas o comentarios, busca o crea el hilo correspondiente, y tendrás una rapida respuesta.
|
![]() |
|
Uso Práctico del PIC12F675
| ||||||||||||||
IntroducciónEsta es una sección dedicada especialmente al microcontrolador de Microchip PIC12F675. El PIC12F675 es un microcontrolador, que como todos sus hermanos incorpora una serie de periféricos en su interior. Al igual que el resto de los PICs, están diseñados siguiendo la arquitectura Harvard, donde la memoria de datos está separada de la de programa. Y también son RISC (Reduced Instruction Set Computer), por lo que tienen un juego reducido de instrucciones, compuesto por solo 35 de ellas. Este valor puede variar, dependiendo de la familia a la que pertenezca un PIC en particular
El PIC12F675El 12F675 pertenece a la familia de micros "enanos" de Microchip. Tiene solo 8 pines, 1024 Word de memoria FLASH (también llamada memoria de programa), 64 Bytes de memoria RAM, 128 Bytes de memoria EEPROM y se puede conseguir en distintos encapsulados. Es económico, y aunque solo tiene 6 pines aprovechables, se le puede sacar buen partido para usarlo como descarga de procesos de un microcontrolador más grande o como “cerebro” de distintos automatismos simples. Temporizador para WCNOTA: Este proyecto forma parte de la Revista uControl Numero 1. Esta serie de articulos se inaugura con un automatismo práctico. Usaremos este componente como temporizador, a la vez que veremos cómo controlar la línea de 220AC. Módulos empleadosEn este proyecto utilizaremos los siguientes módulos internos del PIC:
Al utilizar su generador de reloj interno nos ahorramos el cristal de cuarzo y sus dos condensadores asociados. Con su módulo E/S programado especialmente podremos setear la entrada de 220AC, controlar el encendido de dos testigos indicadores (diodos LED) y además activar un rele. Los pines del modulo E/S se pueden configurar como entrada o salida digital, exceptuando el pin 4 (llamado GP3), que solo funciona como entrada. Como no lo usamos, lo conectaremos al plano de masa (GND). El resto de los pines que queden sin usar serán configurados como salidas y los dejaremos sin conexión o “al aire”. Y como seguramente habrán visto en la hoja de datos], las patitas del micro además del numero de orden del pinout también tiene nombre especifico (“GP” seguido de un numero). En este caso hay que tener especial cuidado ya que en esta familia se les da un nombre distinto al resto de familias de microcontroladores PIC. Utilizando el modulo WDT nos aseguramos que se generará un RESET interno del PIC en caso de que se produzca algún bloqueo del programa causado por efectos desconocidos (normalmente ruido eléctrico). El modulo WDT necesita contar tiempo y lo hace reservándose para él el Timer0. Cuando el Timer0 se desborda, el WDT nos genera un RESET, así que para que esto no ocurra durante el funcionamiento normal del programa tenemos que borrar el WDT. Esto a su vez reiniciará el Timer0. Ésta operación tenemos que procurar hacerla antes que termine de contar el tiempo que se le programó. Para refrescar el WDT se siguen tres sencillas reglas, y son las siguientes: 1) Se comenzará a refrescarlo en la rutina principal del programa. 2) A lo largo del programa se refrescará el menor número de veces posible. 3 Siempre se evitará refrescarlo en la rutina de interrupciones (si las hay). El Timer1 lo utilizaremos para generar unas bases de tiempos que nos servirán para controlar el parpadeo de los led, refrescar las salidas y controlar cada cuanto tiempo se ejecutan las rutinas del programa en general. ObjetivosEl propósito general de este automatismo es el de controlar un ventilador, usado como extractor para el cuarto de baño. El circuito tiene que cumplir tres requisitos básicos: 1) Cuando está en reposo, el automatismo no puede tener consumo alguno. 2) El circuito será controlado por un PIC “enano”, el PIC12F675 3) Deberá ser capaz de controlar un ventilador de 220AC o 12V/<180mA. La función que realizará el circuito se llevara a cabo de la siguiente forma: En el estado inicial, con el interruptor que controla la lámpara principal del baño en la posición de “abierto”, el rele se encuentra en estado de reposo, tal como se ve en el esquema. Al energizar la lámpara mediante el interruptor de la pared, queda también alimentado el circuito. El rele no se activa hasta pasados 30 segundos, por lo que durante ese tiempo el circuito dependerá del interruptor de encendido de la lámpara del WC. Pasados estos primeros 30 segundos queda en modo de lectura de la alimentación por la entrada GP2. Cuando el programa detecta que la alimentación cae, activa el rele aprovechando la carga de C6. De este modo todo el circuito pasa a estar alimentado directamente de la línea de 220VAC a través de los contactos del rele, comenzando un periodo de temporización de 2 minutos de duración. Cuando este tiempo a transcurrido, el PIC corta la alimentación del rele, y este pasa al estado de reposo. Si el interruptor de la pared que controla la lámpara está abierto, el circuito pierde la alimentación y todo queda sin energía. En caso de que el interruptor siga cerrado, el circuito espera 1 segundo y luego pasa de nuevo al modo de seteado de la alimentación, quedando en este estado de monitorización de la red eléctrica esperando a que esta desaparezca para comenzar una nueva temporizacion.
El funcionamiento del circuitoLos conectores CN1 y CN2 se utilizan para alimentar el circuito desde la toma de la lámpara y para alimentar la lámpara respectivamente, para no tener que hacer modificaciones en la instalación eléctrica de la casa. El conector CN3 es una toma de corriente de 220 AC directa de red.
Esquema del Temporizador para WC.
Después del puente rectificador pueden verse los condensadores C4 y C1, que son el filtro de la fuente. Siguiendo con el circuito del ventilador de CC, es muy importante colocar el condensador C3/10nF para disminuir el ruido que genera el motor eléctrico y que es inyectado en la fuente. Este condensador tiene que estar lo mas cerca posible de los contactos del CN4. Para que el PIC pueda comprobar la perdida de alimentación se usa un divisor de tensión compuesto por R4 y R5, mas la capacidad C7 para dar algo de estabilidad a la señal. También nos aprovechamos del diodo interno limitador que tiene este pin y que nos limita la tensión (5.5v) que le llega desde el exterior. D1 y C6 nos permiten prolongar la alimentación del PIC frente a caídas de la alimentación. C4 tiene que ser de menor capacidad que C6, y se añade R2 que ayuda a la descarga de C4, para hacer que en el caso de ausencia de tensión el PIC pueda detectar esta caída antes de quedarse sin alimentación, . Sobre todo en el caso de no utilizar un ventilador de 12VDC. IC2 es un conocido estabilizador de tensión de 5V/1A (7805CV), que es complementado por C5. Q1 se encargan de suministrar la corriente necesaria para alimentar el rele, ya que el microcontrolador no tiene suficiente potencia para hacerlo directamente. D2 absorbe los picos inversos de corriente que se producen al alimentar la bobina del rele, no se puede suprimir del esquema, ya que el transistor seria destruido con el tiempo. C2 es el condensador de desacople del PIC. Este condensador es tan valioso como el mismo PIC así que no se puede suprimir y ha de estar lo mas cerca posible de los pines de alimentación del integrado. Los LEDs solo se utilizan para saber en que estado se encuentra el circuito (a la hora de programar esto nos ayuda mucho para encontrar errores en el código del programa), se pueden suprimir ya que el circuito estará oculto. El calculo de las resistencias (R8, R7) limitadoras de los diodos LED se hará de la siguiente forma:
Para calcular la resistencia (R1) de polarización del transistor se utiliza una formula también genérica:
La resistencia limitadora R3 de 1/2W en serie con el motor limita los picos de tensión durante el arranque. Es recomendable colocarla cuando se trabaja con motores y las fuentes de alimentación están demasiado justas de corriente. Se encarga de limitar la corriente del motor durante el arranque ya que esta es muy elevada con respecto a la corriente de trabajo indicada en el ventilador por el fabricante.
El circuito impresoEste es el circuito impreso diseñado para este proyecto. Puedes descargarlo de aqui. Este es el PCB que albergará los componentes.
Posición de cada componente sobre el PCB. El softwareEl programa ha sido escrito para el Basic del PIC SIMULATOR IDE, se puede obtener una versión gratuita funcional por tiempo limitado desde www.oshonsoft.com. El programa con detección por entrada digital está totalmente comentado: '*********************************************************************************************
'NOMBRE: Temporizador_WC_13
'MICRO: PIC12F675
'DESCRIPCION: Automatismo para el control de un ventilador de WC, detección por entrada digital
'FECHA/AUTOR: By COS, 09/06, 10/06
'Version 1.0
'oscilador interno
'versión 1.1 soft, versión 1.1 hard, compatible versión 1.0 de soft con versión 1.1 de hard
'Cambio del soft para emplear una entrada que detecta perdida de alimentación en la lámpara
'simplificación del disparo del rele
'modificación del sistema de control de las salidas
'Versión 1.3
'se activa el WDT
'se cambia la rutina del control de flash de los led para hacerlos independientes uno del otro
'**********************************************************************************************
' ************************ Declaración de variables ******************
Dim timer_base As Word 'base patrón para los timer
Dim timer_base_aux As Word 'establece el tiempo en mSeg, en el que se basaran los timer
Dim contador As Byte 'variable que controla la fase en la que se encuentran las temporizaciones
Dim timer1_sg As Word 'primera base de tiempos, para el control de rutinas
Dim timer1 As Word 'indica el tiempo para la base timer_sg
Dim led_flash_verde As Byte 'permite que se ejecute la rutina que se encarga del parpadeo del led verde
Dim led_flash_rojo As Byte 'permite que se ejecute la rutina que se encarga del parpadeo del led rojo
Dim flash_verde As Byte 'indica dentro de la rutina si el próximo estado del led apagado o encendido, verde
Dim flash_rojo As Byte 'indica dentro de la rutina si el próximo estado del led apagado o encendido, rojo
Dim rele As Bit 'controla el estado del rele
Dim ledverde As Bit 'controla el estado del led verde
Dim ledrojo As Bit 'controla el estado del led rojo
' ************************* Asignación de valores de las variables *******
timer_base = 0 'inicializa el timer_base
timer_base_aux = 1000 'establece el desbordamiento de timer_base, 1Seg
contador = 0 'establece la fase cero del programa main
timer1_sg = 0 'inicializa el timer1_sg
timer1 = 30 'establece el desbordamiento de timer1_sg, 30Seg
led_flash_verde = 1 'flash del led verde habilitado
led_flash_rojo = 0 'flash del led rojo deshabilitado
flash_verde = 0 'estado inicial del flash del led verde
flash_rojo = 0 'estado inicial del flash del led rojo
rele = 0 'estado inicial del rele, off
ledverde = 1 'estado inicial del led verde, on
ledrojo = 0 'estado inicial del led rojo, off
' ************************ Inicialización de registros generales y de E/S *********
VRCON = 0x00 'vref off (power off the comparator voltage)
ANSEL = 0x00 'off ADC
TRISIO = 0x00 'tri-state pins, are outputs
GPIO = 0x00 'clear port
GPIO.5 = 1 'pin a 1, maniobra invertida, activa a cero
GPIO.4 = 1 'pin a 1, maniobra invertida, activa a cero
GPIO.1 = 1 'para mantener la compatibilidad con la ver. 1.0 de hard
TRISIO.2 = 1 'GP2 pin, is input
CMCON = 0x07 'comparator off
WaitMs 10 'pausa de 10mSeg.
' *********** habilitación de interrupciones y programación del timer1 ****
INTCON.PEIE = 1 'bit de habilitación de interrupciones de periféricos
T1CON.TMR1ON = 1 'bit de habilitación del temporizador timer1
T1CON.TMR1CS = 0 'bit de selección de reloj para el timer1, interno Fosc/4
INTCON.T1IE = 1 'bit de habilitación de interrupción de TMR1 por rebose
T1CON.T1CKPS0 = 0 'bit de selección del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 0 'bit de selección del prescaler para el reloj del timer1
TMR1H = 0xfc 'carga el byte alto del registro del tiemr1 (1mSeg)
TMR1L = 0x18 'carga el byte bajo del registro del timer1 (1mSeg)
PIE1.TMR1IE = 1 'activa la interrupción del timer1
OPTION_REG.T0CS = 0 'selecciona reloj interno para el WDT
OPTION_REG.PSA = 1 ' asigna el prescales al WDT
OPTION_REG.PS0 = 1 ' bit de la selección del factor de división para el WDT
OPTION_REG.PS1 = 1 ' bit de la selección del factor de división para el WDT
OPTION_REG.PS2 = 1 ' bit de la selección del factor de división para el WDT
INTCON.T0IE = 0 ' deshabilito interrupción por el trm0
Enable 'INTCON.GIE=1, habilita las interrupciones generales
'
'
' ************* Rutina del programa ***************************************
main:
ASM: clrwdt 'reinicializa el WDT antes que se desborde
If contador = 0 Then 'primera fase del control de tiempos y maniobras
If timer1_sg >= timer1 Then 'si pasan los primeros 30Seg.
contador = 1 'permite la siguiente fase
timer1 = 0 'configura la base de tiempos con un nuevo valor 0Seg
timer1_sg = 0 'activa la base de tiempos
led_flash_verde = 0 'desconecta el parpadeo del led verde
led_flash_rojo = 1 'conecta el parpadeo del led rojo
ledverde = 0 'apaga el led verde
ledrojo = 1 'prende el led rojo
rele = 0 'desconecta el rele
Endif
Endif
If contador = 1 Then 'segunda fase del control de tiempos y maniobras
If timer1_sg >= timer1 Then 'cuando termina la base de tiempos según el ultimo valor del timer1
If GPIO.2 = 0 Then 'comprueba que hay alimentación en la fuente
contador = 2 'permite la siguiente fase
timer1 = 120 'carga la base de tiempos para que cuente 2minutos
timer1_sg = 0 'activa la base de tiempos
flash_verde = 1 'sincroniza el destello con el led rojo
flash_rojo = 1 'sincroniza el destello con el led verde
led_flash_verde = 1 'permite el parpadeo del led verde
led_flash_rojo = 1 'permite el parpadeo del led rojo
ledverde = 1 'prende el led verde
ledrojo = 1 'prende el led rojo
rele = 1 'energiza la bobina del rele
Endif
Endif
Endif
If contador = 2 Then 'tercera fase del control de tiempos y maniobras
If timer1_sg >= timer1 Then 'cuando pasan los 120seg.
contador = 1 'se cambia de fase
timer1 = 1 'se prepara la base de tiempos timer1_sg, para que cuente 1Seg.
timer1_sg = 0 'activa el contaje de la base de tiempos timer1_sg
rele = 0 'desconecta el rele
flash_verde = 1 'encendido alternativo del led verde con respecto al rojo
flash_rojo = 0 'encendido alternativo del led rojo con respecto al verde
led_flash_verde = 1 'permite el parpadeo del led verde
led_flash_rojo = 1 'permite el parpadeo del led rojo
ledverde = 1 'activa el led verde
ledrojo = 1 'activa el led rojo
Endif
Endif
Goto main
End
'
'
On Interrupt 'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
Save System 'Guarda los valores del sistema
'-------------------------------------- control salidas -----------------------------------------
If ledverde = 1 Then 'controla el estado de la salida del led verde
GPIO.5 = 0 'prende led verde
Else
GPIO.5 = 1 'apaga led verde
Endif
If ledrojo = 1 Then 'controla la salida del led rojo
GPIO.4 = 0 'prende led rojo
Else
GPIO.4 = 1 'apaga led rojo
Endif
If rele = 1 Then 'controla la salida del rele
GPIO.0 = 1 'energiza rele
GPIO.1 = 0 'energiza rele, compatibilidad con la ver. 1.0 de hard
Else
GPIO.0 = 0 'desconecta el rele
GPIO.1 = 1 'desconecta el rele, compatibilidad con la ver. 1.0 de hard
Endif
'-------------------------------------- bases de tiempos y flash diodos---------------------------
If PIR1.TMR1IF = 1 Then 'comprueba que es esta la interrupción activa
'(por costumbre, en este caso solo hay una)
timer_base = timer_base + 1 'se incrementa con cada desbordamiento del timer1
If timer_base >= timer_base_aux Then 'control del numero de desbordamientos
If timer1_sg < timer1 Then timer1_sg = timer1_sg + 1 'base de tiempos timer1
If led_flash_verde > 0 Then 'se encarga de hacer el led verde intermitente
If flash_verde = 0 Then 'controla el parpadeo del led verde
ledverde = 0 'conecta el verde
flash_verde = 1 'variable de control, permite que se conecte el verde
Else
ledverde = 1 'desconecta el verde
flash_verde = 0 'variable de control, controla el parpadeo
Endif
Endif
If led_flash_rojo > 0 Then 'se encarga de hacer el led rojo intermitente
If flash_rojo = 0 Then 'controla el parpadeo del rojo
ledrojo = 0 'conecta el led rojo
flash_rojo = 1 'variable de control, permite que se conecten los led
Else
ledrojo = 1 'desconecta el led rojo
flash_rojo = 0 'variable de control, controla el parpadeo
Endif
'
Endif
timer_base = 0 'se reinicialaza el valor de la base de tiempos patrón
Endif
Endif
TMR1H = 0xfc 'carga el registro del timer1, para que desborde cada 1mSeg.
TMR1L = 0x18
PIR1.TMR1IF = 0 'borra el flag de salto del tmr1
Resume 'activa las interrupciones y retorna al programa
Autor
| ||||||||||||||
|
Este contenido se rige por la licencia de Creative Commons "Licencia Creative Commons Atribución-No Comercial-Sin Obras Derivadas 3.0". Para más información, véase la licencia en su forma reducida y completa. |

