rs 485 전송에 대해서 궁금점

grasia08의 이미지

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달 날라먹었습니다.

grasia08의 이미지

시작 bit와 종료bit가 필요하게 되어서 총 5bit의 데이터를 보내게 되어씁니다.
5개의 비트를 보낸뒤 딜레이 사이클을 추가적으로 주지 않고 보니 지금의 딜레이 사이클을 준 만큼으로도 3개의 비트를 보내나 5개의 비트를 보내나 같이 제대로 데이터가 전송되는 것을 확인하였습니다.

단지 ... 자체적으로 보내는 시간이 2bit 만큼 커져서인지 ... 세그먼트가 엄청 깜박거려서 문제가 되고 있습니다.

정확히는 5bit 외 추가적으로 5bit 를 보내기 때문이라고 보고 있습니다.

grasia08의 이미지

세그먼트가 반짝 거리는 이유는 통신에서 약 0.2초 정도의 시간을 할애하기 때문이였습니다.
거기다 while문을 통하여 전송, 비전송 모드가 계속 변하기 때문이더군요.

혹시나 싶어서 수신 모드를 제거 했더니 정보가 제대로 전송이 됩니다.

착각을 하던 점이 송신을 하고 송신을 완료할 때까지 딜레이를 통하여 아무것도 하지 않아야 한다고 생각하던 점입니다.

일단 해결을 위해 전송완료 인터럽트를 사용할 예정입니다.

mirheekl의 이미지

232이든 485이든 내부통신에 이용할리는 없고 분명 외부로 케이블이 나올텐데요. 말씀하신 그 "포트 ON/OFF"를 자동으로 처리해주는 컨버터가 존재합니다. (아마도 지금 사용하시는 컨버터는 이것을 지원하지 않는 걸로 보입니다.) 여튼 이런 걸 사용하시면 그냥 232통신하듯 제어하셔도 상관이 없겠죠. 물론 485자체가 송수신채널을 공유하기 때문에 이부분의 문제는 그대로 남지만요. 아무리 토글링을 자동으로 해준다 하여도 복수의 노드가 동시에 데이터를 보내는 상황은 추가 처리를 해야 하니까..

485를 이용하시려는 목적이 네트워크 구성이 아니라 단지 1:1 원거리통신을 위한 것이라면 RS485대신 RS422의 1:1모드를 쓰셔도 됩니다. 이러면 컨버터만 잘 달아주면 아무것도 신경쓰실 게 없겠죠.

--

grasia08의 이미지

※일단 컨버터는 pc로 마스터와 슬레이브가 서로 전송을 제대로 하는지 확인하는 차원에서 실행하는 것 입니다.

1:1 부터 최대 1:5를 해야 하기 때문에 더 테스트 해봐야 겠군요.
전송 문제는 겨우겨우 해결했습니다.
다만 ... 딜레이를 주거나 인터럽트를 이용하면 딜레이 시간이 길어서 문제가 발생하더군요.
그래서 이것저것 해보다가 마련한 방안이 바로 쓸 때 없는 비트를 전송하는 겁니다.

전송을 하고나서 딜레이가 아니라 485를 수신 모드로 전환하였습니다.
일단 4개의 비트를 전송하면 2개의 비트가 짤리는 현상이 발생하더군요.
6개의 비트를 전송해도 2개의 비트가 짤리는 현상이 발생 했습니다.

이를 이용해서 본문 4개의 비트 추가적인 쓰레기 값의 비트 2개를 전송하는 방식으로 구성하였습니다.
슬레이브 역활을 하는 데서는 딜레이가 길어도 크게 문제가 없어서 기존의 딜레이를 주고
마스터 역활을 하는 부분은 전송 데이터의 양을 줄이고 쓰레기 값 비트를 추가적으로 전송하고 딜레이 없이 수신모드로 전환했습니다.
위 방법으로 하니 문제나 처리 시간이 길어지는 것이 해결이 되었습니다.

그런데 이해가 되지 않는 것은 ... 컨버터를 통해 pc에서 출력되는 정보는 마스터의 전송 부분이 엉망인데 비해 ... 실제 마스터와 슬레이브 끼리 통신은 문제가 없는 겁니다.

슬레이브 부분에서 전송하는 모든 비트를 확인하여 처리를 하는 방식인데 말이죠.

grasia08의 이미지

일단 전송 후에 적당한 딜레이가 필요하다는 것을 확인했습니다.

추가적으로 딜레이를 줌으로써 전송이 제대로 되는 것도 확인했습니다.

문제는 ... 485를 송신에서 수신으로 전환할 때 시간이였습니다.

... 그런데 1초당 11.592mhz가 1초당 11059200이 아니라 110592로 착각을 하고 있어서 100배 더 많은 딜레이를 주는 것이 원인 이였습니다.

ps. 댓글을 달아주신 분들 정말로 감사합니다. 기초부터 다시 잡아야 겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.