Autor Tema: dsPIC, UART y ADC.  (Leído 3565 veces)

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

Desconectado Sarge

  • PIC10
  • *
  • Mensajes: 14
dsPIC, UART y ADC.
« en: 03 de Diciembre de 2014, 20:37:43 »
Hola soy yo de nuevo, como dije anteriormente ahora voy ha hacer algo más complicado, enviar el resultado del ADC por el UART hacia una tablet, estoy modificando un programa de ejemplo de mikcroC y me surgió una duda, el ADC del 30F0413 da una conversión de 12 bits pero el UART solo puede mandar 8bits así que se supone que se deben mandar primero 8 y después 4 (bits) pero como jamás he trabajado con el UART ni de un pic pues no se como se haría eso, este es el código que tengo:

Código: [Seleccionar]
unsigned adcdata;
char txt[6];
long volt;


void main() {
  ADPCFG=0xFFFF;
  PORTB = 0x0000;
  TRISB.F2 = 1;       // set pin as input - needed for ADC to work
  ADC1_Init_Advanced( _ADC_EXTERNAL_VREFH | _ADC_EXTERNAL_VREFL);   //Se seleccionan los pines RB0 y RB1 como Vref+ y Vref-
  UART1_Init(9600);

  while (1) {
    adcdata = ADC1_Read(2);
    volt=(long)adcdata*5000;
    volt=volt/4096;
    WordToStr(volt, txt);
    UART1_Write_Text(txt);
    Delay_ms(50);
  }
}



Estoy mandando por el UART pero sin hacer esa partición así que obvio los datos son incorrectos, ¿alguien me podría explicar como hacer esa partición? gracias por su ayuda. :-/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: dsPIC, UART y ADC.
« Respuesta #1 en: 03 de Diciembre de 2014, 21:15:52 »
En realidad mandas 2 de 8 bits.

D - Dato
1er byte DDDD DDDD
2do byte 0000 DDDD

y listo :3 y de preferencia para que no ocupe muchos cilos de reloj la tablet que sea quien haga la operacion (valor/4095) * 5 , asi te da en voltios xD

Y con respecto a mandarlos, generalmente uno especifica la cantidad de bits a mandar, asi como tambien bit de stop, etc. y del lado del receptor es igual.
Imagino que el UART1_Write_Text(), enviara uno por uno los bytes. Te libras de pensar lo que te dije arriba.

Es mikroC no ?
http://www.mouser.com/ds/2/272/mikroc_pro_for_dspic_manual_v100-15136.pdf

// dsPIC33FJ and PIC24HJ prototype
void ADCx_Init_Advanced(unsigned ADCMode, unsigned Reference);
Ejemplo: ADC1_Init_Advanced(_ADC_12bit, _ADC_INTERNAL_REF); // sets ADC module in 12-bit resolution mode with internal reference used

Si es otro estaria bueno que me lo dijeras para no mandar cualquier cosa XD
« Última modificación: 03 de Diciembre de 2014, 21:54:48 por KILLERJC »

Desconectado Sarge

  • PIC10
  • *
  • Mensajes: 14
Re: dsPIC, UART y ADC.
« Respuesta #2 en: 04 de Diciembre de 2014, 13:58:38 »
Si es en mikroC, ¿dices realizar la conversión en la tablet? creo que si se puede ya que en App Inventorse pueden realizar operaciones aritmetcias, OK voy a probar lo que dices espero me salga. :-)

Desconectado Sarge

  • PIC10
  • *
  • Mensajes: 14
Re: dsPIC, UART y ADC.
« Respuesta #3 en: 20 de Enero de 2015, 18:17:08 »
Hola, soy yo, después de tanto tiempo he vuelto pero con varias dudas.

Como sabrán estoy haciendo una conversión ADC usando App Inventor 2 y MikroC for dsPIC, bueno la tablet hace la operación de conversión, el dspic slo manda datos, la cuestión es que necesito hacer un arreglo o "array" donde almacene 10 mediciones y después hacer un promedio, la cuestión es que nunca he usado los arryas, ¿alguien podría explicarme como hacerlo?
les dejo el código:

Código: [Seleccionar]
unsigned adcdata;
char entrada;
char txt[4];
float vector_one[10];
float average;



//long volt;


void main() {
  ADPCFG=0xFFFF;
  PORTB = 0x0000;
  TRISB.F2 = 1;       // set pin as input - needed for ADC to work
  ADC1_Init_Advanced(_ADC_EXTERNAL_REF);   //Se seleccionan los pines RB0 y RB1 como Vref+ y Vref-
  UART1_Init(9600);
  //Delay_ms(100);
 


  while (1) { 
 
  adcdata=ADC1_Read(2);
 
  if (UART1_Data_Ready()==1) {
 
  entrada=UART1_Read();


   
    if (entrada=='t') {
    adcdata=ADC1_Get_Sample(2);
    WordToStr(adcdata, txt);
    UART1_Write_Text(txt);
    Delay_ms(500);
   
               }
          }
     }
}

Gracias por su ayuda.


 

anything