Atmega128의 시리얼 통신(USART)에 대해 다룹니다.
2016. 6. 25 최초작성
1. Baud rate (in bits per second, bps)와 시스템 클록을 정의한다.
#define 9600
#define F_CPU 16000000UL
2. 시스템 클록과 원하는 baud rate를 이용하여 USART Baud Rate Register(UBRR)을 계산한다.
BAUD Baud rate (in bits per second, bps)
fOSC System Oscillator clock frequency
UBRR Contents of the UBRRH and UBRRL Registers, (0 - 4095)
UBRR_VALUE = (((F_CPU / (9600 * 16UL))) - 1);
3. UBRR0은 12비트 레지스터이기 때문에 나누어서 넣어야 한다.
UBRR0H = (uint8_t)(UBRR_VALUE>>8);
UBRR0L = (uint8_t) UBRR_VALUE;
4. USART 설정을 한다.
UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트
UCSR0C &= ~(1<<USBS0); //stop bit : 1비트
UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode
5. USARTn Receiver와 USARTn Transmitter를 인에이블시킨다.
UCSR0B=(1<<RXEN0)|(1<<TXEN0);
6. 데이터 전송
전송 버퍼(UDRn)이 비어있다면 1값을 가지며 새로운 데이터를 받아서 전송할 준비가 된 것이다.
//이전 전송이 끝나기를 기다림
while(!(UCSR0A&(1<<UDRE0))){};
UDR0 = data; /* send data */
7. 데이터 수신
수신버퍼가 비어있다면 0으로 클리어된다. 1이되면 데이터를 수신받았다는 것이다.
// 수신 되기를 기다림
while(!(UCSR0A&(1<<RXC0))){};
return UDR0; /* return register value */
전체 소스코드..
PC에서 실행시킨 터미널에서 입력한 것을 avr에서 에코해서 보내줍니다.
#define F_CPU 16000000UL //1. baud rate를 선택 #define USART_BAUDRATE 9600 //2.시스템 클록과 원하는 baud rate를 이용하여 UBRR 값을 계산한다. #define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) #include <avr/io.h> #include <stdio.h> void usartInit() { //3. UBRR0은 16비트 레지스터이기 때문에 8비트씩 나누어서 넣어야 한다. UBRR0H = (uint8_t)(UBRR_VALUE>>8); UBRR0L = (uint8_t) UBRR_VALUE; //4. USART 설정 UCSR0C |= (1<<UCSZ00)|(1<<UCSZ01); //Charecter size : 8비트 UCSR0C &= ~(1<<USBS0); //stop bit : 1비트 UCSR0C &= ~((1<<UPM01)|(1<<UPM00)); // no parity mode //5. 송수신을 가능하게 한다. UCSR0B=(1<<RXEN0)|(1<<TXEN0); } void transmitByte(uint8_t data) { //이전 전송이 끝나기를 기다림 while(!(UCSR0A&(1<<UDRE0))){}; UDR0 = data; /* send data */ } uint8_t receiveByte(void) { // 수신 되기를 기다림 while(!(UCSR0A&(1<<RXC0))){}; return UDR0; /* return register value */ } void printString(const char str[]) { uint8_t i = 0; while (str[i]) { transmitByte(str[i]); i++; } } void readString(char str[], uint8_t maxLength) { char response; uint8_t i; i = 0; while (i < (maxLength - 1)) { /* prevent over-runs */ response = receiveByte(); transmitByte(response); /* echo */ if (response == '\r') { /* enter marks the end */ break; } else { str[i] = response; /* add in a letter */ i++; } } str[i] = 0; /* terminal NULL character */ } int main(void) { usartInit(); char ch; while(1) { ch = receiveByte(); if ( ch == '\r') { transmitByte('\r'); transmitByte('\n'); } transmitByte(ch); } } |
'AVR > Atmega128 강좌' 카테고리의 다른 글
적외선 통신( IR ) - 리모컨 NFC format을 시리얼로 출력하는 코드 (0) | 2023.10.13 |
---|---|
Atmega128 기초 - SPI(Serial Peripheral Interface) (0) | 2023.10.13 |
Atmega128 기초 – ADC(Analog to Digital) 변환 (0) | 2023.10.13 |
Atmega128 ADC예제 - lm35 온도 센서값 시리얼로 출력하기 (0) | 2023.10.08 |
Atmega128 기초 - 8비트 타이머/카운터 Phase Correct PWM 모드 (0) | 2016.06.21 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!