Autor Tema: Problemas con A/D y delay  (Leído 1425 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RxTx

  • PIC10
  • *
  • Mensajes: 7
Problemas con A/D y delay
« en: 05 de Diciembre de 2005, 12:49:00 »
Buenas tardes a todos.
Soy nuevo en esto de programar pics y estoy teniendo un problema con el programa que estoy haciendo.

Para empezar los delay de 5 segundos que estoy usando me lo hace pero no durante 5 segundos sino unos 20 o asi y si les pongo un retardo menor no me hace nada de nada, ¿por que puede ser? ¿Cuanto tarda en hacer la conversion A/D el pic?
Aqui abajo pongo el código para ver en que me equivoco.

Otra cuestión, como veis en el código uso las entradas analogicas A0 y A1 y el resto A2...A5 las configuro como salidas digitales, ¿se puede hacer esto o habría algun problema?

Gracias a todos por vuestras respuestas, aqui dejo el código.

#include <16F876A.h>

#device adc=10      
#fuses XT,NOPROTECT,NOPUT,NOWDT,NOBROWNOUT,NOLVP,NOCPD
#use delay (clock=8000000)

void analog(int fun, float &pri, float &sec)  
{  
   long valor;

   set_adc_channel (0);
   valor = read_adc();  
   pri= valor*(5.0/1024.0);  
   if(fun=1){  
      pri= valor*(5.0/1024.0);  
      set_adc_channel (1);  
      valor = read_adc();
      sec= valor*(5.0/1024.0);  
   }
}
void main( void )

{

   float aux1;
   float aux2;
   int aux;  

   set_tris_a(0x03);
   set_tris_b(0xFC);
   
   setup_adc_ports(RA0_ANALOG);
   setup_adc (ADC_CLOCK_INTERNAL);

   aux=1;
   aux1=0;
   aux2=0;

   while(1){  
      delay_ms(5000);  
      analog(aux,aux2,aux1);

      if(aux2>=2.5){  
         output_high(PIN_B0);  
      }
      if(aux1>=2.5){  
         output_high(PIN_B1);  
      }
      delay_ms(5000);  
      output_low(PIN_B0);  
      output_low(PIN_B1);
   }
}

Desconectado RxTx

  • PIC10
  • *
  • Mensajes: 7
RE: Problemas con A/D y delay
« Respuesta #1 en: 05 de Diciembre de 2005, 19:32:00 »
He estado haciendo pruebas y he quitado todo lo referente al convertidor A/D.

He echo un programita que  encienda un led, espere un tiempo lo apage, espere un segundo y lo vuelva a encender y me sigue sin funcionar Llorando.

Creo que prodria ser que el programador, estoy usando un T20 para programar el 16F876A, ya que vi en un post del foro que alguien lo estaba usando y le iva bien.

¿Pueder ser el Programador? Si es asi aque programador me recomiendan que vaya bien con el 16F876A y a ser posible rápido de montar.Gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Problemas con A/D y delay
« Respuesta #2 en: 05 de Diciembre de 2005, 21:50:00 »
Antes de citar tu post, queria decirte que si tu pic anda, pero no como tu esperas, gralmente suele ser un problema de "software" , no de hardware o del programador que utilices.

Escrito originalmente por RxTx
Buenas tardes a todos.
Soy nuevo en esto de programar pics y estoy teniendo un problema con el programa que estoy haciendo.

Para empezar los delay de 5 segundos que estoy usando me lo hace pero no durante 5 segundos sino unos 20 o asi y si les pongo un retardo menor no me hace nada de nada, ¿por que puede ser?



Ya veremos cuando analicemos mejor el código, seguramente es algun bug en la rutina de delay del compilador ccs o en tu código.


Cita:

¿Cuanto tarda en hacer la conversion A/D el pic?


Pues, depende del dispositivo y del clock que uses,  pero a 20Mhz, puede tardar 1.6 a 2 useg.  (aunque debes tener en cuenta el sampling time cuando pasas de canal el conversor.


Cita:

Otra cuestión, como veis en el código uso las entradas analogicas A0 y A1 y el resto A2...A5 las configuro como salidas digitales, ¿se puede hacer esto o habría algun problema?



No, no debiera haber problema con esto.

Cita:

Codigo:

#include <16F876A.h>

#device adc=10      
#fuses XT,NOPROTECT,NOPUT,NOWDT,NOBROWNOUT,NOLVP,NOCPD
#use delay (clock=8000000)





Aca hay una incongruencia, si utilizas un XTAL de 8Mhz, debes setear el oscilador como HS.

Cita:

Codigo:


void analog(int fun, float &pri, float &sec)  
{  
   long valor;

   set_adc_channel (0);
   valor = read_adc();  
   pri= valor*(5.0/1024.0);  
   if(fun=1){  
      pri= valor*(5.0/1024.0);  
      set_adc_channel (1);  
      valor = read_adc();
      sec= valor*(5.0/1024.0);  
   }
}




las rutinas de multiplicacion de coma flotante le llevan al microcontrolador muuuuuchos ciclos para llevarse a cabo... debes plantearte si realmente necesitas utilizar variables float.  Yo creo que para lo que haces no son necesarias.  Tranquilamente podrias comparar con 512 si quisieras, en vez de hacerlo con 2.5
Otro tema, fijate el if (fun=1), realmente quieres hacer una asignacion a fun en 1? o estas chequeando? si estas chequeando en C se usa ==


Cita:

Codigo:


void main( void )

{

   float aux1;
   float aux2;
   int aux;  

   set_tris_a(0x03);
   set_tris_b(0xFC);
   
   setup_adc_ports(RA0_ANALOG);
   setup_adc (ADC_CLOCK_INTERNAL);

   aux=1;
   aux1=0;
   aux2=0;

   while(1){  
      delay_ms(5000);  
      analog(aux,aux2,aux1);

      if(aux2>=2.5){  
         output_high(PIN_B0);  
      }
      if(aux1>=2.5){  
         output_high(PIN_B1);  
      }
      delay_ms(5000);  
      output_low(PIN_B0);  
      output_low(PIN_B1);
   }
}



Fijate, tu hablas de utilizar el CH0 y CH1 pero solo seteas el canal analogo 0!
Otro tema, fijate si no me equivoco, la funcion delay_ms, recibe argumentos de 0 a 255, y tu le estas mandando 5000!  no se cual valor tome el compilador pero no hará lo que tu deseas con seguridad, entonces seguramente está oscilando muy velozmente y a ti te parecec que está fijo.

Espero haberte ayudado.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado RxTx

  • PIC10
  • *
  • Mensajes: 7
RE: Problemas con A/D y delay
« Respuesta #3 en: 06 de Diciembre de 2005, 03:45:00 »
Muchas gracias maunix por tu respuesta, te comento algunas cosillas de las que me dices:


1º-. Me dices que si uso un XTAL de 8MHz tengo que setear el oscilador a HS, ¿que es esto y para que vale? Como digo soy nuevo programando pic y no tengo mucha idea.

2º-.  Tienes razon en lo del fun=1 no es una asignacion sino una comparación por tanto fun==1. Tambien estoy pensando en quitar todas las operaciones en coma flotante que pueda.

3º-. Los delay_ms(5000) los pongo asi porque segun un manual del compilador CCS que tengo, tanto delay_ms como delay_us su rango de trabajo va de 0 a 65535. Por tanto si uso delay_ms(5000) retardo 5 segundos directamente pudiendo retardar hasta 65 segundos, (segun este manual que tengo).

4º-. Tienes razon en que solo configuro el puerto 0 como analogico pero la instrucción setup_adc_ports(RA0_RA1_ANALOG); me da un error "UNDEFINIED IDENTIFIER RA0_RA1_ANALOG" cuando compilo, tambien me dan este mismo error las expresiones setup_adc_ports(RA1_ANALOG); y setup_adc_ports(AN1);.

Lo malo de todo esto es que no lo puedo probar nada de lo que me dices porque como momenta en el anterior post estoy usando un TE20 y el ICProg y ahora (antes no lo hacia) me da error de:     fallo en la direccion 0000h.

Estoy mirando a ver que encuentro para ver a que se debe pero no tengo ni idea si me pueden ayudar. Gracias de nuevo.



 

anything