Justiniano para un PIC de 8 pines....2 de los relay, mas dos de los switch, mas disparo triac, mas entrada de detección cruce por cero, mas dos de alimentación igual 8 pines.
Si no hay necesidad de impresión/salida display, el programa en sí en el compilador Proton lleva unas 373 palabras como esta, entrara en uno de 8 pines tranquilamente.
Recién saque humito del triac; grabé una prueba sencilla con tres estados o intencidades y al parecer debo de haber borrado la calibración del osc por qué sacó humo ... Lo probé en un 16f628 y osc externo y anda lo más bien ese mini programa. Voy a ver si me hago de un tiempo para colectar más info y hacer todo directamente en el pic de18 pines. Termino y comparto
Buenas noches compañeros, despues de un largo tiempo de haber hecho este proyecto y que con la ayuda de Sr. D@rkbytes logre colocarlo a funcionar con visualizacion de una pantalla LCD 16x2, es un variador de velocidad para motores de 120V AC que es lo que se trabaja en colombia, tambien sirve para variar la luminosidad de una bombilla incandescente espero les sirva y si pueden mejorarlo mucho mejor y lo compartan, este proyecto tambien lo pueden hacer sin la pantalla LCD todo viene separado, ya que el pic principal trabaja independiente del pic que hace la visualizacion.
El archivo de simulacion esta en proteus 8.5 SP0.
Ya mi proximo reto es hacerlo para variar motores a 220V AC.
Hola Juan, gracias. Ayer arme un dimmer convencional con triac y diac para sacarme la duda y no logré modificar la velocidad. Probé algunas ideas de 2M pero justo no tenía un capacitor de 10u para ponerlo en serie... Probé con uno de 2.5 y el motor hacía ruido de que quería más morro, pero estoy pensando en hacer una especie de rampa para simular el control de velocidad; Al ser una carga inductiva, tengo un tiempo dado en que el bobinado mantiene la energía.... Quizás haciendo un tren de pulsos dentro de la zona de conducción me haga un fenómeno similar al que quiero replicar
Hola a todos. Muchísimo tiempo que no pasaba por aquí a molestar.
A ver, les cuento. Armé una CNC y ahora quiero controlar el SPINDLE que es un BRUSHLESS hecho por mí y quiero ponerle tacometro con LCD 2X16 pero no he podido lograr que un solo PIC16F628A haga las 2 funciones.
¿Será que definitivamente es imposible, o seré yo que no he podido escribir bien el programa?
Este es mi programa:
Código:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'tacometro LCD y pic 16f628a '
'****************************************************************
CMCON = 7 'Comparadores Apagados
TRISB = %00000000
PORTB = 0
'****************************************************************
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, WDT_ON
@ DEVICE XT_OSC
define osc 4
' DEFINICIÓN DE REGISTROS PARA EL LCD
Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG PORTB
Define LCD_EBIT 1
TRISB=0
taco var word
PAUSE 100
tacometro:
count porta.1,1000,taco
taco=(taco*60)
lcdout $fe,1, " SPINDLE "
lcdout $fe,$c2,dec taco
lcdout $fe,$c9,"R.P.M."
pos var byte
cont var byte
servo1 var porta.1
potein var porta.0
pote:
Pot potein, 255,pos
for cont = 0 to 50
pulsout servo1,pos
pause 15
next cont
goto pote
GOTO tacometro
end
A ver si me pueden ayudar.
Les agradezco de antemano.
Hola a todos. Muchísimo tiempo que no pasaba por aquí a molestar.
A ver, les cuento. Armé una CNC y ahora quiero controlar el SPINDLE que es un BRUSHLESS hecho por mí y quiero ponerle tacometro con LCD 2X16 pero no he podido lograr que un solo PIC16F628A haga las 2 funciones.
¿Será que definitivamente es imposible, o seré yo que no he podido escribir bien el programa?
Este es mi programa:
Código:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'tacometro LCD y pic 16f628a '
'****************************************************************
CMCON = 7 'Comparadores Apagados
TRISB = %00000000
PORTB = 0
'****************************************************************
@ DEVICE pic16F628A, LVP_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, BOD_ON
@ DEVICE pic16F628A, CPD_OFF
@ DEVICE pic16F628A, PROTECT_OFF
@ DEVICE pic16F628A, WDT_ON
@ DEVICE XT_OSC
define osc 4
' DEFINICIÓN DE REGISTROS PARA EL LCD
Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 0
Define LCD_EREG PORTB
Define LCD_EBIT 1
TRISB=0
taco var word
PAUSE 100
tacometro:
count porta.1,1000,taco
taco=(taco*60)
lcdout $fe,1, " SPINDLE "
lcdout $fe,$c2,dec taco
lcdout $fe,$c9,"R.P.M."
pos var byte
cont var byte
servo1 var porta.1
potein var porta.0
pote:
Pot potein, 255,pos
for cont = 0 to 50
pulsout servo1,pos
pause 15
next cont
goto pote
GOTO tacometro
end
A ver si me pueden ayudar.
Les agradezco de antemano.
Les dejo y comparto estás librerías para manejo de display i2C.
Observen que son dos archivos, uno corresponde para pbp2.6 y el otro para las versiones pbp3.0
Me estoy tomando el trabajo de buscar librerías para pbp de shield Arduino; Seria bueno ir acopiando con ejemplos para quien lo necesite
Que tal buenas tardes, estoy trabajando con un sensor de temperatura y humedad amt1001, éste sensor cuenta con 2 cables de salida uno para humedad y el otro para temperatura, el de humedad trabaja con voltaje de salida mientras el de temperatura trabaja con un termistor ntc de 10k.
Mi problema es que no se como hacer funcionar el de temperatura, no se como va programado.
Termistor / Termopares, las salidas no son lineales, por lo tanto tenes que usar tablas del estilo LOOKUP o LOOKDOWN.
Mirate este link y guardalo tambien por que tenes matematicas para implementar en tus proyectos PBP:
Buen día.
El sensor que uso es el AMT1001 tiene temperatura por NTC 10K y humedad como salida máxima 3V.
Estuve trabajando con el código y tengo problemas, las lecturas están fluctuando mucho.
Alguien que de un vistazo y ver qué estoy haciendo mal.
Saludos y gracias.
Código:
TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA
ADCON1=14 ; DECLARAR QUE LAS ENTRADA ra0 son analogico
SENSAR VAR word
DIGITAL VAR WORD
SENSAR=0
DIGITAL=0
PORTA=0
PORTB=0
PORTC=0
INICIO:
ADCIN 0,DIGITAL
SENSAR=150* DIGITAL
SENSAR=SENSAR/100
PAUSE 500
LCDOUT $FE,1
LCDOUT $FE,2,"Tem"
LCDOUT $FE,$C0,"=",#SENSAR,%11011111, "C"
PAUSE 500
GOTO INICIO
No hay un comentario de las líneas de código ni por casualidad, no nos informas que microprocesador estas usando.
En la lógica de la matemática y sin entrar en mucho detalle multiplicas una variable por 150 y luego la divides por 100, pregunto no será mas rápido y eficiente que tú apliques algo de matemática básica y multipliques por 15 y dividas por 10 que no alterara el resultado?.
Si trabajas con sensores analógicos y sin respuesta lineal o de alguna formula estándar conocida, tienes dos alternativas que se me ocurre o trabajas con una tabla almacenada y comparas la entrada con la tabla o encuentras una formula matemática que defina la curva que represente a tu sensor en funcionamiento con la precisión que desees.
No hay un comentario de las líneas de código ni por casualidad, no nos informas que microprocesador estas usando.
En la lógica de la matemática y sin entrar en mucho detalle multiplicas una variable por 150 y luego la divides por 100, pregunto no será mas rápido y eficiente que tú apliques algo de matemática básica y multipliques por 15 y dividas por 10 que no alterara el resultado?.
Si trabajas con sensores analógicos y sin respuesta lineal o de alguna formula estándar conocida, tienes dos alternativas que se me ocurre o trabajas con una tabla almacenada y comparas la entrada con la tabla o encuentras una formula matemática que defina la curva que represente a tu sensor en funcionamiento con la precisión que desees.
Que tal perdón por no poder mas datos
Dejo los de mas datos que me faltan
utilizo un Pic 16f876A
El sensor de Humedad es lineal y trabaja con un voltaje de salida de 0 a 3V y Humedad de 0 a 100%
El pin del sensor lo coloco en el pin 2 de micro ADC
Tengo el siguiente problema:
tengo valores muy cercanos ya que estoy comprobando con un multtimetro de temperatura y humedad uni-t
pero me esta saltando mucho por ejemplo: esta en 18 y pasa al 22 después que esta en 22 baja a 15
Y no se mantiene estable sube o baja mucho
el código es el siguiente:
Código:
INCLUDE "MODEDEFS.BAS" ; LIBRERIA PARA OCUPAR LA COMUNICACIÓN SERIAL
define LOADER_USED 1
DEFINE OSC 20 ;DEFINIR EL OSCILADOR EN 20 MHz (HS)
DEFINE ADC_BIST 10 ;DEFINE LA RESOLUCION DEL ADC
DEFINE ADC_CLOCK 3 ;1-LP 2-XT 3-HS
DEFINE ADC_SAMPLEUS 50 ;TIEMPO QUE TARDA LA SEÑAL EN CONVERTIR LA SEÑAL ANALOGICA A DIGITAL
DEFINE LCD_DREG PORTC
DEFINE LCD_BITS 4
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTC
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTC
DEFINE LCD_EBIT 5
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
TRISA=255 ; DECLARAR TODO EL REGISTRO A COMO ENTRADA
TRISB=0 ; DECLARAR TODO EL REGISTRO B COMO SALIDA
TRISC=%00001111 ; DECLARAR RCO A RC3 COMO ENTRADA Y RC4 A RC7 COMO SALIDA
ADCON1=14
SENSAR VAR word
DIGITAL VAR WORD
SENSAR=0
DIGITAL=0
PORTA=0
PORTB=0
PORTC=0
INICIO:
ADCIN 0,DIGITAL
SENSAR=299*DIGITAL ; los 250 es sacando del sensor * 255 que nos da el digital
SENSAR=SENSAR/250 ; los 250 dividido y me da la humedad
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"humedad"
LCDOUT $FE,$C0,"=",#SENSAR,%11011111, "%"
PAUSE 1000
GOTO INICIO
No conozco el sensor ese ya que hace mucho que trato en lo posible de no trabajar con sensores analógicos habiendo digitales para evitar un montón de problemas que surgen de la comunicación, ruidos, etc.
Sí el problema es de estabilidad, te sugiero que hagas varias mediciones en un determinado tiempo y luego promedies el resultado para mostrarlo siempre que el valor halla cambiado.
También puede ser debido a ruido que se "cuele" durante la medición debido a la longitud entre sensor-microcontrolador y un sinnúmero de etc que no nos comentas.
No es lo mismo algo armado en un PCB diseñado bien y con el uso de cables apantallados para evitar interferencias que un prototipo armado en un protoboard con cables largos y sin blindaje, etc.
Como implementaste el programa siempre mides y muestras, lo que te estoy sugiriendo es que almacenes el valor anterior en una variable y antes de mostrar el valor actual lo compares y solo lo muestras si es diferente al anterior, de esa forma es mas estable todo y mas rápido ya que si no hubo variación no pierdes el tiempo mostrando algo que ya esta en el display.
Buenas noches, saludos.
Acudo a este foro con la finalidad de interactuar con ustedes y lograr superar un inconveniente con un pic y su programa, el cual paso a describir así.
Tengo un calentador de agua a gas, al cual, se le dañó (quemó) la tarjeta de control.
Menciono que esta tarjeta quemada posee como elemento de control un PIC12C509.
Yo analicé el funcionamiento del aparato y diseñé un código en microcode pero basado en el PIC16F84A y funciona sin problema en la simulación de proteus.
El inconveniente se presenta por el tamaño de la tarjeta con el PIC16F84A, que no cabe en el espacio destinado en el calentador, sin menoscabar que sobran pines sin uso.
A partir de ahí, decido pasar previas modificaciones a un pic enano, el PIC12F629, dado a sus bondades, el proyecto necesita solo tres entradas y tres salidas y este pic me ofrece eso.
Ya realizado el cambio o modificaciones al programa del PIC16F84A para compilarlo para el PIC12F629 no logro que funcione y el defecto está en los fuses de ese PIC.
Una de las fallas o error que presenta la simulación es que, no convierte el pin GP.3 en entrada y continúa siendo el pin del MCLR, tampoco se configura el oscilador interno.
Sin más, muestro el código hecho para el PIC16F84A y la simulación en proteus.
Cabe destacar que está realizado en microcode studio
Código:
'* Version : 1.0 *
'* Notes : control calentador agua con pic 16f84a *
'* : *
'****************************************************************
'pic 16F84A
define osc 4 'defino frec osc en 4mhz
trisa=%00000 'configuro puerto A como salidas
trisb=%00111000 'configuro puerto RB0-RB2 salidas y RB3-RB5 entradas
portb=0 'inicializo las salidas a 0 logico
symbol TEMP = portb.3 'nombro el pin RB3 como TEMP
symbol LLAMA = portb.4 'nombro el pin RB4 como LLAMA
symbol FLUJO = portb.5 'nombro el pin RB5 como FLUJO
symbol GAS = portb.0 'nombro el pin RB0 como GAS
symbol PILOT = portb.1 'nombro el pin RB1 como PILOT
symbol ALAR = portb.2 'nombro el pin RB2 como ALAR
INICIO: 'comienzo de programa
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =1 then 'pregunto si FLUJO es 1 si es cierto
pause 200 'pausa de 200 ms
goto PRENDER 'salto a PRENDER
else 'de lo contrario
goto inicio 'salto a inicio
endif 'fin del if
PRENDER: 'subrutina PRENDER
pause 1000 'pausa de 1 seg
IF temp = 0 THEN 'pregunto si TEMP es 0 si es cierto
GOTO ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =0 THEN 'pregunto si FLUJO es 0 si es cierto
GOSUB INICIO 'salto a INICIO
ENDIF 'fin del if
high GAS 'enciendo GAS
pause 500 'pausa de 500 ms
high PILOT 'enciendo PILOT
pause 500 'pausa de 500 ms
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin del if
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
goto APAGAR 'salto a APAGAR
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin de if
MANTENER: 'subrutina MANTENER
pause 500 'pausa de 500 ms
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin de if
pause 500 'pausa de 500 ms
if LLAMA and FLUJO =1 then 'pregunta si LLAMA y FLUJO son 1 si es cierto
gosub MANTENER 'salto a MANTENER de lo contrario
goto APAGAR 'salto a APAGAR
endif 'fin del if
APAGAR: 'subrutina de APAGAR
low GAS 'apago GAS
low PILOT 'apago PILOT
pause 5000 'pausa 500 ms
goto INICIO 'salto a inicio
ALARM: 'subrutina ALARM
low gas 'apago GAS
low piloT 'apago PILOT
goto LED 'salto a LED
LED: 'subrutina LED
high ALAR 'prendo ALAR
pause 100 'pausa de 100 ms
low ALAR 'apago ALAR
pause 100 'pausa de 100 ms
if TEMP =0 then 'pregunto TEMP es 0 si es cierto
gosub LED 'regreso a LED de lo contrario
goto INICIO 'salto a inicio
endif 'fin del if
goto inicio 'ir a inicio
end 'fin del programa
Código:
'* Version : 1.0 *
'* Notes : control calentador agua con pic 16f84a *
'* : *
'****************************************************************
'pic 16F84A
define osc 4 'defino frec osc en 4mhz
trisa=%00000 'configuro puerto A como salidas
trisb=%00111000 'configuro puerto RB0-RB2 salidas y RB3-RB5 entradas
portb=0 'inicializo las salidas a 0 logico
symbol TEMP = portb.3 'nombro el pin RB3 como TEMP
symbol LLAMA = portb.4 'nombro el pin RB4 como LLAMA
symbol FLUJO = portb.5 'nombro el pin RB5 como FLUJO
symbol GAS = portb.0 'nombro el pin RB0 como GAS
symbol PILOT = portb.1 'nombro el pin RB1 como PILOT
symbol ALAR = portb.2 'nombro el pin RB2 como ALAR
INICIO: 'comienzo de programa
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =1 then 'pregunto si FLUJO es 1 si es cierto
pause 200 'pausa de 200 ms
goto PRENDER 'salto a PRENDER
else 'de lo contrario
goto inicio 'salto a inicio
endif 'fin del if
PRENDER: 'subrutina PRENDER
pause 1000 'pausa de 1 seg
IF temp = 0 THEN 'pregunto si TEMP es 0 si es cierto
GOTO ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =0 THEN 'pregunto si FLUJO es 0 si es cierto
GOSUB INICIO 'salto a INICIO
ENDIF 'fin del if
high GAS 'enciendo GAS
pause 500 'pausa de 500 ms
high PILOT 'enciendo PILOT
pause 500 'pausa de 500 ms
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin del if
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
goto APAGAR 'salto a APAGAR
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin de if
MANTENER: 'subrutina MANTENER
pause 500 'pausa de 500 ms
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin de if
pause 500 'pausa de 500 ms
if LLAMA and FLUJO =1 then 'pregunta si LLAMA y FLUJO son 1 si es cierto
gosub MANTENER 'salto a MANTENER de lo contrario
goto APAGAR 'salto a APAGAR
endif 'fin del if
APAGAR: 'subrutina de APAGAR
low GAS 'apago GAS
low PILOT 'apago PILOT
pause 5000 'pausa 500 ms
goto INICIO 'salto a inicio
ALARM: 'subrutina ALARM
low gas 'apago GAS
low piloT 'apago PILOT
goto LED 'salto a LED
LED: 'subrutina LED
high ALAR 'prendo ALAR
pause 100 'pausa de 100 ms
low ALAR 'apago ALAR
pause 100 'pausa de 100 ms
if TEMP =0 then 'pregunto TEMP es 0 si es cierto
gosub LED 'regreso a LED de lo contrario
goto INICIO 'salto a inicio
endif 'fin del if
goto inicio 'ir a inicio
end 'fin del programa
Mensaje automáticamente combinado:
Una breve descripción del funcionamiento del programa, al arrancar el programa, se supervisa la entrada TEMP que es un sensor de temperatura por interruptor térmico normalmente cerrado, colocando un 1 lógico en el pin RB.3, cuando es 0 lógico se activa la alarma y evita que siga prendido o que encienda el quemador, al abrir la llave (chorro, regadera) se activa el interruptor del del FLUJO de agua indicando el comienzo del trabajo de calentar, se activa la salida del GAS (electro válvula) y después de 200 ms se activa la salida de PILOT (generador de alta tención) y se enciende el quemador, luego de otra pausa se supervisa la entrada LLAMA la cual detecta que hay llama en el quemador, apagando la salida PILOT y se mantiene hasta que se cierre la llave abierta o que se apague la llama (agotarse el gas) o se elevo la temperatura max del calentador y halla activado el sensor TEMP.
Ya realizado el cambio o modificaciones al programa del PIC16F84A para compilarlo para el PIC12F629 no logro que funcione y el defecto está en los fuses de ese PIC.
Una de las fallas o error que presenta la simulación es que, no convierte el pin GP.3 en entrada y continúa siendo el pin del MCLR, tampoco se configura el oscilador interno.
Los fuses para los PIC y otros datos más, se encuentran en los archivos .inc
Por ejemplo, estos son los fuses para el PIC12F629:
Código:
; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG EQU H'2007'
;----- CONFIG Options --------------------------------------------------
_FOSC_LP EQU H'3FF8' ; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_LP_OSC EQU H'3FF8' ; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_FOSC_XT EQU H'3FF9' ; XT oscillator: Crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_XT_OSC EQU H'3FF9' ; XT oscillator: Crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_FOSC_HS EQU H'3FFA' ; HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_HS_OSC EQU H'3FFA' ; HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_FOSC_EC EQU H'3FFB' ; EC: I/O function on GP4/OSC2/CLKOUT pin, CLKIN on GP5/OSC1/CLKIN
_EC_OSC EQU H'3FFB' ; EC: I/O function on GP4/OSC2/CLKOUT pin, CLKIN on GP5/OSC1/CLKIN
_FOSC_INTRCIO EQU H'3FFC' ; INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_INTRC_OSC_NOCLKOUT EQU H'3FFC' ; INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_FOSC_INTRCCLK EQU H'3FFD' ; INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_INTRC_OSC_CLKOUT EQU H'3FFD' ; INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN
_FOSC_EXTRCIO EQU H'3FFE' ; RC oscillator: I/O function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_EXTRC_OSC_NOCLKOUT EQU H'3FFE' ; RC oscillator: I/O function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_FOSC_EXTRCCLK EQU H'3FFF' ; RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_EXTRC_OSC_CLKOUT EQU H'3FFF' ; RC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, RC on GP5/OSC1/CLKIN
_WDTE_OFF EQU H'3FF7' ; WDT disabled
_WDT_OFF EQU H'3FF7' ; WDT disabled
_WDTE_ON EQU H'3FFF' ; WDT enabled
_WDT_ON EQU H'3FFF' ; WDT enabled
_PWRTE_ON EQU H'3FEF' ; PWRT enabled
_PWRTE_OFF EQU H'3FFF' ; PWRT disabled
_MCLRE_OFF EQU H'3FDF' ; GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD
_MCLRE_ON EQU H'3FFF' ; GP3/MCLR pin function is MCLR
_BOREN_OFF EQU H'3FBF' ; BOD disabled
_BODEN_OFF EQU H'3FBF' ; BOD disabled
_BOREN_ON EQU H'3FFF' ; BOD enabled
_BODEN_ON EQU H'3FFF' ; BOD enabled
_CP_ON EQU H'3F7F' ; Program Memory code protection is enabled
_CP_OFF EQU H'3FFF' ; Program Memory code protection is disabled
_CPD_ON EQU H'3EFF' ; Data memory code protection is enabled
_CPD_OFF EQU H'3FFF' ; Data memory code protection is disabled
Y la palabra de configuración para el PIC12629 en PBPX >= 3.0, sería así:
@dafer ¿ Que programador/quemador usas ?... Lo pregunto porque muchos de ellos te permite "ajustar"/modificar la palabra de configuración. Por lo que, en vez de hacerlo en el programa, lo haces ahí. (No es lo mejor pero es otra opción que te puede sacar de apuros).
Ya que no has puesto el esquema con el PIC12f629, por las dudas, te advierto que el pin 4 (GPIO 3) no tiene resistencia de pull-up interna, ojo como usas ese pin.
Buen día foro, agradecido por la orientación darkbytes y switchxxi , la probare en la tarde y lo del pin GP.4 que funciona como MCLR siempre a menos que por los fuses se configure como entrada, y cuando les enviae al cod y el circuito con el pi12F629 ese detalle lo tome en cuenta.
mil gracias
Ser ignorante en algo, no te hace bruto a menos que nunca intentes saber mas de eso. DAFER
Buenas noches, saludos.
Acudo a este foro con la finalidad de interactuar con ustedes y lograr superar un inconveniente con un pic y su programa, el cual paso a describir así.
Tengo un calentador de agua a gas, al cual, se le dañó (quemó) la tarjeta de control.
Menciono que esta tarjeta quemada posee como elemento de control un PIC12C509.
Yo analicé el funcionamiento del aparato y diseñé un código en microcode pero basado en el PIC16F84A y funciona sin problema en la simulación de proteus.
El inconveniente se presenta por el tamaño de la tarjeta con el PIC16F84A, que no cabe en el espacio destinado en el calentador, sin menoscabar que sobran pines sin uso.
A partir de ahí, decido pasar previas modificaciones a un pic enano, el PIC12F629, dado a sus bondades, el proyecto necesita solo tres entradas y tres salidas y este pic me ofrece eso.
Ya realizado el cambio o modificaciones al programa del PIC16F84A para compilarlo para el PIC12F629 no logro que funcione y el defecto está en los fuses de ese PIC.
Una de las fallas o error que presenta la simulación es que, no convierte el pin GP.3 en entrada y continúa siendo el pin del MCLR, tampoco se configura el oscilador interno.
Sin más, muestro el código hecho para el PIC16F84A y la simulación en proteus.
Cabe destacar que está realizado en microcode studio
'* Version : 1.0 *
'* Notes : control calentador agua con pic 16f84a *
'* : *
'****************************************************************
'pic 16F84A
define osc 4 'defino frec osc en 4mhz
trisa=%00000 'configuro puerto A como salidas
trisb=%00111000 'configuro puerto RB0-RB2 salidas y RB3-RB5 entradas
portb=0 'inicializo las salidas a 0 logico
symbol TEMP = portb.3 'nombro el pin RB3 como TEMP
symbol LLAMA = portb.4 'nombro el pin RB4 como LLAMA
symbol FLUJO = portb.5 'nombro el pin RB5 como FLUJO
symbol GAS = portb.0 'nombro el pin RB0 como GAS
symbol PILOT = portb.1 'nombro el pin RB1 como PILOT
symbol ALAR = portb.2 'nombro el pin RB2 como ALAR
INICIO: 'comienzo de programa
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =1 then 'pregunto si FLUJO es 1 si es cierto
pause 200 'pausa de 200 ms
goto PRENDER 'salto a PRENDER
else 'de lo contrario
goto inicio 'salto a inicio
endif 'fin del if
PRENDER: 'subrutina PRENDER
pause 1000 'pausa de 1 seg
IF temp = 0 THEN 'pregunto si TEMP es 0 si es cierto
GOTO ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =0 THEN 'pregunto si FLUJO es 0 si es cierto
GOSUB INICIO 'salto a INICIO
ENDIF 'fin del if
high GAS 'enciendo GAS
pause 500 'pausa de 500 ms
high PILOT 'enciendo PILOT
pause 500 'pausa de 500 ms
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin del if
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
goto APAGAR 'salto a APAGAR
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin de if
MANTENER: 'subrutina MANTENER
pause 500 'pausa de 500 ms
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin de if
pause 500 'pausa de 500 ms
if LLAMA and FLUJO =1 then 'pregunta si LLAMA y FLUJO son 1 si es cierto
gosub MANTENER 'salto a MANTENER de lo contrario
goto APAGAR 'salto a APAGAR
endif 'fin del if
APAGAR: 'subrutina de APAGAR
low GAS 'apago GAS
low PILOT 'apago PILOT
pause 5000 'pausa 500 ms
goto INICIO 'salto a inicio
ALARM: 'subrutina ALARM
low gas 'apago GAS
low piloT 'apago PILOT
goto LED 'salto a LED
LED: 'subrutina LED
high ALAR 'prendo ALAR
pause 100 'pausa de 100 ms
low ALAR 'apago ALAR
pause 100 'pausa de 100 ms
if TEMP =0 then 'pregunto TEMP es 0 si es cierto
gosub LED 'regreso a LED de lo contrario
goto INICIO 'salto a inicio
endif 'fin del if
goto inicio 'ir a inicio
end 'fin del programa
Código:
'* Version : 1.0 *
'* Notes : control calentador agua con pic 16f84a *
'* : *
'****************************************************************
'pic 16F84A
define osc 4 'defino frec osc en 4mhz
trisa=%00000 'configuro puerto A como salidas
trisb=%00111000 'configuro puerto RB0-RB2 salidas y RB3-RB5 entradas
portb=0 'inicializo las salidas a 0 logico
symbol TEMP = portb.3 'nombro el pin RB3 como TEMP
symbol LLAMA = portb.4 'nombro el pin RB4 como LLAMA
symbol FLUJO = portb.5 'nombro el pin RB5 como FLUJO
symbol GAS = portb.0 'nombro el pin RB0 como GAS
symbol PILOT = portb.1 'nombro el pin RB1 como PILOT
symbol ALAR = portb.2 'nombro el pin RB2 como ALAR
INICIO: 'comienzo de programa
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =1 then 'pregunto si FLUJO es 1 si es cierto
pause 200 'pausa de 200 ms
goto PRENDER 'salto a PRENDER
else 'de lo contrario
goto inicio 'salto a inicio
endif 'fin del if
PRENDER: 'subrutina PRENDER
pause 1000 'pausa de 1 seg
IF temp = 0 THEN 'pregunto si TEMP es 0 si es cierto
GOTO ALARM 'salto a ALARM
endif 'fin del if
if FLUJO =0 THEN 'pregunto si FLUJO es 0 si es cierto
GOSUB INICIO 'salto a INICIO
ENDIF 'fin del if
high GAS 'enciendo GAS
pause 500 'pausa de 500 ms
high PILOT 'enciendo PILOT
pause 500 'pausa de 500 ms
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin del if
if LLAMA = 0 then 'pregunto si LLAMA es 1 si es cierto
pause 1000 'pausa de 1 seg
goto APAGAR 'salto a APAGAR
else 'de lo contrario
low PILOT 'apago PILOT
goto MANTENER 'salto a MANTENER
endif 'fin de if
MANTENER: 'subrutina MANTENER
pause 500 'pausa de 500 ms
if TEMP = 0 then 'pregunto si TEMP es 0 si es cierto
goto ALARM 'salto a ALARM
endif 'fin de if
pause 500 'pausa de 500 ms
if LLAMA and FLUJO =1 then 'pregunta si LLAMA y FLUJO son 1 si es cierto
gosub MANTENER 'salto a MANTENER de lo contrario
goto APAGAR 'salto a APAGAR
endif 'fin del if
APAGAR: 'subrutina de APAGAR
low GAS 'apago GAS
low PILOT 'apago PILOT
pause 5000 'pausa 500 ms
goto INICIO 'salto a inicio
ALARM: 'subrutina ALARM
low gas 'apago GAS
low piloT 'apago PILOT
goto LED 'salto a LED
LED: 'subrutina LED
high ALAR 'prendo ALAR
pause 100 'pausa de 100 ms
low ALAR 'apago ALAR
pause 100 'pausa de 100 ms
if TEMP =0 then 'pregunto TEMP es 0 si es cierto
gosub LED 'regreso a LED de lo contrario
goto INICIO 'salto a inicio
endif 'fin del if
goto inicio 'ir a inicio
end 'fin del programa
Mensaje automáticamente combinado:
Una breve descripción del funcionamiento del programa, al arrancar el programa, se supervisa la entrada TEMP que es un sensor de temperatura por interruptor térmico normalmente cerrado, colocando un 1 lógico en el pin RB.3, cuando es 0 lógico se activa la alarma y evita que siga prendido o que encienda el quemador, al abrir la llave (chorro, regadera) se activa el interruptor del del FLUJO de agua indicando el comienzo del trabajo de calentar, se activa la salida del GAS (electro válvula) y después de 200 ms se activa la salida de PILOT (generador de alta tención) y se enciende el quemador, luego de otra pausa se supervisa la entrada LLAMA la cual detecta que hay llama en el quemador, apagando la salida PILOT y se mantiene hasta que se cierre la llave abierta o que se apague la llama (agotarse el gas) o se elevo la temperatura max del calentador y halla activado el sensor TEMP.