Curso de programación de PIC en PICBasic Pro

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:

D@rkbytes

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

torres.electronico

Well-known-Alfil
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.
 
Buenas noches foro, coloque la palabra de configuración y aun sin compilar, me da error, indicando que hay ERROR SINTAXIS (syntax error), sigo haciendo pruebas ye intentos, al amigo torres le comento buena opción pero no aplicable a mi proyecto con el 12F629 que carece de entradas analógicas.

Sé perseverante con tus objetivos y flexible con tus métodos.
 
¿ Cual sería el error que da el compilador ? ¿ Probaste tal cual como te dijo D@rkbytes ? Por lo que leí, las palabras de configuración deben estar en mayúsculas "_wdt_off" no es lo mismo que "_WDT_OFF", revisa si no viene por ahí el problema.

el 12F629 que carece de entradas analógicas.

Ojo con esa asunción, el 12f629 si que tiene entradas análogas. No te olvides del comparador análogo que deberás apagar si es que el compilador no lo hace, no manejo ese lenguaje.
 

torres.electronico

Well-known-Alfil
Buenas noches foro, coloque la palabra de configuración y aun sin compilar, me da error, indicando que hay ERROR SINTAXIS (syntax error), sigo haciendo pruebas ye intentos, al amigo torres le comento buena opción pero no aplicable a mi proyecto con el 12F629 que carece de entradas analógicas.

:facepalm:Tenes razón, hable pensando en el el 675 :p Igualmente, antes que nada, te recomiendo que leas estos dos hilos por las dudas:

:tu: No me anda GPIO.0 en pic 12f629 con pbp

:tu: No me anda GPIO.0 en pic 12f629 con pbp

En fin; Ahi lo manoseé un poco lo que tenias; En un rato armo algo en proteus y te comento si funcionó


;@ DEVICE PIC12F629
;@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF

DEFINE OSC 4 ; Definir que se trabajará con 4MHz.

CMCON = 7 ; Comparadores analógicos OFF
TRISIO = %1111000 ; Solo GP1 como salida

symbol TEMP = GPIO.3 'nombro el pin RB3 como TEMP
symbol LLAMA = GPIO.4 'nombro el pin RB4 como LLAMA
symbol FLUJO = GPIO.5 'nombro el pin RB5 como FLUJO

symbol GAS = GPIO.0 'nombro el pin RB0 como GAS
symbol PILOT = GPIO.1 'nombro el pin RB1 como PILOT
symbol ALAR = GPIO.2 'nombro el pin RB2 como ALAR

GPIO.0 = 0 : GPIO.1 = 0 : GPIO.2 = 0

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
 
Buenos días foro, lo sugerido por por switcxxi lo tome en cuenta y aun no trabaja, lo expuesto por torres de igual forma lo sometí a mi programa y aun sin funcionar, con respecto a darkbyte, actualice el pbp a versión 3.7 y si compilo pero no trabaja bien, sigo intentando haciendo pruebas, he leído y estudiado libros de pic Basic y parece mentira no sale nada acerca del uso y programa de los pic enanos
Agrego foto de mi quemador de pic atendiendo a la sugerencia de switchxxi
 

Adjuntos

  • IMG_20210302_074404.jpg
    IMG_20210302_074404.jpg
    346.4 KB · Visitas: 7
  • IMG_20210302_074404.jpg
    IMG_20210302_074404.jpg
    346.4 KB · Visitas: 8

torres.electronico

Well-known-Alfil
Miraste eh hiciste lo que dice esos dos links? Yo armé en proteus lo que creí entenderte y simule; No presté mucha atención y lo hice rápido, pero parecía funcionar. Querés que te pase el hex?
 
Arriba