Enviar resultado del convertidor A/D por la USART

Hola amigos. En mi primer post en este foro quiero pediros ayuda para un problema que tengo con el convertidor A/D. He estado mirando la ayuda pero no he encontrado nada parecido. A continuación os paso un trozo de código que uso para configurar y usar el convertidor A/D de una pic 18F4550.

En este código, primero configuro el convertidor y a continuación lo utilizo. He usado una resistencia variable para simular la señal analógica. Una vez realizada la conversión mando el resultado por la USART. He podido comprobar que la USART funciona bien ya que otra parte del codigo funciona solo con la USART y no tengo ningún problema. De hecho al comunicarme con el hyperterminal recibo información pero, y ahí está mi problema, solo recibo el primer byte ADRESH. No recibo el ADRESL. Por favor, ¿podríais comprobar mi código e indicarme si veis algun error? Os agradezco vuestra ayuda. Gracias.

Alejos.

Código:
...

ADCON0bits.ADON=1; 
OpenADC( ADC_FOSC_64 & 		
		ADC_RIGHT_JUST &	
		ADC_20_TAD, 		
		ADC_INT_OFF, 7 ); 

SetChanADC( ADC_CH0 );
Delay10TCYx(50); 	// trabajo a Fosc = 48MHz y 19200 baudios
ConvertADC(); 		
		
while(BusyADC())
{} 					
	
putcUSART('#');
WriteUSART(ADRESH); 
//putcUSART('#');
WriteUSART(ADRESL);
PIR1bits.ADIF=0; //No uso interrupciones pero por si acaso lo pongo a cero el flag.

...
 
El código fuente de la función WriteUSART (en directorio instalacion MCC18\src\traditional\pmc\USART\u1write.c):
Código:
void Write1USART(char data)
{
  if(TXSTA1bits.TX9)  // 9-bit mode?
  {
    TXSTA1bits.TX9D = 0;       // Set the TX9D bit according to the
    if(USART1_Status.TX_NINE)  // USART1 Tx 9th bit in status reg
      TXSTA1bits.TX9D = 1;
  }

  TXREG1 = data;      // Write the data byte to the USART2
}
veo que no hay implementada ninguna rutina de espera.
Tendrías que usar la función BusyUSART() antes de transmitir un dato:
Código:
while(BusyUSART());
WriteUSART(ADRESH);
while(BusyUSART());
WriteUSART(ADRESL);
 

Adjuntos

  • funcion_busyusart_148.gif
    funcion_busyusart_148.gif
    24.5 KB · Visitas: 13
Hola Ardogan, muchas gracias por tu respuesta, a primera vista parece que tienes razón, debería esperar un tiempo hasta que se transmita el primer registro antes de mandar el segundo. El problema es que en estos días no voy a poder probar tu solución debido a que me encuentro de vacaciones y el proyecto que estoy desarrollando lo tengo en el trabajo así que hasta dentro de dos semanas no voy a poder probarlo. De todos modos, ten por seguro que tendré en cuenta tu respuesta y será la primera prueba que haga para solucionar el problema.

También te quería comentar que en el mismo proyecto en otra parte del código hago esto:

Código:
putcUSART('#');
WriteUSART(buffer[1]);
putrsUSART("HI");

y cuando ejecuto el programa, todo funciona perfectamente. Recibo algo del tipo "#3HI" que sería lo que espero. Como ves ahí no he esperado ningún tiempo para mandar todo por la USART y funciona. ¿Qué diferencia hay entre este codigo sin esperar y el que tú me propones?.

Muchas gracias.

Saludos
Alejos
 
Ahí si soné, no tengo idea de por qué, jajaja.

Aunque ahora que veo ese " putrsUSART("HI") ".... a ver que tiene adentro:
Código:
void putrs1USART(const rom char *data)
{
  do
  {  // Transmit a byte
    while(Busy1USART());
    putc1USART(*data);
  } while( *data++ );
}

sí, acá esta incluída la instrucción de espera (es una falta de coherencia con putc y writeusart).
Creo que la cosa es así, al escribir el 1er byte al usart este pasa directamente al registro TSR (no accesible al programador) para ser transmitido.
Cuando se pasa el 2do byte mientras todavía está transmitiendo el 1ro, este pasa al registro TXREG pero no se carga inmediatamente a TSR sino que espera a que se haya transmitido el bit de parada del anterior.
Hoja de datos del PIC18f4550 dijo:
The TXREG register is loaded with data in
software. The TSR register is not loaded until the Stop
bit has been transmitted from the previous load. As
soon as the Stop bit is transmitted, the TSR is loaded
with new data from the TXREG register (if available)

Ahora al escribir el 3ro sin esperar se cambia el valor de TXREG, es decir, no se llega a transmitir el segundo byte siendo que todavía está transmitiéndose el primero.
Luego como no hay más escrituras, el 3er byte se transmite al concluir la transmisión del 1ro.

En el código con putrs eso no sucede porque antes de escribir el 3er byte se espera a que concluya la transmisión del 1ro. Cuando termina la transmisión del 1ro se carga el 2do que estaba en TXREG a TSR, y se pone a 0 el flag que testea BusyADC, y recién ahí se escribe TXREG.

Es como si fuera un buffer de dos bytes en definitiva
 
Atrás
Arriba