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.