본문 바로가기
기술자료/ATMega

ATMega128 UART 통신 샘플(RS232, 0번 USART)

by 와이즈캣 2013. 6. 4.
728x90
반응형
main.c
#include "main.h"
#include "serial.h"

int main(void)
{
  Init_Uart0();
  sei();
  
  while(1)
  {
    sleep();
  }
  
  return 0;
}


main.h
#ifndef __MAIN_HEADER__

#define sei()    __asm__ __volatile__ ("sei" ::)
#define sleep()  __asm__ __volatile__ ( "sleep" "\n\t" :: );

#endif // __MAIN_HEADER__


serial.c
#include "serial.h"

unsigned char Uart_ReadChar(void)
{
   while (0==(UCSR0A & (1<<RXC)));
   return UDR0;
}
void   Uart_WriteChar(unsigned char data)
{
  while (0==(UCSR0A & (1<<TXC)));
  UDR0 = data;
}
void Init_Uart0(void)
{
  UBRR0L = (unsigned char)BAUD_RATE_L;
  UBRR0H = (unsigned char)BAUD_RATE_H;

  // RX Complete Interrupt ON
  // TX Complete Interrupt OFF
  // USART Data Register Empty Interrupt OFF
  // Receiver Enable
  // Transmitter Enable
  // Character Size UCSZ2 = 0
  UCSR0B = (1 << TXEN ) | (1 << RXEN )|(1<<RXCIE);

  // USART Mode     = Asynchronous
  // Parity Mode     = Disabled(0,0)
  // Stop Bit Select    = 1-bit
  // Character Size UCSZ = 8Bit(0, 1, 1)
  // Clock Polarity    = Not Setting(synchronous mode only)
  UCSR0C = (1 << UCSZ1) | (1 << UCSZ0);
}

void __vector_18 (void)
{
  static unsigned char ucData;

  // Read
  while (0==(UCSR0A & (1<<RXC)));
  ucData = UDR0;

  // Echo
  while (0==(UCSR0A & (1<<TXC)));
  UDR0 = ucData;
}


serial.h
#ifndef __ATMEGA128_UART__

#include "main.h"

//USART0 Define
#define UBRR0L  (*((unsigned char *)0x29))
#define UBRR0H  (*((unsigned char *)0x90))
#define UCSR0A  (*((unsigned char *)0x2B))
#define UCSR0B  (*((unsigned char *)0x2A))
#define UDR0    (*((unsigned char *)0x2C))
#define UCSR0C  (*((unsigned char *)0x95))
//UCSRA Define
#define RXC    7  // USART Receive Complete
#define TXC    6  // USART Transmit Complete
#define UDRE   5  // USART Data Register Empty
#define FE     4  // Frame Error
#define DOR    3  // Data OverRun
#define UPE    2  // Parity Error
#define U2X    1  // Double the USART Transmission Speed
#define MPCM   0  // Multi-Processor Communication Mode
//UCSRB Define
#define RXCIE  7  // RX Complete Interrupt Enable
#define TXCIE  6  // TX Complete Interrupt Enable
#define UDRIE  5  // USART Data Register Empty Interrupt Enable
#define RXEN   4  // Receiver Enable
#define TXEN   3  // Transmitter Enable
#define UCSZ2  2  // Character Size
#define RXB8   1  // Receive Data Bit 8
#define TXB8   0  // Transmit Data Bit 8
//UCSRC Define
#define UMSEL  6  // USART Mode Select
#define UPM1   5  // Parity Mode
#define UPM0   4  // Parity Mode
#define USBS   3  // Stop Bit Select
#define UCSZ1  2  // Character Size
#define UCSZ0  1  // Character Size
#define UCPOL  0  // Clock Polarity

#define BAUD_RATE   115200
#define BAUD_RATE_L (((F_CPU / (16L * BAUD_RATE)) - 1))
#define BAUD_RATE_H (((F_CPU / (16L * BAUD_RATE)) - 1>> 8)

void           Init_Uart0(void);
unsigned char  Uart_ReadChar(void);
void           Uart_WriteChar(unsigned char);
void           __vector_18 (void) __attribute__ ((signal, used, externally_visible));

#endif //__ATMEGA128_UART__


makefile
MCU = atmega128
F_CPU = 16000000
FORMAT = ihex
TARGET = main
OBJDIR = .
SRC = $(TARGET).c serial.c
CPPSRC = 
ASRC =
OPT = s
DEBUG = dwarf-2
EXTRAINCDIRS = 

# Compiler flag to set the C Standard level.
#     c89   = "ANSI" C
#     gnu89 = c89 plus GCC extensions
#     c99   = ISO C99 standard (not yet fully implemented)
#     gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99

CDEFS = -DF_CPU=$(F_CPU)UL
ADEFS = -DF_CPU=$(F_CPU)

CPPDEFS = -DF_CPU=$(F_CPU)UL

CFLAGS = -g$(DEBUG)
CFLAGS += --save-temps
CFLAGS += $(CDEFS)
CFLAGS += -O$(OPT)
CFLAGS += -funsigned-char
CFLAGS += -funsigned-bitfields
CFLAGS += -fpack-struct
CFLAGS += -fshort-enums
CFLAGS += -Wall
CFLAGS += -Wstrict-prototypes
CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
CFLAGS += $(CSTANDARD)

CPPFLAGS = -g$(DEBUG)
CPPFLAGS += $(CPPDEFS)
CPPFLAGS += -O$(OPT)
CPPFLAGS += -funsigned-char
CPPFLAGS += -funsigned-bitfields
CPPFLAGS += -fpack-struct
CPPFLAGS += -fshort-enums
CPPFLAGS += -fno-exceptions
CPPFLAGS += -Wall
CFLAGS += -Wundef
CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))

ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
PRINTF_LIB = 
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
SCANF_LIB = 
MATH_LIB = -lm
EXTRALIBDIRS = 
EXTMEMOPTS =
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
AVRDUDE_PROGRAMMER = stk500v2
AVRDUDE_PORT = com1    # programmer connected to serial device
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)

DEBUG_MFREQ = $(F_CPU)
DEBUG_UI = insight
DEBUG_BACKEND = avarice
GDBINIT_FILE = __avr_gdbinit
JTAG_DEV = /dev/com1
DEBUG_PORT = 4242
DEBUG_HOST = localhost

SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
AR = avr-ar rcs
NM = avr-nm
AVRDUDE = avrdude
REMOVE = rm -f
REMOVEDIR = rm -rf
COPY = cp
WINSHELL = cmd


MSG_ERRORS_NONE = Errors: none
MSG_BEGIN = -------- begin --------
MSG_END = --------  end  --------
MSG_SIZE_BEFORE = Size before: 
MSG_SIZE_AFTER = Size after:
MSG_COFF = Converting to AVR COFF:
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
MSG_FLASH = Creating load file for Flash:
MSG_EEPROM = Creating load file for EEPROM:
MSG_EXTENDED_LISTING = Creating Extended Listing:
MSG_SYMBOL_TABLE = Creating Symbol Table:
MSG_LINKING = Linking:
MSG_COMPILING = Compiling C:
MSG_COMPILING_CPP = Compiling C++:
MSG_ASSEMBLING = Assembling:
MSG_CLEANING = Cleaning project:
MSG_CREATING_LIBRARY = Creating library:

OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) 
LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) 
GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)

all: begin gccversion sizebefore build sizeafter end

build: elf hex eep lss sym

elf: $(TARGET).elf
hex: $(TARGET).hex
eep: $(TARGET).eep
lss: $(TARGET).lss
sym: $(TARGET).sym
LIBNAME=lib$(TARGET).a
lib: $(LIBNAME)

begin:
  @echo
  @echo $(MSG_BEGIN)

end:
  @echo $(MSG_END)
  @echo


HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) --mcu=$(MCU) --format=avr $(TARGET).elf

sizebefore:
  @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
  2>/dev/null; echo; fi

sizeafter:
  @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
  2>/dev/null; echo; fi

gccversion : 
  @$(CC) --version

program: $(TARGET).hex $(TARGET).eep
  $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)

gdb-config: 
  @$(REMOVE) $(GDBINIT_FILE)
  @echo define reset >> $(GDBINIT_FILE)
  @echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
  @echo end >> $(GDBINIT_FILE)
  @echo file $(TARGET).elf >> $(GDBINIT_FILE)
  @echo target remote $(DEBUG_HOST):$(DEBUG_PORT)  >> $(GDBINIT_FILE)
ifeq ($(DEBUG_BACKEND),simulavr)
  @echo load  >> $(GDBINIT_FILE)
endif
  @echo break main >> $(GDBINIT_FILE)

debug: gdb-config $(TARGET).elf
ifeq ($(DEBUG_BACKEND), avarice)
  @echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
  @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
  $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
  @$(WINSHELL) /c pause

else
  @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
  $(DEBUG_MFREQ) --port $(DEBUG_PORT)
endif
  @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)

COFFCONVERT = $(OBJCOPY) --debugging
COFFCONVERT += --change-section-address .data-0x800000
COFFCONVERT += --change-section-address .bss-0x800000
COFFCONVERT += --change-section-address .noinit-0x800000
COFFCONVERT += --change-section-address .eeprom-0x810000

coff: $(TARGET).elf
  @echo
  @echo $(MSG_COFF) $(TARGET).cof
  $(COFFCONVERT) -O coff-avr $< $(TARGET).cof

extcoff: $(TARGET).elf
  @echo
  @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
  $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof

%.hex: %.elf
  @echo
  @echo $(MSG_FLASH) $@
  $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@

%.eep: %.elf
  @echo
  @echo $(MSG_EEPROM) $@
  -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
  --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0

%.lss: %.elf
  @echo
  @echo $(MSG_EXTENDED_LISTING) $@
  $(OBJDUMP) -h -S -z $< > $@

%.sym: %.elf
  @echo
  @echo $(MSG_SYMBOL_TABLE) $@
  $(NM) -n $< > $@


.SECONDARY : $(TARGET).a
.PRECIOUS : $(OBJ)
%.a: $(OBJ)
  @echo
  @echo $(MSG_CREATING_LIBRARY) $@
  $(AR) $@ $(OBJ)

.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
  @echo
  @echo $(MSG_LINKING) $@
  $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)

$(OBJDIR)/%.o : %.c
  @echo
  @echo $(MSG_COMPILING) $<
  $(CC) -c $(ALL_CFLAGS) $< -o $@ 

$(OBJDIR)/%.o : %.cpp
  @echo
  @echo $(MSG_COMPILING_CPP) $<
  $(CC) -c $(ALL_CPPFLAGS) $< -o $@ 

%.s : %.c
  $(CC) -S $(ALL_CFLAGS) $< -o $@

%.s : %.cpp
  $(CC) -S $(ALL_CPPFLAGS) $< -o $@

$(OBJDIR)/%.o : %.S
  @echo
  @echo $(MSG_ASSEMBLING) $<
  $(CC) -c $(ALL_ASFLAGS) $< -o $@

%.i : %.c
  $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ 

clean: begin clean_list end

clean_list :
  @echo
  @echo $(MSG_CLEANING)
  $(REMOVE) $(TARGET).hex
  $(REMOVE) $(TARGET).eep
  $(REMOVE) $(TARGET).cof
  $(REMOVE) $(TARGET).elf
  $(REMOVE) $(TARGET).map
  $(REMOVE) $(TARGET).sym
  $(REMOVE) $(TARGET).lss
  $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o)
  $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst)
  $(REMOVE) $(SRC:.c=.s)
  $(REMOVE) $(SRC:.c=.d)
  $(REMOVE) $(SRC:.c=.i)
  $(REMOVEDIR) .dep

$(shell mkdir $(OBJDIR) 2>/dev/null)

-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
clean clean_list program debug gdb-config


728x90