Primero agradecer su amabilidad, voluntad y tiempo entregado a sus respuestas, pedir disculpas por tomar su ejemplo y cortarlo para hacer las consultas, solo dejo las interrogantes (obviamente esperando su respuestas)
Pues según veo, casi no comprendiste nada sobre lo que hace el programa.
Trataré de explicar las dudas que tienes respecto a las funciones del programa.
#device adc = 10 // ADC a 10 bits aquí tenía un error
Esta sentencia es la que le dice al compilador que se va a usar el conversor ADC a 10 Bits.
Si te arroja un error, lo más seguro es que tengas que actualizar la versión que estás usando.
#define t_min_decr pin_b7 aquí define la entrada haber omitido y solo preguntar luego si es verdadera esta entrada
while (true)
{
if(input(pin_b7))
{
--temp_min; // Decrementa temperatura mínima.
if(temp_min > temp_sens){temp_min = 0;}
#define t_min_incr pin_b6 idem a anterior
#define t_max_decr pin_b5 idem a anterior
#define t_max_incr pin_b4 idem a anterior
#define calefactor pin_c1 aqui solo activala salida como pin
Son definiciones (En este caso para darle nombres a los pines)
Si no te gusta trabajar de esa manera, los puedes omitir y usar directamente el nombre de los pines.
{
output_high(pin_c1); es lo mismo???
delay_ms(100);
#define ventilador pin_c0 iedm anterior
#define temp_sens 149 por que 149, es por la cuenta max 150????
Como te mencioné anteriormente, es resultado será el mismo si usas la definición o el nombre del pin.
Se pone un número menos (149) porque en la comparación se usa el operador >
Así que, si se pone como referencia 150 entonces un número mayor que 150 será 151
int16 adc_corte;esto es corte eléctrico y es por ausencia de voltaje, ¿pero cómo hace para que el pic siga energizado? buena muy buena idea
El microcontrolador se mantiene con energía debido a que se está usando un capacitor de 4700uF (Mirar esquema)
Este capacitor de alto valor mantendrá energizado al PIC el tiempo suficiente para realizar la operación de escritura en la EEPROM interna.
La referencia por corte eléctrico se deberá tomar por medio de un diodo antes del filtraje de la fuente de poder.
Esto es para que la falta de energía sea detectada cuando ocurre, y como el PIC aún tendrá energía, podrá realizar la detección por corte eléctrico.
int8 round_temp8,temp_min,temp_max;esto es para trabajar las variables
float valor_adc,temperatura;
port_b_pullups(true); ¿A qué se refiere esto, no lo había visto antes?
temp_min = read_eeprom(0);ok, este es el valor que debe aparecer en lcd, después del corte
temp_max = read_eeprom(1);ok idem anterior
Así es, esas variables son las que determinan el rango de temperatura establecida por el usuario.
port_b_pullups(true); Sirve para activar las resistencias pull-up internas del puerto B
Esto es con la finalidad de no colocar resistencias externas y usar las que tiene el PIC internamente.
Por este motivo, en las sentencias
IF se usó el operador
! que sirve para establecer una negación lógica.
Osea; en vez de escribir
if(input(pin_xx ==0)) tan sólo se escribe
if(!input(pin_xx))
En ambas sentencias se realiza la misma operación pero sintetiza la escritura.
temp_min = read_eeprom(0);ok, este es el valor que debe aparecer en lcd, después del corte
temp_max = read_eeprom(1);ok idem anterior
Eso ya será una modificación que tengas que hacer a tu programa.
if(temp_min > temp_sens){temp_min = 36;} aquí pre fija la temp inicial después del corte yo pretendo hacerlo que ante un reinicio o corte tome el valor de memoria
if(temp_max > temp_sens){temp_max = 38;} idem a anterior
Y eso es lo que aquí se está realizando.
Pero aquí el programa está verificando también algo importante.
Cuando una memoria está sin grabar (Virgen) sus locaciones tienen el valor 0xFF (255 en decimal)
Si se realiza la primer lectura y se toma el 255 como valor, éste será mostrado en pantalla, y como la lectura máxima es de 150°C no tendrá lógica mostrar un valor de 255.
Así que, aquí se está comprobando que la lectura nunca supere 149 (Una incubadora nunca llegará a ese valor)
--temp_min; este valor debe ser guardado en memoria
if(temp_min > temp_sens){temp_min = 0;} ¿Para qué es esto, si según mi programa debería aparecer el último seteo de temp guardado?
Es decir
write_eeprom(0,temp_min); ¿Está bien esto?
Eso también será parte de las modificaciones que tendrás que realizar.
temperatura = ((valor_adc *150)/308); ¿Por qué estos valores? ¿No lo hace directamente el lm35?
Esa es la fórmula que yo usé, tú puedes utilizar la que creas más conveniente.
150 es la temperatura máxima del LM35 y 308 es la lectura del ADC a 10 bits cuando el LM35 está a 150°C
El LM35 entrega 10mV por cada grado centígrado y se tiene obviamente que usar una formula para obtener una lectura correcta.
Aquí te recomiendo que estudies sobre el
funcionamiento del ADC para comprender porqué no podrás hacer comparaciones de 0.1 en 0.1
a 10 bits.
--temp_min; este valor debe ser guardado en memoria
if(temp_min > temp_sens){temp_min = 0;} para que es esto, si según mi programa debería aparecer la última seteo de temp guardado
es decir
write_eeprom(0,temp_min); está bien esto
Eso también será parte de las modificaciones que tendrás que realizar.
round_temp8 = temperatura; ¿Aquí convierte la variable int8 a flotante ?
Nop, aquí se toma el valor entero de un resultado con punto flotante.
round_temp8 (8 bits) Sirve para realizar las comparaciones y obtener el valor que será guardado en la memoria.
adc_corte = read_adc(); // Leer el canal 3 para sensar corte eléctrico.
if(adc_corte <= 850) por que este valor
{
Es el valor de referencia de lectura del ADC cuando el voltaje de corte sea aproximadamente 4.1V.
Este valor es el que debes determinar para establecer a que voltaje ocurrirá el evento de corte eléctrico.
Mira bien el esquema y la simulación para que tengas una idea sobre esto.
Ahí se incluye un voltímetro sobre este voltaje para que puedas darte una idea.
Espero pueda comprender mis dudas, quiero interpretar primero su programa para luego hacer el mio, ya que empezaré todo de nuevo pero ordenado y bien definido
Juka
Claro que entiendo pues apenas estás empezando con este lenguaje después de haber pasado por FlowCode.
Es mejor que te hayas decidido por dejar eso y en verdad aprender un lenguaje de programación.
Ahora espero que yo me haya dado a entender y puedas comprender que es lo que está realizando ese programa.
Suerte.