Autor Tema: Uso Practico del PIC12F675 y I (Temporizador para WC)  (Leído 14819 veces)

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Uso Practico del PIC12F675 y I (Temporizador para WC)
« en: Septiembre 22, 2010, 08:36:27 pm »
Uso Practico del PIC12F675 y I (Temporizador para WC)

Esta es una sección dedicada especialmente al microcontrolador de Microchip PIC12F675 que 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.
 
El PIC12F675 es un microcontrolador, que como todos sus hermanos incorpora una serie de periféricos en su interior. Estos módulos son circuitos especializados. En sucesivos artículos iremos viendo con que módulos cuenta y como hacer uso de ellos, lo que nos dará  una idea de sus posibles aplicaciones.

Al igual que el resto de los PIC´s, 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 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.

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

-El reloj interno trabajando a 4Mhz.
-El modulo de entradas y salidas (I/O).
-El modulo Watchdog (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 modulo I/O 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 I/O 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 quedan 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 microprocesadores 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.

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.




Esquema del Temporizador para WC.



Código: [Seleccionar]
[color=blue]El programa con detección por entrada digital, 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                                'según el valor de timer_base_aux
            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

Nota: El programa ha sido escrito para el Basic del Pic Simulator IDE, se puede obtener una versión gratuita funcional por tiempo limitado desde http://www.oshonsoft.com/
[/color]
Saludos desde Granada, España.

mandragora21

  • PIC12F
  • **
  • Mensajes: 170
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #1 en: Febrero 26, 2011, 02:13:17 pm »
hola alguien tiene el pbc y hex de este proyecto
gracias :'(

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #2 en: Febrero 27, 2011, 12:05:53 am »
Lo tienes aquí:

www.pickey.es
Saludos desde Granada, España.

mandragora21

  • PIC12F
  • **
  • Mensajes: 170
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #3 en: Febrero 27, 2011, 07:24:36 am »
gracias por la contestacion pero lo que busco es el hex porque intente copilarlo y no puedo no se porque
podrias decirme donde conseguirlo.
nuchas gracias

el_vpi

  • Moderador
  • PIC18F
  • ******
  • Mensajes: 1348
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #4 en: Febrero 27, 2011, 11:06:34 am »
que error te da el compilador ?

mandragora21

  • PIC12F
  • **
  • Mensajes: 170
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #5 en: Febrero 27, 2011, 03:47:15 pm »
Hola vpi pues darme me da muchos errores como si el código no estuviera completo.
Compare el código que esta en el primer post con el que hay en la Web del creador y creo que no es el mismo porque uno parece que es la versión wc13 y el otro wc14 haber si dogflu66 nos pasa el código en hex. O el que tiene un su Web en pdf. Junto con el pbc me gustaría mucho probarlo.
Ya que el de su Web no puedo copiarlo ni descargarlo
 Un saludo y gracias
 ???

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #6 en: Febrero 27, 2011, 06:42:11 pm »
Hola, todos los códigos son operativos con su versión del C. PSI y están probados, lo que ocurre es que el compilador del PSI ha sufrido profundos cambios, y hay que actualizar los códigos, ya estoy actualizando la Web para que compile con la ultima versión del PSI.

PD: La Web por lo que se ve tiene algún tipo de protección que le añadió la empresa que la confecciono, por lo que se es su política de empresa, de todas formas hay mensajes que indican que se puede solicitar cualquier documento.
« Última modificación: Febrero 27, 2011, 06:48:33 pm por dogflu66 »
Saludos desde Granada, España.

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #7 en: Febrero 27, 2011, 07:26:36 pm »
Codigo 12F675_TWC_14:
Código: [Seleccionar]
Define CONF_WORD = 0x314c
'******************************* WWW.PICKEY.ES ******************************************
'****************************************************************************************
'NOMBRE: 12F675_TWC_14
'MICRO: PIC12F675
'LENGUAJE: Basic del PSI
'DESCRIPCION: Automatismo para el control de ventilador WC, detección por entrada digital
'AUTOR: By COS (dogflu66, www.pickey.es, info@pickey.es)
'FECHA: 09/06, 10/06, 05/08, 11/10, 02/11
'****************************************************************************************
'Versión 1.4: Actualizado a la versión actual del PSI
'Versión 1.2: Se añade el calibrado de fabrica del clock mediante el registro osccal
'Versión 1.1: soft, Ver. 1.1: hard, compatible ver. 1.0 de soft con ver. 1.1 de hard
'Cambio del soft para detectar perdida de alimentacion en la lampara por entrada digital
'Simplificación del disparo del rele
'Modificación del sistema de control de las salidas
'Se activa el WDT
'Version 1.0:
'Calibrado oscilador interno
'Relé controlado por dos pin
'Detección de perdida de red por entrada analogica
'****************************************************************************************
'/* _CPD_OFF, _CP_OFF, _BODEN_ON, _MCLRE_OFF,_PWRTE_ON, _WDT_ON, _INTRC_OSC_NOCLKOUT
'Define CONF_WORD = 0x31cc  '*/
Define CLOCK_FREQUENCY = 4  'Reloj a 4000000Mhz
'****************************************************************************************
'*** Asignación de nombres a pin ***
Symbol ledrojo = GP4  'False led On
Symbol ledverde = GP5  'False = led On
Symbol rele = GP0  'True = rele On
'Symbol red = GP2  'True = hay red
'***Definición de constantes ***
Const ledon = 0  'Led a ON
Const ledoff = 1  'Led a OFF
Const releon = 1  'Rele a ON
Const releoff = 0  'Relé a OFF
Const redon = 1  'Alimentación ON
Const redoff = 0  'Alimentación a OFF
'*** Declaracion de variables Globales ***
Dim fase As Byte  'Variable que controla la fase en la que se encuentra el programa
'*** Asignación de valores a las variables ***
fase = 0  'Establece la fase cero del programa main
'*** Inicializacion de registros generales y de E/S ***
VRCON = 0x00  'Vref off(power off the comparator voltage)
CMCON = 0x07  'Comparator off
ANSEL = 0x00  'Pin digitales, Off ADC
'OSCCAL = 48  'Diferente para cada micro
TRISIO = 0x00  'Tri-state pins, are outputs
GPIO = 0x00  'Clear port
TRISIO.2 = 1  'GP2 pin, is input
GPIO.1 = 0  'Compatibilidad con la ver. 1.0 de hard
rele = releoff  'Rele a Off
ledrojo = ledoff  'Led a Off
ledverde = ledoff  'Led a Off
Call loadosccal()  'Carga el valor de OSCCAL del fabricante

WaitUs 10000  'Pausa para estabilizar

Call clrwdt(1)  'Se inicializa WDT
Call _timer(0, 0, 0xfc18, %1)  'Inicializa bases de tiempos, recarga tmr1.
Call _timer(0, 0, 0, %0010)  'Reset al timer x, activa timer x
Call _timer(0, 3000, 0, %0100)  'Recarga el timer x con y, 30Seg, pasos de 10mSeg.
Call _timer(1, 0, 0, %0010)  'Reset al timer x, activa timer x
Call _timer(1, 500, 0, %0100)  'Recarga el timer x con y, 0.5Seg, pasos de 1mSeg.

Enable  'INTCON.GIE habilita las interrupciones generales

Call ctrled(%10010)  'Parpadeo led rojo

'*** Rutina del programa ***
main:
Call clrwdt(0)  'Reset al contador TMR0 asociado al WDT

'/* Espera 30Seg: permite fase 1, parpadeo led verde, relé a OFF
If fase = 0 Then  'Primera fase del control de tiempos y maniobras
If _timer.0 = 1 Then  'Si pasan los primeros 30Seg.
fase = 1  'Permite la siguiente fase
Call ctrled(%11000)  'Parpadeo led verde
rele = releoff  'Relé a OFF
Endif
Endif  '*/

'/* Si Red esta a OFF: permite fase 2, timer con 120Seg., led sincronizados, relé ON
If fase = 1 Then  'Segunda fase del control de tiempos y maniobras
If _timer.0 = 1 Then  'Si la base de tiempos timer.0 termino de contar
If GPIO.2 = redoff Then  'Si alimentación fuente es igual a OFF
fase = 2  'Permite la siguiente fase
Call _timer(0, 12000, 0, %0100)  'Recarga el timer x con y'120Seg 2minutos
_timer.0 = 0  'Activa la base de tiempos
Call ctrled(%11010)  'Sincronizados
rele = releon  'Relé a ON
Endif
Endif
Endif  '*/

'/* Carga pausa de 1Seg., permite fase 1, activa led alternos, rele a OFF.
If fase = 2 Then  'Fase del control de tiempos y maniobras
If _timer.0 = 1 Then  'Cuando pasan los 120seg.
fase = 1  'Se cambia de fase
Call _timer(0, 100, 0, %0100)  'Recarga el timer x con y, 1Seg.
_timer.0 = 0  'Reset a la base de tiempos.0
rele = releoff  'Relé a OFF
Call ctrled(%11011)  'Parpadeo led alternos
Endif
Endif  '*/

If _timer.1 = 1 Then  '/*Control parpadeo led 50% de 1Seg.
_timer.1 = 0  'Reset al timer.1
Call ctrled(%00000)  'Control led
Endif  '*/

Goto main
End                                               
'*** Subrutinas ***
Include "_ProcLoadOSCCAL.bas"  'Calibra el reloj
Include "_ProcClrWdt.bas"  'Controla el WDT
Include "_ProcCtrLed.bas"  'Control de los led
Include "_FunctionTimer.bas"  'Añade bases de tiempos

On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva interrupciones
Save System  'Guarda los valores del sistema
If PIR1.TMR1IF = 1 Then  'Interrupcion activa
Call _timer(0, 0, 0, %0)  'Actualización de los timer
PIR1.TMR1IF = 0  'Borra el flag de salto del tmr1
Endif
Resume  'Activa las interrupciones y retorna al programa
Saludos desde Granada, España.

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #8 en: Febrero 27, 2011, 07:30:09 pm »
Includes al codigo 12F675_TWC_14:

Código: [Seleccionar]
'Include "_ProcLoadOSCCAL.bas"
'Carga el registro OSCCAL por el prefijado de fabrica
'Call loadosccal()
Proc loadosccal()
ASM:        bsf status,rp0
ASM:        Call 3ffh
ASM:        movwf osccal
ASM:        bcf status,rp0
End Proc 

'Declaracion de variables control
'Include "_ProcClrWdt.bas"
'Call clrwdt(1) 'Se inicializa
'Call clrwdt (0) 'Se llama
'Si se produce una bajada y de seguida una subida de voltaje,
'este suceso puede que no lo detecten los modulos de proteccion interna.
'Se corrompen los valores en la RAM y el sistema no se bloquea, sigue
'funcionando pero deja de hacer lo que debe correctamente.
'Cuando se corrompan los valoes de la Ram tambien se corromperan los
'valores de las variables de control (v0 a v4) y esto forzará un reset.
Proc clrwdt(ini As Byte)
'Declaracion de variables de cotrol
Dim v0 As Byte
Dim v1 As Byte
'Dim v2 As Byte
'Dim v3 As Byte
'Dim v4 As Byte
Const ctrl = %10101010  'Numero de control 170

If ini = 1 Then
'Configura WDT-------------------------------------------------------------
ASM:        clrwdt  'reinicializa el WDT
'INTCON.TMR0IE = 0  'deshabilito interrupcion por el trm0
INTCON.T0IE = 0  'deshabilito interrupcion por el trm0
OPTION_REG.PSA = 1  'asigna el prescales al WDT (32,768mSeg. a 4Mhz)
OPTION_REG.PS0 = 1  'bit de la seleccion del factor de division para el WDT
OPTION_REG.PS1 = 1  'bit de la seleccion del factor de division para el WDT
OPTION_REG.PS2 = 1  'bit de la seleccion del factor de division para el WDT
OPTION_REG.T0CS = 0  'selecciona reloj interno para el WDT
'Inicializa variables control
v0 = ctrl
v1 = ctrl
'v2 = ctrl
'v3 = ctrl
'v4 = ctrl
Endif

If v0 = ctrl And v1 = ctrl Then
ASM:        clrwdt  'reinicializa el WDT
Endif

End Proc                   

'**********************************************
'**** Recordar definir en el programa *********
'Symbol ledrojo = GP4  'False led On **********
'Symbol ledverde = GP5  'False = led On *******
'**********************************************
'**** Esta rutina necesita ser asociada *******
'**** a una base de tiempos para el control ***
'**** del parpadeo de los led *****************
'**********************************************
'Include "_ProcCtrLed.bas"
'Call ctrled(%11010) 'Configura parpadeo led sincronizados
'Call ctrled(%0xxxx) 'Ejecuta la configuración
'Tipo.0 = ON/OFF led rojo
'Tipo.1 = ON/OFF parpadeo led rojo
'Tipo.2 = ON/OFF led verde
'Tipo.3 = ON/OFF parpadeo led verde
'Tipo.4 = Configura estados
'Tipo.0 = Ejecuta la configuración
Proc ctrled(tipo As Byte)
Dim ctrl As Byte
If tipo.4 = 1 Then
ctrl = tipo
ledrojo = Not tipo.0  'Estado led rojo
ledverde = Not tipo.2  'Estado led verde
Endif
If ctrl.1 = 1 Then Toggle ledrojo  'Parpadeo led rojo
If ctrl.3 = 1 Then Toggle ledverde  'Parpadeo led verde
End Proc

'Include "_FunctionTimer.bas"
'Rutina bases de tiempos.
'Los timepos en pasos de 1mSeg/4Mhz = 0xFC18
'Los tiempos en pasos de 1mSeg/8Mhz = 0xF830.
'Los tiempos en pasos de 10mSeg/8Mhz = 0xB1E0.
'Los tiempos en pasos de 1mSeg/20Mhz = 0xEC78.
'Los tiempos en pasos de 10mSeg/20Mhz = 0x3CB0.
'Call _timer(0, 0, 0x3cb0, %1), Inicializa bases de tiempos, recarga TMR1.
'Call _timer(0, 0, 0, %0), Llamada normal a la rutina despues incializacion.
'Call _timer(x, 0, 0, %0010), Reset al timer x, activa timer x
'Call _timer(x, y, 0, %0100), Recarga el timer x con y
'Call _timer(0, 0, 0x3cb0, %1000), Recarga la base de tiempos del TMR1
'Los flag de los timer son: _timer.0... _timer.7
'tmr1hl = tiempo desborde timer1, Init = 0 incializa la rutina, no activa los timer.
'Hay que incluir el progra las siguietnes lineas:
'Enable  'INTCON.GIE = 1, Hay que recordar insertarlo en el codigo fuente.
'y rutina interrupciones (On interrupt).
Function _timer(tmr_n As Byte, tmr_tp As Word, tmr1hl As Word, init As Byte) As Word
Dim tmr_on As Word  '/*Declaracion de contadores y variables auxiliares
Dim base As Word
Dim tmrhb As Byte
Dim tmrlb As Byte
Dim x As Word
Dim x1 As Byte
Dim _tmr(3) As Word
Dim _tmr_tm(3) As Word  '*/

If init > 0 Then
Disable
If init.0 = 1 Then  'Inicaliza variables y registros del TMR1
_timer = 0
tmr_on = 0
base = 0
For x = 0 To 2
_tmr(x) = 0
_tmr_tm(x) = 0
Next x
TMR1H = tmr1hl.HB  '0x3c, carga el byte alto del regis. TMR1 (1mSeg) a 8Mhz
TMR1L = tmr1hl.LB  '0xb0, carga el byte bajo del regis. TMR1 (1mSeg) a 8Mhz
T1CON.TMR1CS = 0  'Bit de seleccion de reloj para el TMR1, interno Fosc/4
T1CON.T1CKPS0 = 0  'Bit de seleccion del prescaler para el reloj del TMR1
T1CON.T1CKPS1 = 0  'Bit de seleccion del prescaler para el reloj del TMR1
T1CON.TMR1ON = 1  'Activa el contador del TMR1
PIE1.TMR1IE = 1  'Activa las interrupciones del TMR1
INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
Endif

If init.3 = 1 Or init.0 = 1 Then  'Valor de carga contador TMR1
tmrhb = tmr1hl.HB
tmrlb = tmr1hl.LB
Endif

If init.2 = 1 Then  'Recarga tiempo tope timer
_tmr_tm(tmr_n) = tmr_tp
Endif

If init.1 = 1 Then  'Inicializa los timer
'Activa el timer seleccionado
x = %0000000000000001  'Valor de entrada
x = ShiftLeft(x, tmr_n)  'Corre el bit, para seleccionar timer
tmr_on = tmr_on Or x  '=1, Iguala a 1 el bit seleccionado
'Resetea el timer seleccinado
x1 = tmr_n  'Numero de bits a desplazar
x = %1111111111111110  'Valor de entrada
While x1 > 0  'Bucle de seleccion de bit
x = ShiftLeft(x, 1)  'Corre el bit, para seleccionar timer
x.0 = 1  'Rellena los huecos con 1
x1 = x1 - 1  'Contador, hasta llegar al bit seleccionado
Wend
_timer = _timer And x  '=0, Iguala a cero el bit seleccionado
_tmr(tmr_n) = 0  'Borra contador seleccionado
Endif
Enable
Endif

'Control de los contadores de los timer
If init = 0 Then  'Si se hace la llamada desde las interrupciones
TMR1H = tmrhb  '0x3c, carga el byte alto del regis. tiemr1 (100mSeg) a 8Mhz
TMR1L = tmrlb  '0xb0, carga el byte bajo del regis. timer1 (100mSeg) a 8Mhz

If _timer.0 = 0 And tmr_on.0 = 1 Then  'Control base tiempos timer.0 / 10
base = base + 1
If base >= 10 Then
base = 0
_tmr(0) = _tmr(0) + 1  'Incrementa el contador
If _tmr(0) >= _tmr_tm(0) Then  'Comprueba el tope del contaje
_timer.0 = 1  'Para el contador e indica que termino
_tmr(0) = 0  'Prepara un nuevo contaje
Endif
Endif
Endif
If _timer.1 = 0 And tmr_on.1 = 1 Then  'Control base tiempos timer.1
_tmr(1) = _tmr(1) + 1  'Incrementa el contador
If _tmr(1) >= _tmr_tm(1) Then  'Comprueba el tope del contaje
_timer.1 = 1  'Para el contador e indica que termino
_tmr(1) = 0  'Prepara un nuevo contaje
Endif
Endif
Endif
End Function

Saludos desde Granada, España.

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #9 en: Febrero 27, 2011, 08:34:54 pm »
Código de la versión anterior TWC 13 corregido para la ultima versión del PSI V6.91:

Código: [Seleccionar]
'*********************************************************************************************
'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, www.pickey.es, info@pickey.es, 09/06, 10/06, 02/11
'Versión 1.3, Compilador Basic del PSI, V6.91
'se activa el WDT
'se cambia la rutina del control de flash de los led para hacerlos independientes uno del otro
'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
'Version 1.0
'oscilador interno
'**********************************************************************************************
'************************ 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 ****
T1CON.TMR1CS = 0  'bit de selección de reloj para el timer1, interno Fosc/4
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)
T1CON.TMR1ON = 1  'bit de habilitación del temporizador timer1
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.PEIE = 1  'bit de habilitación de interrupciones de periféricos
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                                'según el valor de timer_base_aux
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

Saludos desde Granada, España.

mandragora21

  • PIC12F
  • **
  • Mensajes: 170
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #10 en: Febrero 28, 2011, 02:15:23 pm »
Hola quería agradecer a los dos por la ayuda de intento de copilar esto pero el intento se quedo en fracaso ya que sigo sin poder copilarlo.
Me expirare yo no conocía este programa para copilar el PIC Simulator ID ya que solo copile con el mplab seguramente el problema es que no me aclaro o estoy copiando el archivo en bloc de notas con xteensión ASM y no es así no lo se, busque por Internet algún manual de como realizarlo pero no encuentro nada explicativo.
Me fastidia porque me gustaría mucho montar este circuito ya que le Daria utilidad,
Ya estoy casi por tirar la toalla pero hay sigo intentando creo que no será tan difícil si alguna alma caritativa me pasara el hex. Lo agradecería.
Si no es así pues nada un saludo dogflu66 y muchas gracias.
 :'( :'( :'( :'( :'(

HJ

  • Moderador
  • dsPIC
  • ******
  • Mensajes: 5713
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #11 en: Febrero 28, 2011, 03:28:30 pm »
Me expirare yo no conocía este programa para copilar el PIC Simulator ID ya que solo copile con el mplab seguramente el problema es que no me aclaro o estoy copiando el archivo en bloc de notas con xteensión ASM y no es así no lo se, busque por Internet algún manual de como realizarlo pero no encuentro nada explicativo.

No. eso está mal muy mal.
Debes utilizar el compilador PSI para pasarlo a HEX.

Lamentablemente no tengo el compilador y no puedo ayudarte.

Saludos

P.D.: prueba bajar una versión de prueba de la página de PSI

Edito: Página del PSI
« Última modificación: Febrero 28, 2011, 03:42:52 pm por HJ »
"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]

mandragora21

  • PIC12F
  • **
  • Mensajes: 170
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #12 en: Febrero 28, 2011, 03:42:44 pm »
Hola que si esta mal claro que si pero ya estoy toda la tarde peleándome con el programa y el archivo y no hay manera que malo es no saber.
No tengo ni idea de como funciona esto y como manuales no encontré pues aquí estoy con la cabeza que me echa humo.
Haber si aparece dogfluu66 y me echa una manita supongo que alguien que sepa copilarlo tardado 1 minuto en hacerlo y yo llevo ya 3 días.
De todas maneras gracias amigo.
 :'(

HJ

  • Moderador
  • dsPIC
  • ******
  • Mensajes: 5713
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #13 en: Febrero 28, 2011, 03:54:06 pm »
Acabo de bajar la versión de prueba y no me deja compilar porque son mas de 50 lineas de código.
Lamentablemente no puedo ayudarte.
Esperemos que alguien que tenga una versión paga, te haga el favor de compilarlo.

Saludos
"si te lo dicen se te olvida, si lo lees lo aprendes; pero si lo haces realmente lo entiendes"
"Cuando llegue la inspiración, que me encuentre trabajando" [Pablo Picasso]

dogflu66

  • PIC10F
  • *
  • Mensajes: 78
Re: Uso Practico del PIC12F675 y I (Temporizador para WC)
« Respuesta #14 en: Febrero 28, 2011, 03:54:48 pm »
Te envié el .hex a tu correo, ¿no te ha llegado?.... ???
Saludos desde Granada, España.