반응형

마이크로컨트롤러에서 사용할 수 있는 범용 입출력 핀의 수는 많지 않으므로 직렬 통신이 사용된다.

직렬 통신은 1개의 입출력 핀을 통해 8개 비트를 8번에 나누어 전송하는 방식이다.

직렬 통신 중 가장 흔히 사용되는 UART로 진행한다.

UART 통신은 전이중 통신으로 송신과 수신을 동시에 진행할 수 있으며 이를 위해서 2개의 범용 입출력 핀이 필요하다.

ATMega328(아두이노 우노 칩에서 사용되는)에서는 PD0 핀과 PD1 핀이 사용된다. (아두이노 우노는 0, 1핀이다.)

/*
 * UART_TEST.c
 *
 * Created: 2023-06-20 오후 8:46:56
 * Author : Yoon
 */ 
#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>

void UART_INIT(void)
{
	UCSR0A |= (1 << U2X0);   // 2배속 모드
	
	UBRR0H = 0x00;           // 9600bps
	UBRR0L = 207;          
	
	UCSR0C |= 0x06;          // 비동기, 8bit 데이터, 1bit start, 1bit stop, no parity
	
	UCSR0B |= (1 << RXEN0);  // 수신 가능
	UCSR0B |= (1 << TXEN0);  // 송신 가능
}

unsigned char UART_receive(void)
{
	while(!(UCSR0A & (1 << RXC0)));  // 데이터 수신 대기
	return UDR0;
}

void UART_transmit(unsigned char data)
{
	while(!(UCSR0A & (1 << UDRE0)));  // 송신 가능 대기
	UDR0 = data;                      // 데이터 전송
}

int main(void)
{
	unsigned char data;
	
	UART_INIT();             // UART 통신 초기화
    while (1) 
    {
		data = UART_receive();   // 데이터 수신
		UART_transmit(data);     // 수신된 문자를 에코백
    }
	
	return 0;
}

UART 결과

1. UCSR0A(USART Control and Status Register 0A) 레지스터 : UART 통신의 제어와 상태 체크

UX20 : 비동기 전송모드에서만 사용되며, 2배속 모드이면 1, 1배속 모드이면 0의 값을 가진다.

RXC0 : 수신 버퍼(UDR0)에 읽지 않은 문자가 있을 때는 1이 되고, 버파가 비어 있을 때는 0이 된다. UCSR0B 레지스터의 RXCIE0 비트와 함께 사용되어 수신 완료 인터럽트를 발생시킬 수 있다.

UDRE0 : 송신 버퍼(UDR0)가 비어 있어 데이터를 받을 준비가 되어 있을 때 1이 된다. UCSR0B 레지스터의 UDRIE0 비트와 함께 사용되어 송신 데이터 레지스터 준비 완료 인터럽트를 발생시킬 수 있다.

2. UCSR0B

RXCIE0 : 수신 완료 인터럽트를 발생을 허용한다.

TXCIE0 : 송신 완료 인터럽트를 발생을 허용한다.

RXEN0 : UART 수신기의 수신 기능을 활성화한다.

TXEN0 송신기의 송신 기능을 활성화한다.

3. UCSR0C : 데이터 형식 및 통신 방법을 결정한다.

4. UBRR0H, HBRR0L : 보율을 12비트로 표현한다.

5. UDR0 : 송수신된 데이터가 저장되는 버퍼 레지스터

 

C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel\ATmega_DFP\1.7.374\include\avr

 

#include <stdio.h>
#include <stdint.h>

void printBinary(uint8_t value) {
  for (int i = 7; i >= 0; i--) {
    if ((value >> i) & 1)
      printf("1");
    else
      printf("0");
  }
  printf("\n");
}

int main(void) {
  uint8_t UCSR0A = 0b00000000;
  uint8_t U2X0 = 1;
  uint8_t RXC0 = 7;
  uint8_t UDRE0 = 5;
  
  printf("UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A |= (1 << U2X0);
  printf("[init] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = !(UCSR0A & (1 << RXC0));
  printf("[RX] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = !(UCSR0A & (1 << UDRE0));
  printf("[TX] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = UCSR0A & (1 << RXC0);
  printf("[RX] UCSR0A in binary: ");
  printBinary(UCSR0A);

  UCSR0A = UCSR0A & (1 << UDRE0);
  printf("[TX] UCSR0A in binary: ");
  printBinary(UCSR0A);
  
  return 0;
}

728x90
반응형
반응형

안녕하세요. 

 

오늘부터 AVR Kut-128_comm_board를 이용한 Bluetooth 통신에 대해 차근차근 포스팅하겠습니다.

 

개발환경은 CodeVision Evaulation을 사용했습니다.

http://www.hpinfotech.ro/cvavr-download.html

 

Kut-128_comm_board
kut128_comm_board_manual.pdf
1.80MB
CodeVision

( 위 CodeVision Evaluation을 설치하시면 드라이버가 자동으로 설치됩니다. )

 

블루투스 모듈 블루투스 4.0 BLE 모듈 (DIP) [SZH-BTBA-002]를 사용했습니다.

블루투스 4.0 BLE 모듈 (DIP) [SZH-BTBA-002]

 

스마트폰 어플은 nRF Connect for Mobile을 사용했습니다. (Android)

nRF Connect for Mobile

 

  • Kut-128_comm_board
  • CodeVision Evaulation
  • 블루투스 4.0 BLE 모듈 (DIP) [SZH-BTBA-002]
  • nRF Connect for Mobile

 

보드는 위 매뉴얼(. pdf)을 참고하면 됩니다. 

 


 

첫 번째 글은 블루투스 모듈의 동작에 대해 설명하겠습니다. 

 

블루투스의 무선 통신은 4핀만 있으면 됩니다. 하지만 연결 해제 등 다양한 동작을 위해 STATE 단자와 EN 단자도 같이 사용하겠습니다.

 

  • 통신을 위한 RX(Receive : 수신), TX(Transport : 송신) 
  • 전원을 위한 VCC(5V), GND
  • 블루투스의 연결 상태를 확인하기 위한 출력부 STATE
  • 블루투스가 다른 기기와 연결되어 있을 때, 강제로 끊기 위한 입력부 EN
VCC:  input power supply 3.3~6V, Prohibit more than 7V
GND: Ground
TX:  transport
RX:  receive  
State: when bluetooth is connected , output "High level", "no conntected"  output "low level"
en:when module is connected, give a high level to "EN",the module will disconnected

https://www.devicemart.co.kr/goods/view?no=1322018

 

CC2541 블루투스 4.0 BLE 모듈 (DIP) [SZH-BTBA-002]

Master Mode, Transparent Transmission (Slave Mode 미지원) / UART 인터페이스, SPP 블루투스 직렬포트 프로토콜 지원 / 3V / 대기전력 : 90uA ~ 400uA / IOS, iBeacon, 안드로이드 4.3 호환 / MFI 불필요 / 15.5mm * 37.3mm (PCB)/★

www.devicemart.co.kr

 

 


 

동작의 구현에 대해 설명하겠습니다.

 

  1.  블루투스 디바이스가 다른 기기와의 연결 상태를 확인. (연결되어 있다면 연결 강제 끊기, 다른 기기와 연결되어 있으면 전송 모드이기 때문에, AT 명령어가 통하지 않음)
  2. 블루투스 디바이스에게 AT 명령어를 전송하여 디바이스가 살아 있는지 확인
  3. 블루투스 디바이스의 이름을 사용자가 원하는 Name 서비스로 변경 후, 디바이스 리셋 (다른 기기와 연결 준비가 되어 있는 상태)
  4. 스마트폰에서 블루투스와 연결하면, 간단한 통신 확인을 위해 매 1씩 증가하는 변수 cnt를 전송하여 스마트폰에서 cnt가 1씩 증가하는지 확인.
728x90
반응형

+ Recent posts