desktop

Curso de programación de PIC en PICBasic Pro

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 :cry: ... 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
 
Hace un tiempo alguien compartió en este tópico un dimmer. Lo estoy buscando y no lo encuentro. Alguien se acuerda quien lo compartió?

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.

Cordial saludo.

Juan Camilo Cardona

Hola torres!
Yo postee este dimmer hace algún tiempo.
 
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.
En este mismo tema compartieron hace un tiempo un ejemplo de contador con TOKI
 
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
 

Adjuntos

  • IIC_LCD_PBP3.zip
    20.1 KB · Visitas: 15
  • PCF8574_LCD_PBP260.zip
    18.5 KB · Visitas: 21
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.
M
i problema es que no se como hacer funcionar el de temperatura, no se como va programado.
 
Puedes conectar una resistencia adicional como divisor de tension para que tu uC pueda leer el valor analógico.
Gracias, y en la programación como sería para que me de las lecturas en grados centígrados ?

E
n la hoja de datos me aparece ésto pero hasta aquí estoy atorado de como leer los datos.

Table 6: 10K NTC B.3435 temperature and resistance correspondence table

Temperature(℃)01020304050607080
Resistance(kΩ)27.9018.2212.128.315.804.123.002.211.66
 
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
 
Disculpa pero así no se entiende nada.

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.
 
Disculpa pero así no se entiende nada.

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

1614306568818.png

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.
 
Última edición:
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í:

Código:
; Palabra de configuración:
#Config
    __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _PWRTE_ON
#EndConfig
 
@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
Mensaje automáticamente combinado:

disculpen se me olvidaba uso microcode studio, pickit2 y quemador DT2090 por usb.
 
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

Ver el archivo adjunto 262955

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.
podrias optmizar varias lineas con el comando "while" y hasta quizas con un timmer para verificar temperatura.
 
Atrás
Arriba