TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: karpic en 09 de Febrero de 2008, 20:42:05
-
Con este código no me funciona
while(true)
{
V=read_float_eeprom(20);
X=250;
Y=300;
IF (contador == X){
OUTPUT_HIGH(PIN_A2);
}
IF (contador == Y){
OUTPUT_LOW(PIN_A2);
contador = 0;
}
Y con este otro si
while(true)
{
IF (contador == 250){
OUTPUT_HIGH(PIN_A2);
}
IF (contador == 300){
OUTPUT_LOW(PIN_A2);
contador = 0;
}
le asigno variables por que necesito variar el tiempo en el que se activa el pinA2.
Alguien me puede decir el porque no me funciona o darme otra solución.
-
Si se te queda siempre en High puede ser por el tipo de variable que hayas definido Contador, X ó Y, si son Int8 solo pueden alcanzar 8 bits, o sea 255 y no controlaras nunca el valor de 300 ... Si es así debes declararlas como Int16. V no lo usas ¿No?.
-
Si es asi se queda en high, V no la he puesto para no liar, pero es con la que pretendo controlar el tiempo. las variables las tengo como float.
-
El tenerlas como float ¿es por algo en especial? Quiero decir ¿necesitas decimales para algo? Porque si no los necesitas estas desperdiciando mucho de todo. Si no necesitas los decimales trabaja con enteros Int8 o Int16 y ya veras como te funciona mejor. Otra cosa, ¿Quien o como incrementa Contador?
-
Te pongo el código completo, es el control de una incubadora, y desde un menu controlo la temperatura, humedad y volteo de los huevos. he cambiado las variables a int16 y ahora se queda siempre en low.
#include <16F876.h>
#include <internal_eeprom.c>
#use delay(clock=4000000)
#fuses xt,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#define use_portb_lcd TRUE
#include "LCD.c"
#include <sht11.h>
int16 contador;
#int_timer0
void INTERRUPTION()
{
contador ++;
set_timer0(0x06);
}
//#byte port_c=0x07
//******************************************************************************
// input(pin_C0) Pulsador de menu y ok
// input(pin_C1) Pulsador de flecha abajo (mas)
// input(pin_C2) Pulsador de flecha arriba (menos)
//******************************************************************************
short actualizar;
typedef union
{
int16 i;
float f;
} valor;
valor humedad, temperatura;
byte errorsht11,checksum;
unsigned test=1;//, i;
int8 testado;
float T, H, V;
int16 X, Y;
//int16 tiempo;
///LLAMADA FUNCION INTERRUPCION
//INTERRUPCION
void sonda(){
//while ( !input(PIN_A0) );//while(true)
// {
errorsht11=0;
errorsht11+=sht11_medicion((byte*) &humedad.i, &checksum, HUMI); //measure humidity
errorsht11+=sht11_medicion((byte*) &temperatura.i, &checksum, TEMP); //measure temperature
if(errorsht11!=0) //in case of an error: connection reset
{
printf(lcd_putc,"\n\rerror:%U", errorsht11);
sht11_hard_reset();
}
else
{
humedad.f=(float)humedad.i; //converts integer to float
temperatura.f=(float)temperatura.i; //converts integer to float
sht11_calculos(&humedad.f, &temperatura.f); //calculate humidity, temperature
}
lcd_gotoxy(1,1);
printf(lcd_putc," Temp. Humedad");
lcd_gotoxy(0,2);
printf(lcd_putc," %2.2f",temperatura.f);
IF (temperatura.f < (read_float_eeprom(1)-2)) output_high(pin_A0);
IF (temperatura.f > (read_float_eeprom(1)+2)) output_low(pin_A0);
IF (humedad.f < (read_float_eeprom(10)-2)) output_high(pin_A1);
IF (humedad.f > (read_float_eeprom(10)+2)) output_low(pin_A1);
lcd_send_byte(1,0b11011111);
printf(lcd_putc,"C %2.2f%%HR",humedad.f);
actualizar=true;
delay_ms(100);
}
// pulsador();
// }
void menus()
{
switch (testado){
case 1:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1 Temperatura");
break;
case 2:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("2 Humedad");
break;
case 3:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("3 Volteo");
break;
case 4:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("4 Salir");
break;
}
}
void menus2()
{
switch (testado){
case 1:
delay_ms(100);
T=read_float_eeprom(1);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Grados ");
lcd_putc(223);
//for(i=200;i!=255;i++)
//{
//lcd_gotoxy(1,1);
//lcd_putc(i);
//printf(lcd_putc,"%u",i);
//delay_ms(1000);
//};
lcd_putc("C");
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
T=T+0.10;
if (T>40) T=15.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
T=T-0.10;
if (T<15) T=40.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
}
}
while (!input(pin_C0));
write_float_eeprom(1,T);
break;
case 2:
delay_ms(100);
H=read_float_eeprom(10);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Humedad %");
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
H=H+0.10;
if (H>90) H=40.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
H=H-0.10;
if (H<40) H=90.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
}
}
while (!input(pin_C0));
write_float_eeprom(10,H);
break;
case 3:
delay_ms(100);
V=read_float_eeprom(20);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Volteo minu-");
lcd_gotoxy(1,2);
lcd_putc("tos");
lcd_gotoxy(5,2);
printf(lcd_putc,"%3.0f",V);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
V=V+1;
if (V>120) V=0;
lcd_gotoxy(5,2);
printf(lcd_putc,"%3.0f",V);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
V=V-1;
if (V<0) V=120;
lcd_gotoxy(5,2);
printf(lcd_putc,"%3.0f",V);
}
}
while (!input(pin_C0));
write_float_eeprom(20,V);
break;
case 4:
test=0;
break;
}
}
void pulsador()
{
//==================================================================================
//testado=1;
menus();
delay_ms(200);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
testado=testado+1;
if(testado>4){testado=1;}
menus();
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
testado=testado-1;
if(testado==0){testado=4;}
menus();
}
}
while (!input(pin_C0));
menus2();
//pulsador();
}
void main()
{
//*********************************
SETUP_COUNTERS(RTCC_INTERNAL,RTCC_DIV_16);
set_rtcc(0x06);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER0);
//OUTPUT_LOW(PIN_A2);
//DO {
// OUTPUT_HIGH(PIN_A2);
// }WHILE(TRUE);
//*********************************
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
actualizar=true;
//write_eeprom(10,T);
//write_eeprom(20,H);
//write_eeprom(30,V);
lcd_init();
sht11_hard_reset();;
//V==read_float_eeprom(20);
//H==read_float_eeprom(10);
//T==read_float_eeprom(1);
testado=1;
// sonda();
while(true)
{
V=read_float_eeprom(20);
//X=V*60;
X=250;
Y=300;
IF (contador == X){
OUTPUT_HIGH(PIN_A2);
}
IF (contador == Y){
OUTPUT_LOW(PIN_A2);
contador = 0;
}
//SET_TIMER0(131);// RESET_TIMER0;
if (actualizar)
{
sonda();
// actualizar=false;
}
if (!input(pin_C0))
{
while (test){pulsador();}
}
test=1;
testado=1;
}
//lcd_putc("\f");
}