Buenas amigo. Necesito una ayuda de una lectura que me tiene loco.
Estoy programando en ccs compiler un programa para un cotrol de temperaturas de un horno y una llama. Pero tengo el problema que las mediciones de las llama son de un maximo de 1000°C y la medicion es muy rapida asi que una vez que lo muestra en el LCD no se logra ver bien como en el tester externo donde si logro ver bien, ya que cambia los grado cada unos 500ms y la lectura va saltando. La otra es que tengo el problema de que en el canal AN0 mido una temperatura de 500°C maximo pero lo necesito con precision y e visto que se habla de tomar varias medidas y sacar la mas compleja a la medida correcta.
Lo que necesito es que me corrijan como puedo hacer que las lectura sean mas lenta como de unos 500ms pero sin afectar el demas programa ya que con un delay lo estavilizo biem pero entonces los pulsadores lo tengo que pisar durante ese tiempo.
La otra es como puedo tomar varias muestra de una lectura como dicen en otros foros de tomar unas 100 lecturas luego las compara y muestra la mas conclusa.
Aca les dejo una parte del programa para que lo vean y me echen la mano.
#include <16f876.h>
#device adc=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <internal_eeprom.c>
#include <LCD_portb.c>
#include <math.h>
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05
#define up PIN_A2
#define down PIN_A3
#define up1 PIN_A4
#define down1 PIN_A5
#define ph PIN_C0
#define th PIN_C1
void main() {
int16 q;
float cupla_pcb,cupla_gpu,pre,top,c1,c2;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
pre=read_float_eeprom(0x00);
top=read_float_eeprom(0x04);
while (TRUE){
set_adc_channel(0);
delay_ms(5);
q = read_adc();
c1 = 5.0 * t1 / 1023.0;
cupla_pcb = c1 * 200.0;
lcd_gotoxy(1,1);
printf(lcd_putc, "T=%01.0fC ", cupla_pcb);
set_adc_channel(1);
delay_us(100);
q = read_adc();
c2 = 5.0 * q / 1023.0; // Pasa binario a °C
cupla_gpu = c2 * 100;
lcd_gotoxy(10,1);
printf(lcd_putc, "T=%01.0fC ", cupla_gpu);
if(!input(up)){
delay_ms(10);
if(pre>=200)
pre=200;
else
pre+=1; }
if(!input(down)){
delay_ms(10);
if(pre<=90)
pre=90;
else
pre-=1;}
if(!input(up1)){
delay_ms(10);
if(top>=320)
top=320;
else
top+=1; }
if(!input(down1)){
delay_ms(10);
if(top<=130)
top=130;
else
top-=1;}
if(cupla_pcb>=pre){
output_low(ph); }
if(cupla_pcb<=pre){
output_high(ph); }
if(cupla_gpu>=top){
output_low(th); }
if(cupla_gpu<=top){
output_high(th); }
if(cupla_gpu<=130.0){
output_low(th); }
if(!input(up)){
output_high(buzer);
delay_ms(200);
output_low(buzer);}
lcd_gotoxy(1,2);
printf(lcd_putc, "A=%01.0fC ", pre);
write_float_eeprom(0x00, pre);
lcd_gotoxy(10,2);
printf(lcd_putc, "A=%01.0fC ", top);
write_float_eeprom(0x04, top);
}
}
Estoy programando en ccs compiler un programa para un cotrol de temperaturas de un horno y una llama. Pero tengo el problema que las mediciones de las llama son de un maximo de 1000°C y la medicion es muy rapida asi que una vez que lo muestra en el LCD no se logra ver bien como en el tester externo donde si logro ver bien, ya que cambia los grado cada unos 500ms y la lectura va saltando. La otra es que tengo el problema de que en el canal AN0 mido una temperatura de 500°C maximo pero lo necesito con precision y e visto que se habla de tomar varias medidas y sacar la mas compleja a la medida correcta.
Lo que necesito es que me corrijan como puedo hacer que las lectura sean mas lenta como de unos 500ms pero sin afectar el demas programa ya que con un delay lo estavilizo biem pero entonces los pulsadores lo tengo que pisar durante ese tiempo.
La otra es como puedo tomar varias muestra de una lectura como dicen en otros foros de tomar unas 100 lecturas luego las compara y muestra la mas conclusa.
Aca les dejo una parte del programa para que lo vean y me echen la mano.
#include <16f876.h>
#device adc=10
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <internal_eeprom.c>
#include <LCD_portb.c>
#include <math.h>
#BYTE TRISA = 0x85
#BYTE PORTA = 0x05
#define up PIN_A2
#define down PIN_A3
#define up1 PIN_A4
#define down1 PIN_A5
#define ph PIN_C0
#define th PIN_C1
void main() {
int16 q;
float cupla_pcb,cupla_gpu,pre,top,c1,c2;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
pre=read_float_eeprom(0x00);
top=read_float_eeprom(0x04);
while (TRUE){
set_adc_channel(0);
delay_ms(5);
q = read_adc();
c1 = 5.0 * t1 / 1023.0;
cupla_pcb = c1 * 200.0;
lcd_gotoxy(1,1);
printf(lcd_putc, "T=%01.0fC ", cupla_pcb);
set_adc_channel(1);
delay_us(100);
q = read_adc();
c2 = 5.0 * q / 1023.0; // Pasa binario a °C
cupla_gpu = c2 * 100;
lcd_gotoxy(10,1);
printf(lcd_putc, "T=%01.0fC ", cupla_gpu);
if(!input(up)){
delay_ms(10);
if(pre>=200)
pre=200;
else
pre+=1; }
if(!input(down)){
delay_ms(10);
if(pre<=90)
pre=90;
else
pre-=1;}
if(!input(up1)){
delay_ms(10);
if(top>=320)
top=320;
else
top+=1; }
if(!input(down1)){
delay_ms(10);
if(top<=130)
top=130;
else
top-=1;}
if(cupla_pcb>=pre){
output_low(ph); }
if(cupla_pcb<=pre){
output_high(ph); }
if(cupla_gpu>=top){
output_low(th); }
if(cupla_gpu<=top){
output_high(th); }
if(cupla_gpu<=130.0){
output_low(th); }
if(!input(up)){
output_high(buzer);
delay_ms(200);
output_low(buzer);}
lcd_gotoxy(1,2);
printf(lcd_putc, "A=%01.0fC ", pre);
write_float_eeprom(0x00, pre);
lcd_gotoxy(10,2);
printf(lcd_putc, "A=%01.0fC ", top);
write_float_eeprom(0x04, top);
}
}