여기서는 ATmega8 마이크로 컨트롤러와 Arduino Uno 간의 통신 을 설정합니다. 여기서 설정된 통신은 UART (Universal Asynchronous Receiver Transmitter) 유형입니다. 직렬 통신입니다. 이 직렬 통신을 통해 두 컨트롤러간에 데이터를 공유 할 수 있으며 이는 다양한 임베디드 시스템 애플리케이션에 필요합니다.
임베디드 시스템에서는 시스템 통신에 대한 기본 지식이 있어야하므로이를 위해이 프로젝트를 수행하고 있습니다. 이 프로젝트에서는 기본적인 통신 시스템에 대해 논의하고 송신기에서 수신기로 직렬로 일부 데이터를 전송합니다.
이 프로젝트에서 ATMEGA8은 TRANSMITTER 역할을하고 ARDUINO UNO는 RECECIVER 역할을합니다. 직렬 통신에서는 데이터 바이트가 완전히 전송 될 때까지 데이터를 비트 단위로 보냅니다. 데이터는 10 비트 크기 일 수 있지만 지금은 8 비트로 유지합니다.
필요한 구성 요소
하드웨어: ATMEGA8, ARDUINO UNO, 전원 공급 장치 (5v), AVR-ISP PROGRAMMER, 100uF 커패시터 (전원 공급 장치에 연결됨), 1KΩ 저항기 (2 개), LED, 버튼.
소프트웨어: Atmel studio 6.1, progisp 또는 flash magic, ARDUINO NIGHTLY.
회로도 및 설명
송신기와 수신기에 대한 회로도와 프로그래밍을 논의하기 전에 직렬 통신에 대해 이해해야합니다. 여기서 ATMEGA는 앞에서 설명한대로 직렬로 UNO에 데이터를 보냅니다.
MASTER SLAVE 통신, JTAG 통신과 같은 다른 통신 모드가 있지만 쉬운 통신을 위해 RS232를 선택하고 있습니다. 여기서는 ATMEGA8의 TXD (송신기) PIN을 ARDUINO UNO의 RXD (수신기) PIN에 연결합니다.
설정된 데이터 통신은 다음을 갖도록 프로그래밍됩니다.
- 8 개의 데이터 비트
- 2 개의 정지 비트
- 패리티 검사 비트 없음
- 9600 BPS (Bits Per Second)의 전송 속도
- 비동기 통신 (ATMEGA8과 UNO간에 클록 공유 없음 (둘 다 다른 클록 단위를 가짐))
수립하기위한 아두 이노 우노와 ATMEGA8 사이에 UART를 우리가 정확하게 설정을 프로그래밍 할 필요가있다. 이를 위해 위에서 언급 한 매개 변수를 양쪽 끝에서 동일하게 유지해야합니다. 이것에서 하나는 TRANSMITTER 역할을하고 다른 하나는 RECEIVER 역할을합니다. 아래에서 각 측면 설정에 대해 설명합니다.
이제 RS232 인터페이스의 경우 TRANSMITTER 측 (ATMEGA8)에 대해 다음 기능이 충족되어야합니다.
1. 첫 번째 컨트롤러의 TXD 핀 (데이터 수신 기능)은 TRANSMITTER에 대해 활성화되어야합니다.
2. 통신은 직렬이기 때문에 데이터 바이가 수신 될 때마다 알 필요가 있으므로 완전한 바이트가 수신 될 때까지 프로그램을 중지 할 수 있습니다. 이것은 데이터 수신 완료 인터럽트를 활성화하여 수행됩니다.
3. 데이터는 8bit 모드에서 컨트롤러로 송수신됩니다. 따라서 한 번에 두 개의 문자가 컨트롤러로 전송됩니다.
4. 패리티 비트가 없습니다. 모듈이 보낸 데이터에 정지 비트 하나가 있습니다.
위의 기능은 컨트롤러 레지스터에서 설정됩니다. 이에 대해 간략히 설명하겠습니다.
DARK GRAY (UDRE):이 비트는 시작시 설정되지 않지만 송신기가 전송할 준비가되었는지 여부를 확인하기 위해 작업 중에 사용됩니다. 자세한 내용은 TRASMITTER SIDE의 프로그램을 참조하십시오.
VOILET (TXEN):이 비트는 TRASMITTER SIDE에서 송신기 핀을 활성화하기 위해 설정됩니다.
노란색 (UCSZ0, UCSZ1 및 UCSZ2):이 세 비트는 한 번에 수신하거나 전송하는 데이터 비트 수를 선택하는 데 사용됩니다.
두 SIDES 간의 통신은 8 비트 통신으로 설정됩니다. 통신을 테이블과 일치시켜 UCSZ0, UCSZ1을 1로, UCSZ2를 0으로 만듭니다.
ORANGE (UMSEL):이 비트는 시스템이 비동기 적으로 (둘 다 다른 클럭 사용) 통신하는지 또는 동 기적으로 (둘 다 동일한 클럭 사용) 통신하는지에 따라 설정됩니다.
두 SYTEMS는 시계를 공유하지 않습니다. 둘 다 자체 내부 시계를 사용하기 때문입니다. 따라서 두 컨트롤러 모두에서 UMSEL을 0으로 설정해야합니다.
녹색 (UPM1, UPM0):이 두 비트는 통신에서 사용하는 비트 패리티를 기반으로 조정됩니다.
여기서 데이터 ATMEGA는 데이터 전송 길이가 작기 때문에 패리티없이 데이터를 전송하도록 프로그래밍되어 있으므로 데이터 손실이나 오류가 없음을 분명히 기대할 수 있습니다. 따라서 여기서는 패리티를 설정하지 않습니다. 따라서 모든 비트가 기본적으로 0이기 때문에 UPM1, UPM0을 모두 0으로 설정하거나 그대로 둡니다.
파란색 (USBS):이 비트는 통신 중에 사용하는 정지 비트 수를 선택하는 데 사용됩니다.
그녀가 구축 한 통신은 비동기식이므로보다 정확한 데이터 송수신을 위해서는 2 개의 정지 비트를 사용해야하므로 TRANSMITTER 측에서 USBS를 '1'로 설정합니다.
전송 속도는 적절한 UBRRH를 선택하여 컨트롤러에서 설정합니다.
UBRRH 값은 전송 속도와 CPU 크리스탈 주파수를 참조하여 선택됩니다.
따라서 상호 참조에 의해 UBRR 값은 '6'으로 표시되므로 전송 속도가 설정됩니다.
이를 통해 TRANSMITTER SIDE에 대한 설정을 구성했습니다. 이제 RECEIVING SIDE에 대해 이야기하겠습니다.
UNO에서 활성화되는 직렬 통신은 단일 명령을 사용하여 수행 할 수 있습니다.
|
우리가 설정 한 것으로 추정되는 통신은 초당 9600 비트의 BAUD 속도로 수행됩니다. 따라서 UNO가 이러한 전송 속도를 설정하고 직렬 통신을 시작하려면 "Serial.begin (9600);"명령을 사용합니다. 여기서 9600은 전송 속도이며 변경 가능합니다.
이제 모든 데이터를 수신하려면 UNO가 데이터를 수신하면 가져갈 수 있습니다. 이 데이터는 "receiveddata = Serial.read ();"명령에 의해 선택됩니다. 이 명령에 의해 직렬 데이터는 정수라는 이름의 '수신 데이터'로 가져갑니다.
회로에 표시된 것처럼 송신기 측에 연결된 버튼이이 버튼을 누르면 TRANSMITTER (ATMEGA8)에 의해 8 비트 데이터가 전송되고이 데이터는 RECEIVER (ARDUINO UNO)에 의해 수신됩니다. 이 데이터를 성공적으로 수신하면 연결된 LED를 켜고 끄고 두 컨트롤러 간의 성공적인 데이터 전송을 표시합니다.
이를 통해 ATMEGA8 컨트롤러와 ARDUINO UNO 간의 UART 통신 이 성공적으로 설정됩니다.