λ§μ΄ν¬λ‘컨νΈλ‘€λ¬μμ μ¬μ©ν μ μλ λ²μ© μ μΆλ ₯ νμ μλ λ§μ§ μμΌλ―λ‘ μ§λ ¬ ν΅μ μ΄ μ¬μ©λλ€.
μ§λ ¬ ν΅μ μ 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;
}
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;
}
'π¦ΎAVR' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
3. μλμ΄λ Έ μ°λ Έ κ΄λ ¨ μλ£ μκ° (0) | 2025.01.28 |
---|---|
2. μλμ΄λ Έ μκ° & Atmel Studio7 νλ‘μ νΈ μμ±νκΈ° (0) | 2025.01.27 |
1. μλ² λλ SW μ·¨μ μ κ΄μ¬ μλ μ·¨μ€μμ μνμ¬. (0) | 2025.01.26 |
μνΈλ© μ€νλμ€ μμνκΈ°. (0) | 2023.06.18 |
μλμ΄λ Έ μ°λ Έμμ ISP λ°©μμΌλ‘ μ λ‘λνκΈ° (0) | 2023.06.18 |