Uso Practico del Pic12F675

De Ucontrol
Saltar a: navegación, buscar

<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!.
<linkedimage>

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>

Dado electrónico
<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>

¿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>

Comunicación inalámbrica
<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>

Gráficos con CCS
<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>

Carteles de LEDs
Foroizq.jpg
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.
Foroder.jpg
Uso Práctico del PIC12F675

Introducción

Uso Práctico del PIC12F675

Esta 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

Contenido


El PIC12F675

El 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 WC

NOTA: 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 empleados

En este proyecto utilizaremos los siguientes módulos internos del PIC:

  • El reloj interno trabajando a 4MHz.
  • El módulo de entradas y salidas (E/S).
  • El módulo Watchdog Timer (Perro Guardián), este modulo lo nombraremos como WDT.
  • El Timer1.

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.

Objetivos

El 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 circuito

Los 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.


TWC001.gif
Esquema del Temporizador para WC.


Cuando se activa el rele, sus contactos suministran la energía tanto al circuito como al ventilador 220VAC conectado al CN5, quedando todo alimentado desde la red de forma directa. R9 es un varistor de 275V, y es un estupendo filtro de red.

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:


R = (5V-1.2V) /0.015A,


Este es un cálculo genérico, siendo 5V la tensión de alimentación, 1.2V el voltaje de la unión del diodo LED (que varía según su color), y por ultimo 0.015A es el la corriente que deseamos atraviese el LED.

Para calcular la resistencia (R1) de polarización del transistor se utiliza una formula también genérica:


R1 = (5V-0.6V) / 0.001A,


Debemos recordar que el valor de 0.001A solo es aproximado. Para estar seguros que el transistor estará trabajando en saturación, el proceso es tan simple como multiplicar el valor de la corriente de polarización (en este caso 1mA) por la ganancia en corriente del transistor (presente en su hoja de datos). 5V es la alimentación, y los 0.6V corresponden a la caída de tensión entre los extremos de la unión base/emisor de un transistor de silicio.

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 impreso

Este es el circuito impreso diseñado para este proyecto. Puedes descargarlo de aqui.

TWC002.gif
Este es el PCB que albergará los componentes.


TWC003.gif
Posición de cada componente sobre el PCB.

El software

El 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





Este articulo forma parte de la Revista uControl #1
<linkedimage>

wikipage=Revista_Numero_0001 tooltip=uControl Revista #1 img_src=Image:RU-TAPA001.jpg img_width=100px img_alt=uControl Revista #1

</linkedimage>

NOTA DE TAPA : Construye tus circuitos impresos
Todo aficionado a la electrónica tarde o temprano se topa con la necesidad de fabricar sus propios circuitos impresos o PCB (por "Printed Circuit Board"). En general, esta tarea es vista como algo muy complicado, pero la podemos llevar a buen término, siguiendo los pasos explicados en el artículo.

Ademas: El relojito, Uso Practico del Pic12F675, PIC BASIC (PSI), Temporizadores programables, Herederos del LM386N, Fundamentos de la Transmisión Síncrona y mucho más.

Puedes descargar la Revista uControl desde aqui, de forma totalmente gratuita.

Autor

Carlos.jpg Datos del Autor
Nombre: Carlos Ortega Sabio
email: carlos.ortegasabio@ucontrol.com.ar
Ver los artículos de este autor.

</center>
Cclicence.png

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.

Herramientas personales