TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Mikro-77 en 12 de Abril de 2013, 23:14:14

Título: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 12 de Abril de 2013, 23:14:14
Hola queria preguntar si alguien sabe porque este codigo no me funciona

if ((float)temperaturadecimal < temperatura1)
output_high(pin_B0);
else
output_low(pin_B0);

if ((float)temperaturadecimal < temperatura2)
output_high(pin_B1);
else
output_low(pin_B1);

se supone que si (float)temperaturadecimal es menor a temperatura1 y temperatura2 tendrian que estar B0 y B1 en estado alto pero solo se pone en estado alto B1 pero si ago

if ((float)temperaturadecimal < temperatura2)
output_high(pin_B1);
else
output_low(pin_B1);

if ((float)temperaturadecimal < temperatura1)
output_high(pin_B0);
else
output_low(pin_B0);

se pone B0 en estado alto! esto esta dentro del while(true)...
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Nocturno en 13 de Abril de 2013, 01:29:22
¿Puedes poner el código completo del programa?, ¿con qué micro estás trabajando?
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 13:39:46
hola gracias por tu interes, estoy con un 16f877 el codigo es ese !

while (true)
{
if ((float)temperaturadecimal < temperatura1)
output_high(pin_B0);
else
output_low(pin_B0);

if ((float)temperaturadecimal < temperatura2)
output_high(pin_B1);
else
output_low(pin_B1);
}

la pregunta es si deverian ponerse los dos pines en alto si la variable (float)temperaturadecimal es < a temperatura1 y temperatura 2?? pasa que soy novato en ccs!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: gera en 13 de Abril de 2013, 13:50:43
Yo creo que el problema esta en el casting que estas haciendo.
Habria que ver que tipo de datos son temperaturadecimal  y temperatura, y que valores tienen.
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: bmb en 13 de Abril de 2013, 13:55:09
¿Puedes poner el código completo del programa?, ¿con qué micro estás trabajando?

hola gracias por tu interes, estoy con un 16f877 el codigo es ese !

Hola Miko-77, obviamente ese no es el código completo!!! Yo también creo que sin ver al menos el encabezado del programa en donde están las declaraciones de variables, fuses, includes, etc, va a ser muy difícil que alguien te ayude.

Saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 14:29:03
# include <16f877a.h>
# device *=16 //Use 16 bit pointers (for 14 bit parts)
# device *=16
# device adc=10
# use delay(clock=4M)
# include <lcd.c>
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect


float temperatura0;
float temperatura1;
float temperatura2;
float temperatura3;
float temperatura4;
float temperatura5;
float temperatura6;
float temperatura7;

float contadorconfiguracion;
float temperaturadecimal;
//float temperaturaentero;

void main()
{

//*******************************
delay_ms(20);
setup_adc_ports (all_analog);
//setup_adc_ports(RE0_RE1_RE3_ANALOG);//entrada del LM35
setup_adc(ADC_CLOCK_INTERNAL);
setup_COUNTERS(RTCC_internal.rtcc_div_1);//marca de divicion


//*******************************

lcd_init();
delay_ms(350);

//lcd_putc("\f"); //Limpia pantalla
contadorconfiguracion = 0;
temperaturadecimal = 0;

while(true)
{
set_adc_channel(0);
delay_ms(20);
temperatura0=(float)read_adc()/2;

set_adc_channel(1);
delay_ms(20);
temperatura1=(float)read_adc()/2;

set_adc_channel(2);
delay_ms(20);
temperatura2=(float)read_adc()/2;

set_adc_channel(3);
delay_ms(20);
temperatura3=(float)read_adc()/2;

set_adc_channel(4);
delay_ms(20);
temperatura4=(float)read_adc()/2;

set_adc_channel(5);
delay_ms(20);
temperatura5=(float)read_adc()/2;

set_adc_channel(6);
delay_ms(20);
temperatura6=(float)read_adc()/2;

set_adc_channel(7);
delay_ms(20);
temperatura7=(float)read_adc()/2;

if(input(Pin_C0)==1)
{//contadorconfiguracion = 1;
//printf(lcd_putc,"\f");
contadorconfiguracion = contadorconfiguracion + 1;
delay_ms(200);}

if (contadorconfiguracion == 0)  //si no se pulso configuracion entonces
{
if(temperatura0>6)
{temperatura0 = temperatura0-0.5;}
if(temperatura0>25)
{temperatura0 = temperatura0-0.5;}
if(temperatura0>45)
{temperatura0 = temperatura0-0.5;}
/*if(temperatura0>65)
{temperatura0 = temperatura0-0.5;}
if(temperatura0>85)
{temperatura0 = temperatura0-0.5;}
if(temperatura0>104)
{temperatura0 = temperatura0-0.5;}
if(temperatura0>124)
{temperatura0 = temperatura0-0.5;}
if(temperatura0>144)
{temperatura0 = temperatura0-0.5;}*/
lcd_gotoxy(1,1);
printf(lcd_putc,"%0.1f",temperatura0);

if(temperatura1>6)
{temperatura1 = temperatura1-0.5;}
if(temperatura1>25)
{temperatura1 = temperatura1-0.5;}
if(temperatura1>45)
{temperatura1 = temperatura1-0.5;}
/*if(temperatura1>65)
{temperatura1 = temperatura1-0.5;}
if(temperatura1>85)
{temperatura1 = temperatura1-0.5;}
if(temperatura1>104)
{temperatura1 = temperatura1-0.5;}
if(temperatura1>124)
{temperatura1 = temperatura1-0.5;}
if(temperatura1>144)
{temperatura1 = temperatura1-0.5;}*/
lcd_gotoxy(12,1);
printf(lcd_putc,"%0.1f",temperatura1);

if(temperatura2>6)
{temperatura2 = temperatura2-0.5;}
if(temperatura2>25)
{temperatura2 = temperatura2-0.5;}
if(temperatura2>45)
{temperatura2 = temperatura2-0.5;}
/*if(temperatura2>65)
{temperatura2 = temperatura2-0.5;}
if(temperatura2>85)
{temperatura2 = temperatura2-0.5;}
if(temperatura2>104)
{temperatura2 = temperatura2-0.5;}
if(temperatura2>124)
{temperatura2 = temperatura2-0.5;}
if(temperatura2>144)
{temperatura2 = temperatura2-0.5;}*/
lcd_gotoxy(1,2);
printf(lcd_putc,"%0.1f",temperatura2);

if(temperatura3>6)
{temperatura3 = temperatura3-0.5;}
if(temperatura3>25)
{temperatura3 = temperatura3-0.5;}
if(temperatura3>45)
{temperatura3 = temperatura3-0.5;}
/*if(temperatura3>65)
{temperatura3 = temperatura3-0.5;}
if(temperatura3>85)
{temperatura3 = temperatura3-0.5;}
if(temperatura3>104)
{temperatura3 = temperatura3-0.5;}
if(temperatura3>124)
{temperatura3 = temperatura3-0.5;}
if(temperatura3>144)
{temperatura3 = temperatura3-0.5;}*/
lcd_gotoxy(12,2);
printf(lcd_putc,"%0.1f",temperatura3);}


if (contadorconfiguracion == 1) //se pulso configuracion
{//printf(lcd_putc,"\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"%0.1f",temperatura4);
if(temperatura4>6)
{
temperatura4 = temperatura4-0.5;}
if(temperatura4>25)
{
temperatura4 = temperatura4-0.5;}
if(temperatura4>45)
{
temperatura4 = temperatura4-0.5;}

lcd_gotoxy(12,1);
printf(lcd_putc,"%0.1f",temperatura5);
if(temperatura5>6)
{
temperatura5 = temperatura5-0.5;}
if(temperatura5>25)
{
temperatura5 = temperatura5-0.5;}
if(temperatura5>45)
{
temperatura5 = temperatura5-0.5;}

lcd_gotoxy(1,2);
printf(lcd_putc,"%0.1f",temperatura6);
if(temperatura6>6)
{
temperatura6 = temperatura6-0.5;}
if(temperatura6>25)
{
temperatura6 = temperatura6-0.5;}
if(temperatura6>45)
{
temperatura6 = temperatura6-0.5;}

lcd_gotoxy(12,2);
printf(lcd_putc,"%0.1f",temperatura7);
if(temperatura7>6)
{
temperatura7 = temperatura7-0.5;}
if(temperatura7>25)
{
temperatura7 = temperatura7-0.5;}
if(temperatura7>45)
{
temperatura7 = temperatura7-0.5;}
}

if (contadorconfiguracion == 2)
{//lcd_gotoxy(1,1);
//Lcd_putc ("temperatura en :");
lcd_gotoxy(1,2);
printf(lcd_putc,"%0.1f",temperaturadecimal);
lcd_gotoxy(5,2);
printf(lcd_putc,"            ");
delay_ms(200);

if(input(Pin_C1)==1)
{(float)temperaturadecimal = (float)temperaturadecimal+0.50;
}
if(input(Pin_C2)==1)
{(float)temperaturadecimal = (float)temperaturadecimal-0.50;
}
}

if (contadorconfiguracion >= 3)
{
contadorconfiguracion = 0;
lcd_putc("\f"); //Limpia pantalla
}

if ((float)temperaturadecimal > temperatura1)
output_high(pin_B0);
else
output_low(pin_B0);

if ((float)temperaturadecimal > temperatura2)
output_high(pin_B1);
else
output_low(pin_B1);

}
}
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: bmb en 13 de Abril de 2013, 16:10:10
Hola Mikro-77, tu primera pregunta es:

Citar
Hola queria preguntar si alguien sabe porque este codigo no me funciona

Código: C
  1. if ((float)temperaturadecimal < temperatura1)
  2. output_high(pin_B0);
  3. else
  4. output_low(pin_B0);
  5.  
  6. if ((float)temperaturadecimal < temperatura2)
  7. output_high(pin_B1);
  8. else
  9. output_low(pin_B1);

Pero en el programa completo pones:

Código: C
  1. if ((float)temperaturadecimal > temperatura1)
  2. output_high(pin_B0);
  3. else
  4. output_low(pin_B0);
  5.  
  6. if ((float)temperaturadecimal > temperatura2)
  7. output_high(pin_B1);
  8. else
  9. output_low(pin_B1);

La respuesta a tu pregunta con el código del primer post es si, de tal manera que si temperaturadecimal < temperatura1 ,solamente pin_B0 se pondrá en estado alto, e independientemente de este resultado si temperaturadecimal < temperatura2, solamente pin_B1 se pondrá en estado alto.  Me gustaría preguntarte que sensor de temperatura usas y en que parte estás convirtiendo el valor de 10 bits, que estás recibiendo, en temperatura.  También veo que le estás haciendo casting a variables que no lo necesitan (todas tus variables son float).  Para recibir los valores ADC yo te recomendaría, por claridad, crear una variable tipo int16 para recibir el valor de 10 bits de la conversión ADC y luego si quieres hacer operaciones tipo float con este valor, ahí si le aplicas el casting. Por ejemplo:

Código: C
  1. long valor_adc = 0;
  2.  
  3.  
  4. set_adc_channel(0);
  5. delay_ms(20);
  6. valor_adc = read_adc();
  7. temperatura0=(float)valor_adc/2.0;

Saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 19:12:39
Hola gracias por responder bmb, en el titulo dice codigo ccs no funciona no responde a las condiciones  :) es importante empezar a leer por el titulo para tener una idea del tema me decian las maestras, de todas maneras yo nunca les hice caso  :D el tema es que los dos pines tienen que prender si las condiciones se dan y algo ago mal ya sea en el casting o en algun lado, uso el lm35 por otro lado tu detalle es importante y gracias por tirarme las orejas con la variable long valor_adc = 0; no me di cuenta de hacer eso pero el detalle y el costo de esto es que ahora tengo un error en el compilador el error archiconocido es error 71 out of rom a segment or the program is too large main, otra cosa es que mis variables son float pero no se como pueda hacer esto sin usar float  :5]

float temperaturadecimal;
float temperatura0;

while (true)
{
if ((float)temperaturadecimal > temperatura1)
}

help me  :?
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 19:45:38
estoy cambiando las variables de tipo float a int para ahorrar espacio asi no me da el error (error 71 de rom un segmento o el programa principal es demasiado grande)
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: bmb en 13 de Abril de 2013, 20:08:17
... en el titulo dice codigo ccs no funciona no responde a las condiciones  :) es importante empezar a leer por el titulo ...

Mmmmhhh si, tienes razón, debí leer el título.  Te ofrezco disculpas.

Saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 20:34:52
y no te las acepto porque no tenes porque pedirme disculpas amigo! demaciado que me estas ayudando!!  :-/ el problema que tengo ahora es que si uso variables flotantes pierdo memoria rom y si uso enteros no tengo presicion las dos cosas me sirven pero creo que tendria que declarar todas las variables de tipo int y ver de que forma muestro floats in the lcd  :D y despues ver como ago para solucionar este tema  :?

if ((float)temperaturadecimal < temperatura1)
output_high(pin_B0);
else
output_low(pin_B0);

if ((float)temperaturadecimal < temperatura2)
output_high(pin_B1);
else
output_low(pin_B1);

y tener dos pines en alto si las dos condiciones se cumplen

saludos amigo bmb
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 13 de Abril de 2013, 20:54:23
Que tal Yo recomendaria para hacer las comparaciones trabajar con long y de acuerdo al resultado luego pasarlo a float para porcesar el resultado  :mrgreen:
Te recomendaria que le heches un ojo a esto. (http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)

Saludos
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: bmb en 13 de Abril de 2013, 20:59:02
Ok, intenta así, aunque creo que vas a terminar cambiándote a un PIC con más memoria:

Código: C
  1. # include <16f877a.h>
  2. # device *=16 //Use 16 bit pointers (FOR 14 bit parts)
  3. # device adc=10
  4.  
  5. #fuses xt,nowdt,noput,nobrownout,nolvp,noprotect
  6. # use delay(clock=4M)
  7.  
  8. # include <lcd.c>
  9.  
  10. float temperatura0;
  11. float temperatura1;
  12. float temperatura2;
  13. float temperatura3;
  14. float temperatura4;
  15. float temperatura5;
  16. float temperatura6;
  17. float temperatura7;
  18. float contadorconfiguracion;
  19. float temperaturadecimal;
  20. long valor_adc = 0;
  21. //FLOAT temperaturaentero;
  22.  
  23. void main()
  24. {
  25.    //*******************************
  26.    delay_ms(20);
  27.    setup_adc_ports (all_analog);
  28.    //setup_adc_ports(RE0_RE1_RE3_ANALOG);//entrada del LM35
  29.    setup_adc(ADC_CLOCK_INTERNAL);
  30.    setup_COUNTERS(RTCC_internal.rtcc_div_1);//marca de divicion
  31.    //*******************************
  32.    lcd_init();
  33.    delay_ms(350);
  34.    //lcd_putc("\f"); //Limpia pantalla
  35.    contadorconfiguracion = 0;
  36.    temperaturadecimal = 0;
  37.  
  38.    WHILE(true)
  39.    {
  40.       set_adc_channel(0);
  41.       delay_ms(20);
  42.       valor_adc = read_adc();
  43.       temperatura0=(FLOAT)(valor_adc/2);
  44.       set_adc_channel(1);
  45.       delay_ms(20);
  46.       valor_adc = read_adc();
  47.       temperatura1=(FLOAT)(valor_adc/2);
  48.       set_adc_channel(2);
  49.       delay_ms(20);
  50.       valor_adc = read_adc();
  51.       temperatura2=(FLOAT)(valor_adc/2);
  52.       set_adc_channel(3);
  53.       delay_ms(20);
  54.       valor_adc = read_adc();
  55.       temperatura3=(FLOAT)(valor_adc/2);
  56.       set_adc_channel(4);
  57.       delay_ms(20);
  58.       valor_adc = read_adc();
  59.       temperatura4=(FLOAT)(valor_adc/2);
  60.       set_adc_channel(5);
  61.       delay_ms(20);
  62.       valor_adc = read_adc();
  63.       temperatura5=(FLOAT)(valor_adc/2);
  64.       set_adc_channel(6);
  65.       delay_ms(20);
  66.       valor_adc = read_adc();
  67.       temperatura6=(FLOAT)(valor_adc/2);
  68.       set_adc_channel(7);
  69.       delay_ms(20);
  70.       valor_adc = read_adc();
  71.       temperatura7=(FLOAT)(valor_adc/2);
  72.  
  73.       IF(input(Pin_C0)==1)
  74.       {
  75.          //contadorconfiguracion = 1;
  76.          //printf(lcd_putc,"\f");
  77.          contadorconfiguracion = contadorconfiguracion + 1;
  78.          delay_ms (200) ;
  79.       }
  80.  
  81.       IF (contadorconfiguracion == 0)  //si no se pulso configuracion entonces
  82.       {
  83.          IF(temperatura0>6)
  84.          {temperatura0 = temperatura0-0.5;}
  85.          IF(temperatura0>25)
  86.          {temperatura0 = temperatura0-0.5;}
  87.          IF(temperatura0>45)
  88.          {temperatura0 = temperatura0-0.5;}
  89.          /*IF(temperatura0>65)
  90.          {temperatura0 = temperatura0-0.5;}
  91.          IF(temperatura0>85)
  92.          {temperatura0 = temperatura0-0.5;}
  93.          IF(temperatura0>104)
  94.          {temperatura0 = temperatura0-0.5;}
  95.          IF(temperatura0>124)
  96.          {temperatura0 = temperatura0-0.5;}
  97.          IF(temperatura0>144)
  98.          {temperatura0 = temperatura0-0.5;}*/
  99.          lcd_gotoxy(1,1);
  100.          printf(lcd_putc,"%0.1f",temperatura0);
  101.  
  102.          IF(temperatura1>6)
  103.          {temperatura1 = temperatura1-0.5;}
  104.          IF(temperatura1>25)
  105.          {temperatura1 = temperatura1-0.5;}
  106.          IF(temperatura1>45)
  107.          {temperatura1 = temperatura1-0.5;}
  108.          /*IF(temperatura1>65)
  109.          {temperatura1 = temperatura1-0.5;}
  110.          IF(temperatura1>85)
  111.          {temperatura1 = temperatura1-0.5;}
  112.          IF(temperatura1>104)
  113.          {temperatura1 = temperatura1-0.5;}
  114.          IF(temperatura1>124)
  115.          {temperatura1 = temperatura1-0.5;}
  116.          IF(temperatura1>144)
  117.          {temperatura1 = temperatura1-0.5;}*/
  118.          lcd_gotoxy(12,1);
  119.          printf(lcd_putc,"%0.1f",temperatura1);
  120.  
  121.          IF(temperatura2>6)
  122.          {temperatura2 = temperatura2-0.5;}
  123.          IF(temperatura2>25)
  124.          {temperatura2 = temperatura2-0.5;}
  125.          IF(temperatura2>45)
  126.          {temperatura2 = temperatura2-0.5;}
  127.          /*IF(temperatura2>65)
  128.          {temperatura2 = temperatura2-0.5;}
  129.          IF(temperatura2>85)
  130.          {temperatura2 = temperatura2-0.5;}
  131.          IF(temperatura2>104)
  132.          {temperatura2 = temperatura2-0.5;}
  133.          IF(temperatura2>124)
  134.          {temperatura2 = temperatura2-0.5;}
  135.          IF(temperatura2>144)
  136.          {temperatura2 = temperatura2-0.5;}*/
  137.          lcd_gotoxy(1,2);
  138.          printf(lcd_putc,"%0.1f",temperatura2);
  139.  
  140.          IF(temperatura3>6)
  141.          {temperatura3 = temperatura3-0.5;}
  142.          IF(temperatura3>25)
  143.          {temperatura3 = temperatura3-0.5;}
  144.          IF(temperatura3>45)
  145.          {temperatura3 = temperatura3-0.5;}
  146.          /*IF(temperatura3>65)
  147.          {temperatura3 = temperatura3-0.5;}
  148.          IF(temperatura3>85)
  149.          {temperatura3 = temperatura3-0.5;}
  150.          IF(temperatura3>104)
  151.          {temperatura3 = temperatura3-0.5;}
  152.          IF(temperatura3>124)
  153.          {temperatura3 = temperatura3-0.5;}
  154.          IF(temperatura3>144)
  155.          {temperatura3 = temperatura3-0.5;}*/
  156.          lcd_gotoxy(12,2);
  157.          printf (lcd_putc, " %0.1f", temperatura3);
  158.       }
  159.  
  160.       IF (contadorconfiguracion == 1) //se pulso configuracion
  161.       {
  162.          //printf(lcd_putc,"\f");
  163.          lcd_gotoxy(1,1);
  164.          printf(lcd_putc,"%0.1f",temperatura4);
  165.  
  166.          IF(temperatura4>6)
  167.          {
  168.             temperatura4 = temperatura4 - 0.5;
  169.          }
  170.  
  171.          IF(temperatura4>25)
  172.          {
  173.             temperatura4 = temperatura4 - 0.5;
  174.          }
  175.  
  176.          IF(temperatura4>45)
  177.          {
  178.             temperatura4 = temperatura4 - 0.5;
  179.          }
  180.  
  181.          lcd_gotoxy(12,1);
  182.          printf(lcd_putc,"%0.1f",temperatura5);
  183.  
  184.          IF(temperatura5>6)
  185.          {
  186.             temperatura5 = temperatura5 - 0.5;
  187.          }
  188.  
  189.          IF(temperatura5>25)
  190.          {
  191.             temperatura5 = temperatura5 - 0.5;
  192.          }
  193.  
  194.          IF(temperatura5>45)
  195.          {
  196.             temperatura5 = temperatura5 - 0.5;
  197.          }
  198.  
  199.          lcd_gotoxy(1,2);
  200.          printf(lcd_putc,"%0.1f",temperatura6);
  201.  
  202.          IF(temperatura6>6)
  203.          {
  204.             temperatura6 = temperatura6 - 0.5;
  205.          }
  206.  
  207.          IF(temperatura6>25)
  208.          {
  209.             temperatura6 = temperatura6 - 0.5;
  210.          }
  211.  
  212.          IF(temperatura6>45)
  213.          {
  214.             temperatura6 = temperatura6 - 0.5;
  215.          }
  216.  
  217.          lcd_gotoxy(12,2);
  218.          printf(lcd_putc,"%0.1f",temperatura7);
  219.  
  220.          IF(temperatura7>6)
  221.          {
  222.             temperatura7 = temperatura7 - 0.5;
  223.          }
  224.  
  225.          IF(temperatura7>25)
  226.          {
  227.             temperatura7 = temperatura7 - 0.5;
  228.          }
  229.  
  230.          IF(temperatura7>45)
  231.          {
  232.             temperatura7 = temperatura7 - 0.5;
  233.          }
  234.       }
  235.  
  236.       IF (contadorconfiguracion == 2)
  237.       {
  238.          //lcd_gotoxy(1,1);
  239.          //Lcd_putc ("temperatura en :");
  240.          lcd_gotoxy(1,2);
  241.          printf(lcd_putc,"%0.1f",temperaturadecimal);
  242.          lcd_gotoxy(5,2);
  243.          printf(lcd_putc,"            ");
  244.          delay_ms(200);
  245.  
  246.          IF(input(Pin_C1)==1)
  247.          {
  248.             temperaturadecimal = temperaturadecimal+0.50;
  249.          }
  250.  
  251.          IF(input(Pin_C2)==1)
  252.          {
  253.             temperaturadecimal = temperaturadecimal-0.50;
  254.          }
  255.       }
  256.  
  257.       IF (contadorconfiguracion >= 3)
  258.       {
  259.          contadorconfiguracion = 0;
  260.          lcd_putc("\f"); //Limpia pantalla
  261.       }
  262.  
  263.       IF (temperaturadecimal > temperatura1)
  264.          output_high(pin_B0);
  265.       ELSE
  266.          output_low(pin_B0);
  267.  
  268.       IF (temperaturadecimal > temperatura2)
  269.          output_high(pin_B1);
  270.       ELSE
  271.          output_low(pin_B1);
  272.    }
  273. }

Si yo hago aquí una pequeña prueba con esa parte de código que estás cuestionando, simplemente funciona (quítale el casting como te muestro en el código), de modo que no se por que no te ha de funcionar.  Lo que te preguntaba ahora, es sobre la forma en que la variable que captura la conversión de ADC, convierte este valor a temperatura.  Eso lo debes revisar tu mismo, porque no tengo la forma de hacer el montaje físico del circuito para ver el problema.  Tienes un programador ICD?  Si es así, te va a ser muy útil aprender a usar el modo debug de este.

Saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 21:04:44
y seguro que tenes razon!!! pero lo que me da bronca, o no se como le diran en tu pais, es que el pic no llega a usar toda la memoria y supuestamente tengo que pasar a otro banco de memoria con la instruccion # separate pero resulta que ni eso puedo hacer porque no necesito funciones ni procedimientos! son solo condiciones lo que necesito!  :5]

pd: 18f ahi vamos  :D
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 21:07:19
Hola ralf2 gracias por tu interes amigo! una pregunta... si uso long no me trunca el valor que esta despues de la coma??
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 13 de Abril de 2013, 21:23:27
Segun veo de pasada en tu codigo que tu lees el adc lo divides por 2 luego lo alamacenas en una variable tipo float y finalmente comparas sino estoy equivocado.
Lo que yo digo es que leas el adc lo cargas el valor en un long, despues comparas con los otros long y de alli mandas a activar el pin que desees y luego el long que quieras utilizar del resultado de la comparacion los pasas a float para por ejemplo presentarlo en la lcd  :mrgreen:
El uso de float para realizar comparaciones no es aconsejable por la falta de presicion de estos y porque ademas para el pic es desastrozo porque se come la memoria.
Otra solucion ya algo desesperada usar un co prosesador matematico que haga el trabajo sucio  :D  de la comparaciones con float si es que se puede   :mrgreen:

Nota: el enlace que te deje explica el porque no usar o como usar los float con un truquito  :mrgreen:

Se me prendio el bombillo  :D
Y si en vez de hacer esto:
Citar
if ((float)temperaturadecimal < temperatura1)
output_high(pin_B0);
else
output_low(pin_B0);

Haces esto:
Citar
if (((float)temperaturadecimal - temperatura1)<0)
output_high(pin_B0);
else
output_low(pin_B0);
Que te parece  :mrgreen:

Saludos
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 21:34:13
Gueno  :mrgreen: ahora a leer entonces y gracias por tu respuesta y a bmb gracias tambien por su ayuda!!!! es bueno encontrar gente como ustedes dispuesta a enseñar sin ningun veneficio solo el de aprender a enseñar a burros como yo  :oops:!!

ha me olvidava como ago para tener dos pines en estado alto si se cumple esta condicion?? dentro del while (true)

IF (temperaturadecimal > temperatura0)
        output_high(pin_B0);
     ELSE
        output_low(pin_B0);
 
     IF (temperaturadecimal > temperatura1)
        output_high(pin_B1);
     ELSE
        output_low(pin_B1);

saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 13 de Abril de 2013, 21:35:55
Prueba con lo que te coloque arriba y me dices que paso  ;-)
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 21:39:23
y lo voy a hacer amigo pero primero me gustaria sacar todos los errorcitos  :mrgreen: como ago para que dos pines se pongan en estado alto si se cumple

IF (temperaturadecimal > temperatura0)
        output_high(pin_B0);
     ELSE
        output_low(pin_B0);
 
     IF (temperaturadecimal > temperatura1)
        output_high(pin_B1);
     ELSE
        output_low(pin_B1);

dentro del while?
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 13 de Abril de 2013, 21:48:03
Asi:

IF ((temperaturadecimal > temperatura0) $$ (temperaturadecimal > temperatura1)> 0)  
{        
       output_high(pin_B0);
       output_high(pin_B1);
}
else
{        
       output_high(pin_B2);
       output_high(pin_B3);
}

Otro detalle quita los (float) que no hacen falta ya que las variables estan declaradas como float  :mrgreen:
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 22:08:24
 :( no funciona! necesito que las operaciones sean independientes una de otra! osea tendria que estar en estado alto ya sea uno u otro o los dos juntos o no encender si las condiciones no se cumplen algo asi decia!

                            B0=   si
                            B1=   si
                          
                            B0=   no
                            B1=   no

                            B0=   no
                            B1=   si

                            B0=   si
                            B1=   no
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 13 de Abril de 2013, 22:17:45
Revisa atras ya lo corregi  :mrgreen:
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 13 de Abril de 2013, 22:32:56
los signos $$ son and ?? estoy con ccs  :mrgreen:
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 13 de Abril de 2013, 22:40:57
Son && para and y || es para or.
Se utilizan para las comparaciones.
En el foro hay un link que te explica el CCs yo que tu lo revisaria.   :mrgreen:

Ahora bien en cuanto a tu problema inicial, yo hice un programa utilizando float y me funciono perfectamente claro quitando el (float) que tu utilizas.  :shock:

Es estraño que te de problemas, de todas formas prueba como te coloque arriba  :mrgreen:
Nota: Yo utilice un pic18f252 para las pruebas que hice, te recomendaria que te cambiaras a la serie 18 que no te dara los problemas que comentas  :mrgreen:  por ejemplo el pic18F452 es el Hermano mayor del pic16F877A por decirlo asi  :-/

Saludos
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: bmb en 13 de Abril de 2013, 22:45:25
Hola, los signos para AND son: &&

Saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 14 de Abril de 2013, 00:08:15
ilegal character in input file 0x24  :? eso me dice el compilador pero debe ser una tonteria ya me fijo para ver si anda! correcto && es and! gracias, pero de todas maneras solo se queda un pin en estado alto! me podrias pasar tu ejemplo ralf2?
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 14 de Abril de 2013, 01:15:12
segun que pretendo que aga en cada if tendre que usar output_B(0b00000000); hasta output_B(0b11111111); es lo mas recomendable y me funciona bien pero como consejo no por mi experiencia pero si por lo que vi en varios foros hay que usar la gama 18f para evitar dolores de cabeza! yo estoy rompiendome la cabeza porque me gusta renegar y porque sabado a la noche es un poquito dificil comprar un pic  :mrgreen:
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 14 de Abril de 2013, 06:10:39
Citar
porque sabado a la noche es un poquito dificil comprar un pic  Mr. Green

Yo por eso tengo varios modelos en el botiquin de primeros auxilios   :D
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 14 de Abril de 2013, 08:52:11
 Hola buen dia ! yo tambien tengo algunos mas grandes en capacidad de memoria pero ninguno con la cantidad de pines como para hacer esto!  :mrgreen: disculpas termine de escribir y fui a fijarme y tengo un 18f4520 que debe tener como 4 años juntando polvillo  :-/ :-/ :D
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 14 de Abril de 2013, 09:15:25
ahora con ese pic 18f4520 no me deja usar # device *=16 ni # device adc=10 porque no puedo usarlos y como puedo repara el codigo?
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: RALF2 en 14 de Abril de 2013, 09:59:03
ahora con ese pic 18f4520 no me deja usar # device *=16 ni # device adc=10 porque no puedo usarlos y como puedo repara el codigo?

# device *=16  // no hace falta colocarla.

Lo otro debes colocarlo asi:

#include <18f4520.h>
#device adc=10              // aunque esto me parece que tampoco hace falta

Aqui  (http://www.google.co.ve/url?sa=t&rct=j&q=&esrc=s&source=web&cd=33&ved=0CDsQFjACOB4&url=http%3A%2F%2Fwww2.ate.uniovi.es%2Ffernando%2FDoc2007%2FPresentaciones%2FProgramaci%25F3n%2520en%2520C.pdf&ei=CqlqUcSVAZGQ8wT6vIGIDA&usg=AFQjCNFi0jBZZOEnxDFvn8gzrqewUWsaHQ&sig2=lJ-bdEJFu4SQeLhbfTCdNg) un manual de CCS  :mrgreen:



Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 14 de Abril de 2013, 10:48:00
el error fue que hice mal el encabezado  :oops: en ves de #include <18f4520.h> puse #include <4520.h>  :D y gracias por tu manual!!!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: bmb en 14 de Abril de 2013, 11:07:22
Hola, cuando tenemos un PIC que no conocemos bien, lo mejor es usar el 'PIC Wizard' del CCS.  Aquí un ejemplo de configuración básica (con el PIC Wizard) para  8 entradas análogas:

Código: C
  1. #include <18F4520.h>
  2. #device adc=10
  3. #device *=16
  4.  
  5. #FUSES NOWDT                    //No Watch Dog Timer
  6. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  7. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  10. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  11. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  12.  
  13. #use delay(clock=4000000)
  14.  
  15. void main()
  16. {
  17.    setup_adc_ports(AN0_TO_AN7);
  18.    setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
  19.  
  20.  
  21.    while(TRUE)
  22.    {
  23.       //TODO: User Code
  24.    }
  25. }

La directiva #device adc=x se usa para determinar el número de bits que devuelve la conversión que hace read_adc().  Con *=16, usa punteros de 16 bits, que por ahora no necesitas.

Saludos!
Título: Re: codigo ccs no funciona no responde a las condiciones
Publicado por: Mikro-77 en 16 de Abril de 2013, 17:53:47
 :-/ buenisimo !! muchas gracias !! y ya esta andando muy bien el programita ! apenas me dejen las mujeres  :D lo monto en una plaqueta y lo pruebo !! no se porque con el 877 no andaba  :shock:

pd: muy agradecido por la ayuda amigos ((:-))