TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: tapi8 en 03 de Octubre de 2007, 14:51:06

Título: ayuda con ADC
Publicado por: tapi8 en 03 de Octubre de 2007, 14:51:06
     
     Buenas a todos

     Llevo unos dias comiendome el coco y no se como hacer esto.A ver si me explico, igual es una tonteria pero por mas vueltas que le doy no hay manera.
     En un convertidor A/D en el que voy a tener 1024 valores necesito discriminar gran parte de ellos y que solo unos pocos sean 1.Por ejemplo que sean un 1 logico entre 300 y 350 y que el resto de valores no cuenten como entrada.
     se agradeceria cualquier idea, aunque solo fuese para desatascarme y poder empezar.


   saludos y gracias por anticipado.
Título: Re: ayuda con ADC
Publicado por: RedPic en 03 de Octubre de 2007, 15:10:44
¿En qué idioma de programación?

En CCS C:

Código: C++
  1. temperatura=read_adc();
  2.  
  3.    switch(temperatura){
  4.       case 300..350:
  5.          valor=1;
  6.          break;
  7.       default:
  8.          valor=0;
  9.          break;
  10.    }
   
Así puedes insertar mas valores intermedios.
Título: Re: ayuda con ADC
Publicado por: maunix en 04 de Octubre de 2007, 10:26:10
Diego, solo por curiosidad, ¿CCS permite usar rangos en los cases o es una "delphización" del código?  :mrgreen:

Título: Re: ayuda con ADC
Publicado por: Cryn en 04 de Octubre de 2007, 10:59:57
que yo sepa no  :? pero seria bueno que alguien no los aclare.

edito:
segun el manual de NOviembre 2006 no se puede, ya que nunca hace algo asi, siempre por un valor
Título: Re: ayuda con ADC
Publicado por: LABmouse en 04 de Octubre de 2007, 11:17:06
 :shock: pos no no lo creo que se pueda.
Título: Re: ayuda con ADC
Publicado por: tapi8 en 04 de Octubre de 2007, 13:56:26

     Bueno yo  programo en asm pero estoy aprendiendo C yes posible que migre el programa al C asi que gracias Diego.
     Ademas supongo que en asm seria mas complicado.

    Saludos.
Título: Re: ayuda con ADC
Publicado por: RedPic en 04 de Octubre de 2007, 14:22:45
Diego, solo por curiosidad, ¿CCS permite usar rangos en los cases o es una "delphización" del código?  :mrgreen:

No, no se puede.  :oops:

Estoy tan acostumbrado a usar los rangos que lo he puesto sin pensarlo. Al comentarlo tú he ido a probarlo en CCS y ... me salta un error ; expected.  :oops:

Como bien dices, he caído en propia trampa delphinera.


Título: Re: ayuda con ADC
Publicado por: maunix en 04 de Octubre de 2007, 15:35:30
Como bien dices, he caído en propia trampa delphinera.

Jeje, me pasa seguido y justamente con los 'case' :) jiji, pero el C por suerte da error, jejeje.  :mrgreen: :mrgreen:

También suelo prestar atención al "=" porque en Delphi/Pascal y C son justamente bastante diferentes y ahí no da error!

Saludos

Título: Re: ayuda con ADC
Publicado por: RedPic en 04 de Octubre de 2007, 16:07:34
Pues fíjate que programo en el trabajo con C++ Builder y PHP sobre todo y en casa con CCS C y Delphi ... y estoy constantemente cometiendo errores en un idioma al usar funciones o sintaxis de otro.  :z) :z) :z)
Título: Re: ayuda con ADC
Publicado por: tapi8 en 05 de Octubre de 2007, 08:59:04
     

     Bueno entonces la unica solucion sera hacerlo valor por valor es decir 300,301,302,.....350.
Eso me va ocupar un monton de flash y no ando sobrado de ella.Creo que no me va a valer el 16f877 y por lo que mire es el que mas flash tiene de la gama 16.

    bueno saludos y gracias.
Título: Re: ayuda con ADC
Publicado por: maunix en 05 de Octubre de 2007, 10:51:47
     

     Bueno entonces la unica solucion sera hacerlo valor por valor es decir 300,301,302,.....350.
Eso me va ocupar un monton de flash y no ando sobrado de ella.Creo que no me va a valer el 16f877 y por lo que mire es el que mas flash tiene de la gama 16.

    bueno saludos y gracias.

tapi8 podrías usar una variable que contemple el rango y listo.

Por ejemplo, yendo a un ejemplo burdo


r = 0;
if ((a >= 300) && (a <= 350)) r = 1;
if ((a >= 351) && (a <= 400)) r = 2;




Y luego haces un switch de r

Saludos
Título: Re: ayuda con ADC
Publicado por: tapi8 en 05 de Octubre de 2007, 13:54:24


    Pues bien, te contare como ha ido cuando haga la migracion a C porque creo que lo tendre que pasar todo a C para usar algun PIC de la gama 18,24 o DSP, y como lo tengo en asm de 35 instrucciones. No esposible usar ese programa en la gama 18? verdad.


    saludos y gracias
Título: Re: ayuda con ADC
Publicado por: Cryn en 05 de Octubre de 2007, 14:18:33
mira aca tengo una rutina en ensamblador para el 16f877a, que convierte la entrada analógica del canal 0 RA0 a digital y lo muestra en 10 bits por el puerto B y C, dale un vistazo, solom debes configurar el adc y esperar con un retardo de 20us para cargar el muestreo creo y despues tenes el resultado en adresl y adresh, esta tb explicado en la hoja de datos:

Código: [Seleccionar]
INICIO
BANCO_0
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF TMR0
MOVLW B'11010000'
MOVWF OPTION_REG

BANCO_1
MOVLW D'0'
MOVWF TRISB
MOVLW D'252'
MOVWF TRISC
MOVLW D'255'
MOVWF TRISA

;SE INICIALIZA MODULO DE CONVERSION A/D
BANCO_0
MOVLW D'193'
MOVWF ADCON0

BANCO_1
MOVLW D'142'
MOVWF ADCON1

;LECTURA CANAL ANALÓGICO
MAIN
BANCO_0
CALL DELAY_20us     ; es una rutina de retardo qeu esta en un INC que estaba incluido en este programa
BSF ADCON0,GO

WAIT BTFSC ADCON0,GO
GOTO WAIT

MOVF ADRESH,W
MOVWF PORTC

BANCO_1
MOVF ADRESL,W
BANCO_0
MOVWF PORTB

GOTO MAIN
END

y la misma rutina pero en CCS:

Código: [Seleccionar]
//----------------------------------------------
// P5.c
// El resultado de la conversión A/D del canal0
// se muestra en el puerto b y puerto c
//----------------------------------------------

#include <16F877a.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#byte port_a=0x05
#byte port_b=0x06
#byte port_c=0x07

#byte ADRESH=0x1e
#byte ADRESL=0x9e

/*---------------------------------------------------------------------*/
void main()
{
   int16 adcValue;
   setup_adc_ports(RA0_ANALOG); //RA0 entrada analógica
   setup_adc(ADC_CLOCK_INTERNAL); // reloj interno

   set_tris_a(0xFF);
   set_tris_b(0x00);
   set_tris_c(0xBC);

   port_b=0x00;
   port_c=0x00;

   do
   {
         set_adc_channel(0);      // selecciona el canal 0
         delay_us(20);            // Retardo para carga del cap. de muestreo
         adcValue=read_adc();     // Lee el resultado de la conversion
         port_c=ADRESH;           // Parte alta de la conversion al PORTC
         port_b=ADRESL;           // Parte baja de la conversion al PORTB
         delay_ms(1000);
   } while (TRUE);
}

espero te sirva, y si tienes alguna duda acerca del codigo aca te respondemos
ahh y para lo de los rangos en ASM te sugiero que te des una vueltita por el foro del lenguaje ensamblador qeu seguro encontras una respuesta para ello, y bueno si es solo un rango talvez solo sea necesario 8 bits y no los 10 del conversor, date una miradita por ahi en el subforo

un saludo
Título: Re: ayuda con ADC
Publicado por: tapi8 en 08 de Octubre de 2007, 05:44:08

    Gracias por la aportacion Cryn, no es exactamente lo que quiero hacer pero me servira para para adaptarlo a lo que quiero hacer.

   saludos y gracias