Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Hola. Esta vez tengo problemas en sumar números con punto flotante; y es que PROTON parece que no hace la suma o no se hacerla.
Estoy haciendo esto:
Dim VOLT As Float
Dim VOLTUP As Float
VOLT = ADIn 0
DelayUS 50
VOLT = VOLT / 204.8
VOLTUP = VOLT + 0.4
Digamos que VOLT/204 tiene como resultado 1.6 y le sumo 0.4 seria igual a VOLTUP = 2.0
Luego hago esto:
If VOLT < VOLTUP Then GoTo STAND_BY
If VOLT > VOLTUP Then GoTo POWER_ON
Como se ve VOLT (1.6) es menor que VOLTUP (2.0) y debería ir a la rutina STAND_BY, pero no lo hace y se va a POWER_ON.
Pero si lo hago así, entonces si funciona:
If VOLT < 2.0 Then GoTo STAND_BY
If VOLT > 2.0 Then GoTo POWER_ON
¿Porque?... de antemano muchas gracias por la ayuda.
Dim VoltP As Word
Dim VOLT As Float
Dim VOLTUP As Float
VoltP = ADIn 0
DelayUS 50
VOLT = VoltP / 204.8
VOLTUP = VOLT + 0.4
If VOLT < VOLTUP THEN
GoTo STAND_BY
Else
GoTo POWER_ON
ENDIF
La variable VOLT debe ser del tipo Byte si es que se usa el ADC a 8 bits. (0 a 255)
Y debe ser del tipo Integer si es que el ADC va a 10 bits. (0 a 1023)
Así que no tiene sentido que sea Float.
Mejor haz esto ya con VOLT como Integer:
VOLT = ADIn 0
VOLTUP = (VOLT / 204.8) + 0.4
De que se puede se puede, pero no tiene sentido y es un desperdicio de memoria.¿No se puede usar float para guardar el valor del ADC a 10 bits?
Eso es porque no estás haciendo bien las cosas.
Adjunto un ejemplo.
¿No se puede usar float para guardar el valor del ADC a 10 bits? pero es que necesito los decimales.
Pero probare a ver que pasa. Muchas gracias.
Si, debe ser porque no he explicado lo que debe hacer el programa.
Se trata de hacer un circuito que desconecte un electrodoméstico, cuando este se encuentre en Standby,
con el fin de "ahorrar energía" y proteger el mismo.
Hago las pruebas con un televisor, el cual en standby me da un voltaje de 1.6v rectificados y 2.6v encendido, los cuales llevo
al ADC del micro (12f683).
Para ello están las 2 variables VOLT y VOLTUP. En la primera guardo el valor de 1.6v y creo un umbral sumando 0.4v para que la otra
variable sea mayor, dando como resultado = 2.0v
Cuando el TV esta en standby, el programa espera 1 minuto y a la vez revisa el ADC por si aumenta el voltaje (para saber que el tv se encendió en medio de la espera) si no enciende, el RELE se desconecta y el TV queda sin energía.
Para reactivar todo, el programa queda en una rutina donde se lee un botón del control remoto; si este se presiona
el micro energiza el tv y se repite el ciclo nuevamente.
Cuando el televisor enciende, VOLT pasa de 1.6v a 2.6v superando a VOLTUP (2.0V) y el programa mantiene el RELE conectado.
En este momento lo tengo funcionando perfectamente, pero si le pongo valores fijos. Lo de usar las variables es porque, el micro
ajustaría automáticamente el umbral al que debe trabajar, pues no es el mismo en todos los electrodomésticos.
Si dejo los valores fijos en el programa, tendría que ajustar el umbral para cada aparato ... lo cual seria muy incomodo y poco practico.
Gracias por el ejemplo, pero tampoco funciono.![]()
Dim Volt as Word
......
......
Volt= ADIn 0
If Volt <= 409 then STANBY
......
......
Device = 16F1827
Reminders 0
Config1 FOSC_HS,WDTE_OFF,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,BOREN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_OFF,PLLEN_OFF,STVREN_OFF,LVP_OFF, 'FOSC_INTOSC
Reminders 1
Xtal 10
PortB_Pullups = OFF
'****************************************************************
'All_Digital = TRUE
TRISA = %00000000
TRISB = %00000000
OSCTUNE = %00000000
'OSCCON = %01101000 '4 Mhz
CM1CON0 = %00000000
CM1CON1 = %00000000
CM2CON0 = %00000000
CM2CON1 = %00000000
APFCON0 = %00000000
APFCON1 = %00000000
'**************************************************************
'ADC
Adin_Res = 10
Adin_Tad = FRC
Adin_Stime = 50
FVRCON = %10000001 '1.024V
ADCON0 = %00000000
ADCON1 = %11110011'Vref interno
'****************************************************************
'DISPLAY LCD
LCD_DTPin = PORTB.4
LCD_RSPin = PORTB.2
LCD_ENPin = PORTB.3
LCD_Interface = 4
LCD_Lines = 2
LCD_Type = 0
'****************************************************************
'SENSOR CAPACITIVO
CPSCON0 = %00000000
CPSCON1 = %00000000
'****************************************************************
'ALIAS
Symbol LED = PORTB.0
'****************************************************************
Cls
DelayMS 100
MAIN:
Print At 1,1,"PRUEBA DISPLAY"
Print At 2,1,"PIC 16F1827 "
High LED
DelayMS 200
Low LED
DelayMS 200
GoTo MAIN
End
Adivinando por que no subiste la simulación y como esta el codigo no compila por que no usaste Declare antes de algunas declaraciones como las del LCD, etc seguramente te comiste llevar el MCLR a +B y lo tienes declarado en los fusibles que lo usas.
Después de las correcciones a tu codigo a mi me funciona en Proteus 7.9
Device = 16F1827
Reminders 0
Config1 FOSC_HS,WDTE_OFF,PWRTE_ON,MCLRE_ON,CP_OFF,CPD_OFF,BOREN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_OFF,PLLEN_OFF,STVREN_OFF,LVP_OFF, 'FOSC_INTOSC
Reminders 1
Xtal 10
PortB_Pullups = OFF
'****************************************************************
'All_Digital = TRUE
TRISA = %00000000
TRISB = %00000000
OSCTUNE = %00000000
'OSCCON = %01101000 '4 Mhz
CM1CON0 = %00000000
CM1CON1 = %00000000
CM2CON0 = %00000000
CM2CON1 = %00000000
APFCON0 = %00000000
APFCON1 = %00000000
'**************************************************************
'ADC
Declare Adin_Res = 10
Declare Adin_Tad = FRC
Declare Adin_Stime = 50
FVRCON = %10000001 '1.024V
ADCON0 = %00000000
ADCON1 = %11110011'Vref interno
ANSELA = %00000000
ANSELB = %00000000
'****************************************************************
'DISPLAY LCD
Declare LCD_DTPin = PORTB.4
Declare LCD_RSPin = PORTB.2
Declare LCD_ENPin = PORTB.3
Declare LCD_Interface = 4
Declare LCD_Lines = 2
Declare LCD_Type = 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs = 50
'****************************************************************
'SENSOR CAPACITIVO
CPSCON0 = %00000000
CPSCON1 = %00000000
'****************************************************************
'ALIAS
Symbol LED = PORTB.0
'****************************************************************
Cls
DelayMS 100
MAIN:
Print At 1,1,"PRUEBA DISPLAY"
Print At 2,1,"PIC 16F1827 "
High LED
DelayMS 200
Low LED
DelayMS 200
GoTo MAIN
End
Con All_Digital = TRUE ya lo tenías resuelto, pero comentaste esa instrucción.Faltaba configurar los registros ANSELA y ANSELB ya que en este PIC el puerto B es
también análogo y digital
Si, es cierto ... igual lo de ANSELB me hubiese dado problemas después. GraciasCon All_Digital = TRUE ya lo tenías resuelto, pero comentaste esa instrucción.
La variable VOLT debe ser del tipo Byte si es que se usa el ADC a 8 bits. (0 a 255)
Y debe ser del tipo Integer si es que el ADC va a 10 bits. (0 a 1023)
Así que no tiene sentido que sea Float.
Mejor haz esto ya con VOLT como Integer:
VOLT = ADIn 0
VOLTUP = (VOLT / 204.8) + 0.4
'********************************************
'Para eliminar el pico de corriente al inicio
DelayMS 300
High RELE
For CUENTAS = 0 To 11
DelayMS 1000
Next
Clear CUENTAS
'********************************************
CAPTURA:
For CUENTAS = 0 To 9
VOLT = ADIn 0
DelayUS 50
ACUMVOLT = ACUMVOLT + VOLT
Next
ACUMVOLT = ACUMVOLT / 10
ACUMVOLT = ACUMVOLT / 204.8
VOLTUP = ACUMVOLT + 0.300
Clear CUENTAS
Clear ACUMVOLT
Clear VOLT
Device = 12F1822
Reminders = OFF
Config1 FOSC_INTOSC,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_OFF,PLLEN_OFF,STVREN_OFF,LVP_OFF
Reminders = On
Xtal 4
'*********************************************
'DECLARACIONES
'*********************************************
Declare Adin_Res = 10 'Resolución ADC=10 bits
Declare Adin_Stime = 50
'****************************************
'CONFIGURACION DE REGISTROS
'***************************************
OSCCON = %01101010 ' 4mhz Osc interno.
OSCTUNE = %00000000
CM1CON0 = %00000000 'Comparador apagado
CM1CON1 = %00000000
PIE1 = %00000000
PIE2 = %00000000
PIR1 = %00000000
PIR2 = %00000000
PORTA = %00001011 '0,1,3 como entradas
ANSELA = %00000011 '0,1 entradas analogas
ADCON0 = %00000011
ADCON1 = %10110011 'FRC
FVRCON = %10000011 'VREF = 4.096V
WDTCON = %00000000 'Watchdog timer
DACCON0 = %00000000
DACCON1 = %00000000
T1CON = %00000000
CPSCON0 = %00000000
CPSCON1 = %00000000
SRCON0 = %00000000
SRCON1 = %00000000
APFCON = %00000000
BAUDCON = %00000000
LATA = %00000000
WPUA = %00000000
OPTION_REG = %10000000
INTCON = %00000000
No entiendo para qué configuras tantos registros que no vas a utilizar.
Si únicamente quieres usar el ADC, configura nada más los registros involucrados.
Así se use o no el ADC, cuando un pin es configurado como entrada, el voltaje que aparezca en él es debido a un factor externo.