Autor Tema: Ayuda con Sensor de Temperatura con 16F876  (Leído 6772 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: Ayuda con Sensor de Temperatura con 16F876
« Respuesta #15 en: 04 de Enero de 2007, 17:25:18 »
Vamos a ver, mirando tú código, ¿para que tienes está instrucción?
Código: C
  1. if(i==1||i==0){

Si la instrucción anterior: i=bit_test(temp,31); te va a dar un 0 o un 1, eso quiere decir que la snetencia if siempre sera verdadera. Aparte, creo que la instrucción bit_test(); dá un número de 8-bits, y tu tienes declarada la variable i como 16-bits (no creo que te dé muchos problemas esto, pero por si acaso asemeja el tamaño).

Revisa si las instrucciones if son capaces de comprobar datos de 16-bits, en todo caso los 16-bits sólo te sirven para la temperatura, los demás puedes ponerlos a 8-bits.

Suerte!!! ;)

muahahaha tenías razón, se me escapó ese detalle iba tan despistado que se me fué... realmente lo único que tenía mal es la línea donde dice...
Código: [Seleccionar]
i=bit_test(temp,31); //Esto lee el bit número 32 (0-31)
El caso es que la variable temp estaba definida como una variable de 16 bits y yo pretendia leer el 32º bit.. o sea.. puros ceros, con lo que la temperatura que muestra sin fallos es la positiva...

Código: [Seleccionar]
i=bit_test(temp,15); //Y esto lee el bit número 16 (0-15)
El resto del código funciona bien aunque lo revisaré porque no me acuerdo del motivo que tuve de poner eso de...

Código: [Seleccionar]
z=temp%=10;
La instrucción que dices de...

Código: [Seleccionar]
if(i==1||i==0){
la tuve que poner porque quería que lo que hay entre "{" se ejecutara tanto si vale i=1 como si vale i=0. Lo hice de otra forma pero no sirvió de mucho. El caso es que funciona jejeje

Ahora muestra a la "perfección" la temperatura :P
Digo "perfección" porque no es exacta del todo ya que a lo mejor se va algunos miligrados según la escala que hice y que más se aproxima a una temperatura medida con un termómetro de mercurio.

Ya solo me queda hacer lo mismo con los 3 puertos de entrada restantes.

Gracias a vosotros he logrado dar el paso que tanto me angustiaba jejeje.

Iré poniendo los avances del proyecto por si alguien lo necesita si os parece bien :)
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Ayuda con Sensor de Temperatura con 16F876
« Respuesta #16 en: 05 de Enero de 2007, 15:04:39 »
Me alegro que al final funcionase ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: Ayuda con Sensor de Temperatura con 16F876
« Respuesta #17 en: 06 de Enero de 2007, 16:19:43 »
Me alegro que al final funcionase ;)

Gracias vszener  :-) ahora mi próximo reto será que muestre las 4 temperaturas a la vez.

Ah por cierto... lo del código que dudábais...

Código: [Seleccionar]
z=temp%=10;
realmente seria :
Código: [Seleccionar]
z=temp%10;
Revisé el código y se me escapó eso. Aunque por algun motivo no da error en el compilador está mal.
« Última modificación: 09 de Enero de 2007, 17:03:07 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.

Desconectado Ernie-

  • PIC12
  • **
  • Mensajes: 56
Re: Ayuda con Sensor de Temperatura con 16F876
« Respuesta #18 en: 10 de Enero de 2007, 20:36:48 »
Holas jeje aquí estoy de nuevo... tengo problemas con el puerto C resulta que ahí pondré una alarma pero el caso es que ni siquiera es capaz de activar un simple LED. Utilizaré las salidas C0-C3. Pero la instrucción que yo creía que activaría la salida C0 no lo hace correctamente, alquien sabe porque? Gracias.

Aquí está el código:
Código: [Seleccionar]
#include <16f876.h>
#device ADC=10
#use delay (clock=4000000)
#include <lcd3.c>
       
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07

#byte tris_a=0x85
#byte tris_b=0x86
#byte tris_c=0x87

void main() {
    int16 value;
int16 temp;
int16 a,b,x,z,i;

int8 laX,laY;
int8 menosX,menosY;
int8 canal;

lcd_init();

    tris_a=0xFF;
    tris_b=0x00;
    tris_c=0x00;


    setup_adc(ADC_CLOCK_INTERNAL);
    setup_adc_ports(ALL_ANALOG);

canal=0;

lcd_gotoxy(1,1);
lcd_putc("T1=    ");
lcd_gotoxy(10,1);
lcd_putc("T2=    ");
lcd_gotoxy(1,2);
lcd_putc("T3=    ");
lcd_gotoxy(10,2);
lcd_putc("T4=    ");

    while(TRUE) {

set_adc_channel(canal);
    value=read_adc();

temp=((17*value)/85)-55;

//Test bits
//Si el bit de más peso es "1" entonces es negativo, de lo contrario es positivo
i=bit_test(temp,15); //Esta instrucción ya hace el complemento a 2

//La temperatura es de menor de 0
if(i==1||i==0){ //comprobar el bit de más peso para empezar en una posicion X o en otra
//tanto si es 1 como si es 0 hacer el bucle

switch(canal) //comprobar el canal
{
case 0: //es el canal 0
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
  case 0: //el bit de mas peso es "0" (positivo)
  menosX=4;
  menosY=1;
                                  laX=4; //Empezar en la posicion 4 para no mostrar el signo "-"
  laY=1;
  break;

  case 1: //el bit de mas peso es "1" (negativo)
          //Deshacer el complemento a 2
          temp=temp-1;
          temp=~temp;
  menosX=4;
  menosY=1;
          laX=5; //Empezar en la posicion 5 para mostrar el signo "-"
  laY=1;
  break;
         }
break;

case 1: //es el canal 1
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
  case 0: //el bit de mas peso es "0" (positivo)
  menosX=13;
  menosY=1;
                                  laX=13; //Empezar en la posicion 13 para no mostrar el signo "-"
  laY=1;
  break;

  case 1: //el bit de mas peso es "1" (negativo)
          //Deshacer el complemento a 2
          temp=temp-1;
          temp=~temp;
  menosX=13;
  menosY=1;
          laX=14; //Empezar en la posicion 14 para mostrar el signo "-"
  laY=1;
  break;
         }
break;

case 2: //es el canal 2
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
  case 0: //el bit de mas peso es "0" (positivo)
  menosX=4;
  menosY=2;
                                  laX=4; //Empezar en la posicion 4 para no mostrar el signo "-"
  laY=2;
  break;

  case 1: //el bit de mas peso es "1" (negativo)
          //Deshacer el complemento a 2
          temp=temp-1;
          temp=~temp;
  menosX=4;
  menosY=2;
          laX=5; //Empezar en la posicion 5 para mostrar el signo "-"
  laY=2;
  break;
         }
break;

case 3: //es el canal 3
switch(i) //comprobar si es 1 o 0 para poner el signo negativo
{
  case 0: //el bit de mas peso es "0" (positivo)
  menosX=13;
  menosY=2;
                                  laX=13; //Empezar en la posicion 13 para no mostrar el signo "-"
  laY=2;
  break;

  case 1: //el bit de mas peso es "1" (negativo)
          //Deshacer el complemento a 2
          temp=temp-1;
          temp=~temp;
  menosX=13;
  menosY=2;
          laX=14; //Empezar en la posicion 14 para mostrar el signo "-"
  laY=2;
  break;
         }
break;
       }
 
//Cálculos
a=temp/10;
z=temp%10;
b=a/10;
x=a%10;

switch(canal){
case 0:
lcd_gotoxy(1,1);
lcd_putc("T1=    ");
               break;
case 1:
lcd_gotoxy(10,1);
lcd_putc("T2=    ");
       break;
case 2:
lcd_gotoxy(1,2);
lcd_putc("T3=    ");
       break;
case 3:
lcd_gotoxy(10,2);
lcd_putc("T4=    ");
       break;
     }

if(b==0 && x>0){
lcd_gotoxy(menosX,menosY);
lcd_putc("-");
lcd_putc(0); //volvemos a escribir
lcd_gotoxy(laX,laY);
lcd_putc(48+x); //volvemos a escribir
lcd_gotoxy(laX+1,laY);
delay_ms(2); //esperamos...
lcd_putc(48+z); //volvemos a escribir
lcd_gotoxy(laX+2,laY);
delay_ms(2); //esperamos...
lcd_putc(223); //volvemos a escribir
lcd_gotoxy(laX+3,laY);

delay_ms(1000);
lcd_enviar(LCD_COMANDO, LCD_HOME); //cursor al principio
}

else if(b==0 && x==0){
lcd_gotoxy(menosX,menosY);
lcd_putc("-");
lcd_putc(0); //volvemos a escribir
lcd_gotoxy(laX,laY);
delay_ms(2);
lcd_putc(48+z); //volvemos a escribir
lcd_gotoxy(laX+1,laY);
delay_ms(2); //esperamos...
lcd_putc(223); //volvemos a escribir
lcd_gotoxy(laX+2,laY);

delay_ms(1000);
lcd_enviar(LCD_COMANDO, LCD_HOME); //cursor al principio
}

else{
lcd_gotoxy(menosX,menosY);
lcd_putc("-");
lcd_putc(0); //volvemos a escribir
lcd_gotoxy(laX,laY);
delay_ms(2); //esperamos...
lcd_putc(48+b); //escribimos en el LCD
lcd_gotoxy(laX+1,laY);    //posicionamos
delay_ms(2); //esperamos...
lcd_putc(48+x); //volvemos a escribir
lcd_gotoxy(laX+2,laY);
delay_ms(2); //esperamos...
lcd_putc(48+z); //volvemos a escribir
lcd_gotoxy(laX+3,laY);
delay_ms(2); //esperamos...
lcd_putc(223); //volvemos a escribir
lcd_gotoxy(laX+4,laY);

delay_ms(1000); //volvemos a esperar
lcd_enviar(LCD_COMANDO, LCD_HOME); //cursor al principio
    }
    }//Fin del else
switch(canal)
{
case 0:
canal=1;
break;
case 1:
canal=2;
break;
case 2:
canal=3;
break;
case 3:
canal=0;
break;
}
output_bit(PIN_C0,1); //Esto no funciona, debería activarse el bit 0 del puerto C
} //Fin del while
   } //Fin del main

SOLUCIONADO: El fallo lo tenía en LCD3.C. Estaba haciendo referencia al puerto C como entrada cuando lo que se pretendía era usarlo como salida. Cambié todas las referencias al puerto C dentro del LCD3.C a
Código: [Seleccionar]
set_tris_c(0x00); //Establecer como salida todos los bits del puerto C
« Última modificación: 17 de Enero de 2007, 17:16:15 por Ernie- »
La mitad del mundo tiene algo que decir, pero no puede; la otra mitad no tiene nada que decir, pero no calla. Robert Lee Frost.


 

anything