evitando que los datos Rx / Tx entren en conflicto en un USART xmega

0

Estoy usando el módulo USART en un atxmega128a1 para comunicarme con una PC, y he notado que recibir y transmitir un byte usa la misma dirección de registro de datos:

Mipreguntaes,entonces,siestoyenmediodetransmitirunbyteFUERAdeesteregistrodedatos,¿cómopuedoevitarqueunainterrupciónactivadaporunbytequeingresaINhagaquepierdadatos?

MicódigoactualutilizabuffersFIFOdelsoftwareRxyTx,unainterrupciónparaactivarunbyterecibidoyunainterrupcióndeltemporizadorparagenerarunbyteperiódicamentedesdemiTxFIFO:

//interrupttoreceiveabyte(RS232)ISR(USARTD0_RXC_vect){//ISRforwhenreceiveflagissetif(FIFO_Put(&RxFIFO,USARTD0_DATA)){//putdataintoreceiveFIFOUSARTD0_STATUS|=USART_RXCIF_bm;//write1toclearbit}while(!(USARTD1_STATUS&USART_DREIF_bm));//waituntildataregisterisempty}ISR(TCC1_OVF_vect){unsignedchardata;if(FIFO_Get(&TxFIFO,&data)){//placeabytefromFIFOinto&datawhile(!(USARTD1_STATUS&USART_DREIF_bm));//ifTxFIFOhasdata,waituntildataregisterisemptyUSARTD0_DATA=data;//putitinthedatabufferwhile(!(USARTD0_STATUS&USART_TXCIF_bm));//waituntiltransfercompleteUSARTD0_STATUS|=USART_TXCIF_bm;//write1toclearbit}}

AMBASdeestasinterrupcionessondeprioridad"baja" y el servicio de interrupción de turno rotativo está habilitado. Quiero aumentar el período de la interrupción del temporizador, pero cualquier interrupción de más de 5 ms hace que se pierdan los datos. Utilizaría RTS / CTS, pero primero quiero saber cuáles son mis opciones, ya que creo que el xmega es capaz de hacer lo que quiero sin pérdida de datos.

    
pregunta Sam Bucca

2 respuestas

3
  

Mi pregunta es, entonces, si estoy en medio de transmitir un byte FUERA de este registro de datos, ¿cómo puedo evitar que una interrupción activada por un byte que ingresa IN haga que pierda datos?

No lo haces. Hay dos registros separados, a los que se accede usando la dirección misma pero diferentes . Uno contiene el último byte extraído del hardware de recepción, y el otro contiene el siguiente byte para colocarlo en el hardware de transmisión.

Si lees de DATA , accedes a RXB , y si escribes a DATA , accedes a TXB .

    
respondido por el Ignacio Vazquez-Abrams
1

Descubrí lo que estaba mal: mi interrupción del temporizador debía desactivarse durante las funciones "FIFO_Get" y "FIFO_Put".

Lo que estaba sucediendo era que el temporizador estaba interrumpiendo mientras se encontraba en medio de estas funciones, lo que corrompe los datos que se están emitiendo.

El código anterior es correcto, y gracias a @Ignacio por ayudarme a darme cuenta de que el problema está en otra parte.

    
respondido por el Sam Bucca

Lea otras preguntas en las etiquetas