rs 485 전송에 대해서 궁금점
atmaga128a하고 atmega8 사이의 485 통신을 위해
232 통신을 우선 해보고 485 통신을 하게 되었습니다.
그 결과 차이점이 전송이냐 수신이냐 포트를 on/off해 주는 것과
송신시 딜레이 사이클을 주는 차이가 있었습니다.
232의 경우는 딜레이를 주지 않아도 데이터가 잘 가는 반면
485에서는 각각의 비트를 보낼때 딜레이 사이클을 주거나
모든 비트를 보내고 딜레이 사이클을 주내 데이터가 제대로
전송이 되었습니다.
485 통신을 확인하는 방법으로는 kc525라는 변환기를 사용하여 232로 신호를 변환하여 보냈습니다.
그러다 보니 고민이 되는 것이
1. 변환기를 사용 할 때와 사용하지 않는 485끼리 통신과는 차이점이 큰가?
2. 각각의 비트에 딜레이를 주는 경우와 전 비트를 보내고 딜레이를 주는 경우 모두 가능한데 어쩨서 이런일이 발생하는거?
2-1. 비트를 전부 전송하고 나서 딜레이를 주는 경우 딜레이를 주는 시간에 따라 제대로 전송 받는 데이터의 양이 변하는 데 어쩨서 그런가?
이런 것입니다. 이 부분을 고민하게 된 것이 동시에 세그먼트도 보여주어야 하는데 송신이나 수신에서 시간을 생각보다 잡아 먹는 것 때문에 세그먼트가 떨리는 현상이 보이기 때문입니다.
전송 설정으로는 다음과 같습니다.
UCSR0A = 0x00;
UCSR0B = 0x98;
UCSR0C = 0x06;
UBRR0H = 0x00;
UBRR0L = 0x47; ///11.0592MHz 9600BPS
추가로 이해를 위해 필요한 걸 말씀해 주시면 올리겠습니다.
google 에서 영어 rs485 send delay로 검색해 보았으나 짧은 영어 덕분에... 일단 추가로도 찾아보고 있습니다.
ps. 이거 때문에 1달 날라먹었습니다.
추가 사항
시작 bit와 종료bit가 필요하게 되어서 총 5bit의 데이터를 보내게 되어씁니다.
5개의 비트를 보낸뒤 딜레이 사이클을 추가적으로 주지 않고 보니 지금의 딜레이 사이클을 준 만큼으로도 3개의 비트를 보내나 5개의 비트를 보내나 같이 제대로 데이터가 전송되는 것을 확인하였습니다.
단지 ... 자체적으로 보내는 시간이 2bit 만큼 커져서인지 ... 세그먼트가 엄청 깜박거려서 문제가 되고 있습니다.
정확히는 5bit 외 추가적으로 5bit 를 보내기 때문이라고 보고 있습니다.
추가 해결 사항
세그먼트가 반짝 거리는 이유는 통신에서 약 0.2초 정도의 시간을 할애하기 때문이였습니다.
거기다 while문을 통하여 전송, 비전송 모드가 계속 변하기 때문이더군요.
혹시나 싶어서 수신 모드를 제거 했더니 정보가 제대로 전송이 됩니다.
착각을 하던 점이 송신을 하고 송신을 완료할 때까지 딜레이를 통하여 아무것도 하지 않아야 한다고 생각하던 점입니다.
일단 해결을 위해 전송완료 인터럽트를 사용할 예정입니다.
자동화된 컨버터를 사용하시는 것도 한 방법입니다.
232이든 485이든 내부통신에 이용할리는 없고 분명 외부로 케이블이 나올텐데요. 말씀하신 그 "포트 ON/OFF"를 자동으로 처리해주는 컨버터가 존재합니다. (아마도 지금 사용하시는 컨버터는 이것을 지원하지 않는 걸로 보입니다.) 여튼 이런 걸 사용하시면 그냥 232통신하듯 제어하셔도 상관이 없겠죠. 물론 485자체가 송수신채널을 공유하기 때문에 이부분의 문제는 그대로 남지만요. 아무리 토글링을 자동으로 해준다 하여도 복수의 노드가 동시에 데이터를 보내는 상황은 추가 처리를 해야 하니까..
485를 이용하시려는 목적이 네트워크 구성이 아니라 단지 1:1 원거리통신을 위한 것이라면 RS485대신 RS422의 1:1모드를 쓰셔도 됩니다. 이러면 컨버터만 잘 달아주면 아무것도 신경쓰실 게 없겠죠.
--
답글 감사합니다.
※일단 컨버터는 pc로 마스터와 슬레이브가 서로 전송을 제대로 하는지 확인하는 차원에서 실행하는 것 입니다.
1:1 부터 최대 1:5를 해야 하기 때문에 더 테스트 해봐야 겠군요.
전송 문제는 겨우겨우 해결했습니다.
다만 ... 딜레이를 주거나 인터럽트를 이용하면 딜레이 시간이 길어서 문제가 발생하더군요.
그래서 이것저것 해보다가 마련한 방안이 바로 쓸 때 없는 비트를 전송하는 겁니다.
전송을 하고나서 딜레이가 아니라 485를 수신 모드로 전환하였습니다.
일단 4개의 비트를 전송하면 2개의 비트가 짤리는 현상이 발생하더군요.
6개의 비트를 전송해도 2개의 비트가 짤리는 현상이 발생 했습니다.
이를 이용해서 본문 4개의 비트 추가적인 쓰레기 값의 비트 2개를 전송하는 방식으로 구성하였습니다.
슬레이브 역활을 하는 데서는 딜레이가 길어도 크게 문제가 없어서 기존의 딜레이를 주고
마스터 역활을 하는 부분은 전송 데이터의 양을 줄이고 쓰레기 값 비트를 추가적으로 전송하고 딜레이 없이 수신모드로 전환했습니다.
위 방법으로 하니 문제나 처리 시간이 길어지는 것이 해결이 되었습니다.
그런데 이해가 되지 않는 것은 ... 컨버터를 통해 pc에서 출력되는 정보는 마스터의 전송 부분이 엉망인데 비해 ... 실제 마스터와 슬레이브 끼리 통신은 문제가 없는 겁니다.
슬레이브 부분에서 전송하는 모든 비트를 확인하여 처리를 하는 방식인데 말이죠.
문제 해결
일단 전송 후에 적당한 딜레이가 필요하다는 것을 확인했습니다.
추가적으로 딜레이를 줌으로써 전송이 제대로 되는 것도 확인했습니다.
문제는 ... 485를 송신에서 수신으로 전환할 때 시간이였습니다.
... 그런데 1초당 11.592mhz가 1초당 11059200이 아니라 110592로 착각을 하고 있어서 100배 더 많은 딜레이를 주는 것이 원인 이였습니다.
ps. 댓글을 달아주신 분들 정말로 감사합니다. 기초부터 다시 잡아야 겠습니다.
댓글 달기