아래 코드 main.c / uart.c / uart.h 로 분리
main.c
/*
* USART.c
*
* Created: 2018-11-09 오전 12:50:55
* Author : RRL
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <stdio.h>
#include "uart.h"
int main(void)
{
unsigned char data;
USART_Init();
while (1)
{
data=USART_Receive();
if(data=='1') {
float temp = 30.2;
float humi = 40;
char buf[40] = {0,};
sprintf(buf, "Temp:%f, humi:%f", temp, humi);
strTransmit(buf);
} // ON\n
if(data=='0') {
USART_Transmit('O');
USART_Transmit('F');
USART_Transmit('F');
USART_Transmit(10);
} // OFF\n
}
}
uart.c
/*
* uart.c
*
* Created: 2021-02-05 오전 10:33:46
* Author: User
*/
#include <avr/io.h>
#include "uart.h"
void USART_Init(void)
{
UCSR0A=0x00; // clear
UCSR0B=(1<<RXEN0) | (1<<TXEN0); // Rx, Tx Enable
UCSR0C=(0<<UCSZ02) | (1<<UCSZ01) | (1<<UCSZ00); // Tx data len : 8-bit
UBRR0H=0;
UBRR0L=103; // baudrate 9600bps
}
unsigned char USART_Receive(void)
{
while(!(UCSR0A & (1<<RXC0))); // Wait for data to be received
return UDR0; // Get and return received data form buffer
}
void USART_Transmit(unsigned char data)
{
while(!(UCSR0A & (1<<UDRE))); // Wait for empty transmit buffer
UDR0=data; // Put data into buffer, sends the data
}
void strTransmit(char *str) {
while (*str) {
USART_Transmit(*str);
str++;
}
USART_Transmit(10);
}
uart.h
/*
* uart.h
*
* Created: 2021-02-05 오전 10:23:17
* Author: User
*/
#ifndef UART_H_
#define UART_H_
void USART_Init(void);
unsigned char USART_Receive(void);
void USART_Transmit(unsigned char data);
void strTransmit(char *str);
#endif /* UART_H_ */
아래 코드 atmega128에 업로드 후 (cp2102 비연결 상태로)
#define F_CPU 16000000UL
#include <avr/io.h>
void USART_Init(void)
{
UCSR0A=0x00; // clear
UCSR0B=(1<<RXEN0) | (1<<TXEN0); // Rx, Tx Enable
UCSR0C=(0<<UCSZ02) | (1<<UCSZ01) | (1<<UCSZ00); // Tx data len : 8-bit
UBRR0H=0;
UBRR0L=51; // baudrate 19200
}
unsigned char USART_Receive(void)
{
while(!(UCSR0A & (1<<RXC0))) // Wait for data to be received
;
return UDR0; // Get and return received data form buffer
}
void USART_Transmit(unsigned char data)
{
while(!(UCSR0A & (1<<UDRE))) // Wait for empty transmit buffer
;
UDR0=data; // Put data into buffer, sends the data
}
int main(void)
{
unsigned char data;
USART_Init();
while (1)
{
data=USART_Receive();
if(data=='1') {
USART_Transmit('O');
USART_Transmit('N');
USART_Transmit(10); // 개행문자
} // ON\n
if(data=='0') {
USART_Transmit('O');
USART_Transmit('F');
USART_Transmit('F');
USART_Transmit(10);
} // OFF\n
}
}
사진과 같이 연결하여 아두이노 시리얼통신창을 열고(아두이노 코드는 상관없음. 장치관리자에서 cp2102 포트 확인하고 아두이노에서 포트 일치하는지 확인할 것) 보드레이트를 위의 코드와 같이 아두이노 시리얼 통신창에도 192000 으로 설정하면 됨
1을 입력하면 on 0을 입력하면 off가 뜸
'임베디드 > Atmega128' 카테고리의 다른 글
millis() 와 micros() atmega128 에서 사용하기 (0) | 2021.02.05 |
---|---|
(안됨)atmega128 dht11 + usart 시리얼통신 합치기 (0) | 2021.02.05 |
atmega128 dht11 코드 + 코드 작성 위한 아두이노 라이브러리 찾기 (0) | 2021.02.04 |
AVR 내부 flash memory 구조, atmega128 bootsz 퓨즈상태와 부트로더 섹션 크기 조정, AVR 부트로더 동작 (0) | 2021.01.29 |
analog (0) | 2021.01.29 |