[t:/]$ 지식_

시리얼 통신의 에러율 줄이기

2009/02/06

여전히 산업용 장비에서는 9600bps를 선호하고 환경도 열악한 편이다.

이더넷이든 CAN이든 진보한 환경으로 갔으면 하는 바램은 봉화 통신 시절 부터 존재해 왔지만 업계는 보수적이다.

대한민국 육군도 웍스테이션 통신 탑차를 운영하는 시절에 아이고..

1. 레벨 매칭 회로를 왜 거기다 붙이나?

학창 시절 부터 약 100번쯤 땜질해봤다는 그 유명한 MAX232/233 회로. 실 장비에서는 주로 Sipex 칩을 쓰던데 그냥 관성대로 여전히 많이 쓰인다.

얘 좀 제발 좀 저전압 신호랑 직결하자. 주렁주렁 선을 달아놓으면 무슨 의미가 있으랴.

CPU UART PORT <-----(수 센치 이내) ---> MAX232 <---------------------------- (좀 길어도 됨) ----------------------------> 커넥터

OK?

잘못된 예 CPU UART PORT <-----(수 광년) ------------------------------> MAX232 <--> 커넥터

그냥 생각나서 비슷한 상식. 친절한 네이버씨.

http://kin.naver.com/detail/detail.php?d1id=11&dir_id=110209&eid=LHZ8PkLOplcWf7JguBDMl0eDYAFJdhGc&qb=sO2+0LzbwPwgwMzArw==

중요한 것은 이것이 아니고.

2. 보레이트 설정식은 직접 계산해 본다.

데이터 쉬트들을 보면 보레이트 계산식이 나온다. 요즘 CPU들은 클럭 소스가 아주 다양하므로 해당 소스에서 나누고 곱하고 해서 나온다.

에러율은 정수/실수 문제에서 발생한다.

예를 들어 PCLK를 쓰고 얘는 20Mhz 다.

보레이트 설정식은 20Mhz / 보레이트 / 16 분기 라고 치자.

보레이트 설정 레지스터 = 20000000 / 115200bps / 16 = 10.85 이다.

이걸 그냥 unsigned int 만 쓰고 정수 계산 밖에 안 되고 정수 밖에 입력 할 수 없는 레지스터에 넣으면 10이 들어간다. 사실은 11이 오차가 더 작다. 0.85 > 0.15

계산식에 의존해서 바로 돌렸다면 115200bps 에서 십중 팔구 에러율 오방 증가한다. 반올림 캐스팅으로 PCLK / 보레이트 / 16 + 0.5 를 해도 되지만 우리의 가난한 CPU들은 펌웨어 레벨에서 실수 연산이 안 된다 ㅠ.ㅠ

가급적이면 딱 맞아 떨어지는 클럭을 만들어서 잘 쓰도록 하는 것이 첫 번째이고. 환경이 그러하다면 정수/실수 문제를 잘 생각하자.

+) 아 좀 섀시 그라운드는 디폴트지 옵션이 아니에요.





공유하기













[t:/] is not "technology - root". dawnsea, rss