Buenas estoy realizando un medidor de temperatura con max6675 la lectura es correcta en cuanto a medicion se refiere el tema es la sincronizacion de los datos en la simulacion no se nota ya que subo cada 0.25grados
pero no logro sincronizar los valores en pantalla probe con el timer1 para aumentarle la velocidad.
Noté que cuando aumento la temperatura en la termocupla de manera brusca los valores llegan no sincronizados habra alguna manera de detectar cambios
de temperatura y de manera automatica, aumente la velocidad de timer quedando sincronizadas
este es el codigo
adjunto los archivos simulacion en proteus y codigo con pic c compiler
pero no logro sincronizar los valores en pantalla probe con el timer1 para aumentarle la velocidad.
Noté que cuando aumento la temperatura en la termocupla de manera brusca los valores llegan no sincronizados habra alguna manera de detectar cambios
de temperatura y de manera automatica, aumente la velocidad de timer quedando sincronizadas
este es el codigo
Código:
#INCLUDE <16F887.H> //PIC utilizado
#DEVICE ADC = 10
#INCLUDE <MATH.H> //Libreria con funciones matematicas
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //
#FUSES NOPUT //No Power Up Timer
#FUSES PROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used FOR I/O
#FUSES CPD //No EE protection
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, parity=n, bits=8, stop=1)
#bit Chip_Select=0x07.0 //RC0=Chip_Select
//#bit Chip_Select_Direccion=0x87.0 //TRISA.0=Chip_Select_Direccion
int16 Data;
short EstadoTKP; //estado de la Termocuple, abierto o cerrado
float temp;
int t[9]=0,0,0,0,0,0,0,0,0;
#define t1 t[0]
#define t2 t[1]
#define t3 t[2]
#define t_seg t[3]
#define t_sog t[4]
#define t_log t[5]
#define t_deseado1 t[6]
#define t_deseado2 t[7]
#define t_deseado3 t[8]
#INT_TIMER1
void TIMER1_isr(void)
{
t1++; // Contador para funcion pulsadores
t2++; // Contador para lectura de termocupla
t3++;
if(t1==1){ // Si la interrupcion se activo 154 veces
t_seg++; // paso 1 segundo
t1=0; // Reinicio el contador
}
if(t2==1){ // Si la interrupcion se activo 154 veces
t_sog++; // paso 1 segundo
t2=0; // Reinicio el contador
}
if(t3==1){ // Si la interrupcion se activo 154 veces
t_log++; // paso 1 segundo
t3=0; // Reinicio el contador
}
}
void InitMain()
{
setup_adc_ports(sAN0 | sAN1 | sAN2);
setup_adc(ADC_CLOCK_DIV_8);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); // modo de trabajo
setup_timer_2(T2_DISABLED,0,1);
enable_interrupts(int_TIMER1);
enable_interrupts(GLOBAL); //Habilita interrupciones
t_deseado1=3; // Establezco el timer en 3.
Chip_Select=1; //Deshabilito el SPI en el DAC mediante RC0, Pulso de seleccion de esclavo en alto
//Chip_Select_Direccion=0; //Pin RC0 como salida
set_tris_c(0x10);
setup_spi(SPI_MASTER|SPI_L_TO_H | SPI_XMIT_L_TO_H|SPI_CLK_DIV_4); //th>=100ns,tl>=100ns, Tp=10MHz/4=0.4us=200ns
}
void ADC_Input()
{
if(t_seg>=t_deseado1){
char DataHigh, DataLow;
Chip_Select=0;
delay_us(20);
//Recibe el byte mas significativo y menos significativo
DataHigh=spi_read(0);
DataLow=spi_read(0);
Chip_Select=1;
Data=make16(DataHigh,DataLow);
Data=Data>>2;
EstadoTKP=Data & 0x01;
Data=Data>>1;
temp=Data*0.25; //12bits, resolucion 0.25°C
printf("Temp: %f \r\n",temp); //muestro la temperatura actual por uart
t1=0; //Contadores de timer timer1_t1 a 0.
t_seg=0;
}
}
void main()
{
InitMain();
while(TRUE)
{
ADC_Input();
}
}
adjunto los archivos simulacion en proteus y codigo con pic c compiler
Adjuntos
Última edición: