Problemas conversor analogico digital

Hola a todos.

Necesito enviar por rs232 datos que voy leyendo del conversor Analogico-Digital cada 50us y despues representarlos en labview, el problema es que solo leo una media de 8 puntos por cada periodo y necesitaria tener mas.

La forma como lo realizo es con la interrupcion timer0 para la lectura del conversor y la interrupcion rda para comunicarlo, utilizo programa ccs.

Gracias a todos.
 
el problema es que solo leo una media de 8 puntos por cada periodo y necesitaria tener mas.
te refieres a que solo puedes hacer 8 medidas? ten en cuenta que 50us es muy poco tiempo y el micro necesita un minimo para hacer la conversion entera. lo unico que puedes hacer, si ese es tu problema, es cambiar de micro por uno mas potente.
 
Hola a todos.

Necesito enviar por rs232 datos que voy leyendo del conversor Analogico-Digital cada 50us y despues representarlos en labview, el problema es que solo leo una media de 8 puntos por cada periodo y necesitaria tener mas.

La forma como lo realizo es con la interrupcion timer0 para la lectura del conversor y la interrupcion rda para comunicarlo, utilizo programa ccs.

Gracias a todos.

hola neoakira para lo que tu dices tienes que tener en cuenta muchas cosas como el tiempo mínimo de conversión el tipo de microcontrolador y a que velocidad del cristal lo utilizas también el tiempo que demora la transmisión vía RS232.

lo que podrías hacer es colocar el adc con la interrupción activa y cada ves que ocurra la interrupción se valla sumando a una variable y un contador que me diga cuantas medidas tomo para después dividirlo ypara el envió de esto si podrías programar que el micro haga esa la parte de la división y me active la transmisión no que haga la transmisión solo que la active con el timer0 ejemplo que cada 50 ms me tome mi variable en donde estoy guardando las sumas del adc me las divida por el contador y me active una bandera para que el micro al salir de la interrupción empiece a transmitir es algo como ponerlo en tiempo real me avisas si no me hice entender

revisa esto creo que es lo que necesitas este programa me esta tomando el promedio de las muestras cada 49.957 ms y enviando esto via rs 232 un promedio de 47 muestras en el transcurso de ese tiempo. si necesitas mas cantidad de muestras modifica en reloj del adc colocando un ADC_CLOCK_DIV_2 en el esta función setup_adc(ADC_CLOCK_DIV_64);

saludos

Código:
#include <16F877A.h> 
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

unsigned int32 sumatoria;
unsigned int   contador=0, bandera =0;
int16 ADC;
float media;

#int_RTCC
void  RTCC_isr(void)
{ 
  bandera=1;
  set_timer0(61);  
}

#int_AD
void  AD_isr(void) 
{
   contador++;
   ADC=read_adc(adc_read_only); //lee el resultado de la conversion
   sumatoria=sumatoria+ADC;
   read_adc(ADC_START_ONLY);                    //linicia la conversión solamente 
}



void main()
{
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_64);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_timer0(61);
   enable_interrupts(INT_RTCC);
   enable_interrupts(INT_AD);
   enable_interrupts(GLOBAL);
   set_adc_channel(0);     //the next read_adc call will read channel 0
   delay_us(10);           //a small delay is required after setting the channel
   read_adc(ADC_START_ONLY);
 
   while(TRUE){
      if(bandera==1){
         media=sumatoria /((float) contador+1); 
         printf("sumatoria = %LU  muestras = %U  media= %.0f \n\r"sumatoria,contador,media); 
         contador  =0;
         sumatoria =0;
         bandera   =0;
      }
   }
}
 
Última edición:
hola que tal en la universidad me pusieron hacer una tarea de hacer una especie de sistema de cultivación de humedad tempe, y presión y que lo hiciéramos con potenciómetros mi yo se ingresar la seña analógica y convertirla a digital y todo eso y me funciona bien pero resulta que tengo que hacer que se elegir entre ver temp, presión y humedad este dato lo selecciono con un teclado 4*3 pero al momento de ingresar digamos ejemplo temperatura que sea la opción 1 entra al switch y cuando vario el potenciómetro ya no me cambia pero cuando le quito el switch y el if ahora si me cambia, alguna idea?

Código:
#include <main.h>
#include "flex_lcd.c"
#include "kbd_lib.c"
float valordig;
float valor;
char k;
void main()
{
 setup_adc_ports(AN0_TO_AN2|VSS_VDD);
  setup_adc(ADC_CLOCK_DIV_32);
    
   lcd_init();
   kbd_init();
   set_tris_a(0xFF);
    port_b_pullups(true);
   lcd_gotoxy(3,1);
   lcd_putc("ingrese un");
   delay_ms(250);
   


   while(TRUE)
   {
   
  k=kbd_getc();
  
  if (k!='\0')
  {
  
  switch (k)
  {
  
  
  case '1':
  
  
  
  
  //asigana el canal 0 al conversor o leer el canal 0 
   set_adc_channel(0);
   delay_us(2);
   valordig=read_adc();
     lcd_gotoxy(1,1);
  
   valor=((5*valordig)/1024);
   lcd_gotoxy(1,2);
   printf (lcd_putc,"temp es:%f",valor);
   delay_ms(100); 
   break;
   
    }
    
    
  }
   lcd_gotoxy(1,2);
  printf (lcd_putc,"%d",k);
     
   }

}
 
Última edición por un moderador:
Asi como esta escrito, segun creo, te va a actualizar las lecturas solo mientras apretas una tecla. Tenes que hacer dos bucles separados, uno que lee las teclas y otro que lee las entradas analogicas segun el valor de la ultima tecla presionada
 
primero que todo gracias por responder si pudieras explicarme un poco mas lo de los bucles es decir tengo que guardar la variable en k y posteriormente fuera del if hacer ya el switch???
y si es asi es que siempre tenido el problema de poder agarrar (por asi decirlo) numeros ingresados por eso ingrese esa programcion con el if si tuvieras alguna sugerencia me ayudarias mucho (ojo no busco que me lo hagas)
GRACIAS DE ANTEMANO
 
Fijate que la lectura del adc esta dentro del switch. Ponela fuera del switch y pensa como lo harias

Suerte (puede ser que exagere al hablar de dos bucles, tenes solamente que poner el comando de lectura del adc fuera del switch)
 
ya pude resolver el problema alguien sabe como establecer una especie de punto (por asi decirlo) donde cuando se llegue a este regrese a otro punto del programa
 
Última edición:
estuve buscando algo sobre el GOTO es que mi problema es que necesito depues de un if se queda allí entonces necesito que regrese a un punto del principio del programa decidi utlizarlo pero no me sale es algo a si





sal:

// resto del programa




if (valor>=80)
{

output_high(PIN_C4);
delay_ms(100);
output_low(PIN_C4);

goto sal;
}
que puede estar mal??
gracias
 
Atrás
Arriba