아트메가/이론

ATMEGA128 UART 수신인터럽트 발생하는 시점

원원 2023. 1. 8. 16:44

안녕하세요. 오늘은 ATMEGA128 UART 수신 인터럽트 함수가 호출되는 시점이 언제인지 알아보겠습니다.


RX 핀이 HIGH로 유지하고 있다가 UART를 수신하면 인터럽트가 뜨는데 수신 인터럽트가 뜨는 시점이 HIGH -> LOW 될 때 바로인지, STOP bit 수신했을 때인지 알아보는 내용입니다.

수신인터럽트는 아래의  함수입니다.

ISR(USART0_RX_vect)

테스트방법은 수신인터럽트가 발생하면 포트1개를 LOW->HIGH로 바꾸는 시간을 측정하겠습니다

UART 세팅은 115200bps, 8bit, 1stop bit, no parity입니다. 그러므로 총 10비트이고 1비트당 8.68us고 10비트면 86.8입니다.

데이터를 보내고나서 87.664us후에 수신인터럽트가 발생했습니다. 10비트모두 수신하고나서 인터럽트가 발생한걸 알 수 있습니다.

그럼 이제 UART 세팅을 115200bps, 8bit, 1stop bit, parity로 바꿔서 11비트를 수신하고나서 인터럽트가 뜨는 파형을 보겠습니다. 96.872us만에 인터럽트가 발생했고 10비트때랑 차이가 9.208us 납니다. 8.68us이랑 차이가 나는 이유는 측정장비+ IO가 HIGH 올라가는 시간인거 같습니다.

 

RX PIN에 GND를 연결하면 역시 동일하게 파형이 나옵니다. UART 세팅은 115200bps, 8bit, 1stop bit, no parity입니다

이렇게 Frame Error가 났을경우, 알려주는 레지스터가 있는데 UCSR0A - FEn입니다

This bit is set if the next character in the receive buffer had a Frame Error when received. I.e.
when the first stop bit of the next character in the receive buffer is zero. This bit is valid until the
receive buffer (UDRn) is read. The FEn bit is zero when the stop bit of received data is one.
Always set this bit to zero when writing to UCSRnA.

평상시에는 UCSR0A가 0x20입니다. 

 

정상적인 데이터가 들어왔을경우 먼저 보겠습니다.

정상적인 데이터가 들어왔을때는 0xa0가 됩니다.

UDR0을 읽고나서 다시 0x20이 됩니다.

 

정상적인 데이터말고 RX핀에 gnd를 연결했을때를 보겠습니다.

RX핀에 GND를 계속 연결해놨으므로 stop bit 시점에서도 LOW입니다. 그래서 FEn 비트가 set 됬습니다.

UDR0을 읽고나서 다시 0x20로 됬습니다.

그래서 결론적으로는 수신 인터럽트가 발생했을 때 에러상태 레지스터를 검사하지 않고 변수에 UDR0을 바로 넣으면 잘못된 값이 들어갈 수도 있습니다. [수신 인터럽트 발생 -> 에러상태 레지스터 검사] 이런 식으로 코드를 작성한다면 그렇게 하지 않을 때보다 더 안전하게 데이터를 처리할 수 있습니다.