- AVR Studio 환경에서 Assembly Language Program 작성 하기
- ATmega128 I/O Ports 이해를 위한 프로그램 예
- UART( Universal Asynchronous Receiver/Transmitter)의 이해를 위한 프로그램
- Parallel Port Interface
- C 프로그램과 Assembly 언어 프로그램을 Mixing한 프로그램 개발
- External Inerrtupt
- Timer/Counter
- AVR Instruction과 Programming
- Software Debugging 기술
- GCC Assembler를 사용 하여 프로그램을 개발 하는데 유용한 Utility Function 모음
- Assembly Language Programming 관련 페이지 보기
- Microchip Studio(AVR Studio7) 환경에서 AVR Assembly Program 작성 하기: AVR_Studio7_AVR_AssemblyProgram.pdf
- Microchip Studio(AVR Studio7) 환경에서 GCC Assembly Program 작성 하기: AVR_Studio7_GCC_AssemblyProgram.pdf
- Assembly Language Program Template
- avr128_template.asm
- Interrupt Vectors Table: avr128_interrupt_table.inc
- AVR_asm_template.zip
이 페이지에서는 AVR Studio에 포함되어 있는 AVR Assembler와 GCC(GNU C Compiler)에 포함 되어 있는 GCC Assembler 두가지를 사용 한다.
AVR Assembler는 AVR microcontroller를 설계한 Atmel(현 Microchip)에서 제공 하는 Assembler 이기 때문에 AVR microcontroller의 Hardware 특성을 정확히 반영 할 수 있는 장점이 있다.
GCC Assembler는 GCC(GNU C Compiler)에 포함 되어 있는 Assembler 이기 때문에 GCC c와 Assembly Program을 Mixing 한 프로그램을 작성 하기에 적합 하다.
Atmel AVR Assembly Language Program을 쉽게 작성 할 수 있게 하기 위한 Template
GCC AVR Assembly Language Program을 쉽게 작성 할 수 있게 하기 위한 Template
- Time Delay Routine에 대한 이해를 위한 과제: AVR_asm_led_flash_basic
- 논리연산( Shift 포함)과 Time Delay에 대한 이해를 위한 과제
- I/O Port 와 SW에 대한 이해와 Debugging 기술을 이해하기 위한 Assembly Program 예
- AVR_asm_sw_led_basic.zip
- GCC_asm_sw_led_basic.zip
- Pin Input, Output PORT, Shift operation에 대한 이해를 위한 과제
- AVR_asm_led_sw_shift.zip
- GCC_asm_sw_led_basic_shift.zip
- Pin I/O 대한 이해를 위한 과제
- AVR_asm_sw_led_push_counter.zip
ATmega128 I/O Ports에 대한 설명 자료는 ATmega128 I/O Port를 참고 할 것.
LED 가 1 Sec 주기(Software Delay를 사용)로 점멸 하는 프로그램을 AVR Assembly 언어와 GCC Assembly 언어로 각각 작성 하라.
0.2Sec 간격으로 00000001, 00000010, 00000100 -- 10000000, 00000001과 같이 led 가 Turn On 되는 프로그램을 AVR Assembly 언어와 GCC Assembly 언어로 각각 작성 하라.
PD0, PD1에 연결된 Switch의 상태를 읽어 PORTF의 PF0, PF1에 표시 하는 프로그램을 작성 하고, Debuger를 이용하여 Simulation 하라.
SW PD0 가 Closed 되면 LED(PORTF)가 0.2Sec 간격으로 00000001, 00000010, 00000100 과 같이 좌측으로 회전 하고, SW PD1 가 Closed 되면 LED 가 00000001, 10000000, 01000000 과 같이 우측으로 회전 하는 프로그램을 AVR Assembly 언어와 GCC Assembly 언어로 각각 작성 하라. 만약 SW PD0, PD1가 모두 Open 인 경우에는 현재 회전 방향을 유지 한다.
SW PD0를 누른 회수를 2진수로 LED(PORTF)에 표시하는 프로그램을 AVR Assembly 언어 작성 하라.
- UART 비동기 직렬 통신 프로그램의 개념을 이해 하기 위한 과제
- AVR_asm_usart_io_basic.zip
- GCC_asm_usart_io_basic.zip: GCC Assembly 프로그램은 GCC C 프로그램과 호환성을 위하여 AVR Assembly 프로그램과 다른 Rg를 사용 함.
- UART 통신을 이용한 Microcontroller 제어를 이해 하기 위한 과제
- AVR_asm_led_usart_shift.zip
- UART 통신과 문자열(String) I/O을 이해 하기 위한 과제
- 첫 줄 I/O Format: Input New String: Sting input[CR]
- 다음 줄에 다음과 같이 출력: 윗 줄에서 입력된 문자열 출력[CR][LF]
- I/O 예(문자열 "UART Testing" 를 입력 한 경우)
- Input New String: UART Testing[CR]
- UART Testing[CR][LF]
- AVR_asm_usart_string_io.zip
- GCC_asm_usart_string_io.zip
UART에 대한 설명 자료는 Serial I/O(UART) Communication를 참고 할 것.
UART 초기화, 개발 보오드와 터미널(PC에서 실행 되는 통신 프로그램)사이의 문자와 문자열 통신의 이해를 위한 예
컴퓨터 터미널(모니터) 프로그램(Tera Term, OC_Cnnsole 등)에서 문자 L 이 입력 되면 LED(PORTF)가 00000001, 00000010, 00000100 과 같이 좌측으로 회전 하고, R 이 입력 되면 LED 가 00000001, 10000000, 01000000 과 같이 우측으로 회전 하는 프로그램을 AVR Assembly 언어로 작성 하라.
문자열을 다음과 같은 Format으로 입출력 하는 프로그램을 Assembly 언어로 작성 하라.
- SW Interfacing과 Bouncing 문제
- SW의 Bouncing 현상을 관찰 하기 위한 프로그램 예
- SW의 Bouncing 문제를 해결 하기 위한 프로그램 예
- LCD Interfacing
- 2 Line LCD에 문자를 출력 하는 프로그램 예
- LCD를 출력 장치로 PC의 Keyboard를 입력 장치로사용 하여 다음과 같은 Format으로 문자 정보를 입출력 하는 GCC Assembly 프로그램 예
- 프로그램이 처음 시작 하면 첫 Line에 아래와 같은 문자열을 출력 한다.
- KHU EE (본인 이름을 영문자 9자 이내로 출력)
- 둘째 Line 에는 아래와 같은 Format으로 시간을 표시 한다. 6 번째(Sec) 문자가 입력되면 자동으로 첫 문자 (Time의 첫 숫자) 위치에 커서가 위치 하여 새로운 시간을 입력 할 수 있는 상태가 된다.
- Time: **:**:** ( * 표는 PC Keyboard로 부터 입력된 숫자)
- 출력 예
- KHU EE Kim SeDon
- Time: 12:23:45
- GCC_asm_lcd_4bit_soft_uart_time_format.zip
- PD0 Switch를 누른 회수를 LCD에 출력 하는 GCC Assembly 프로그램 예
- 프로그램이 처음 시작 하면 첫 Line에 아래와 같은 문자열을 출력 한다.
- KHU EE (본인 이름을 영문자 9자 이내로 출력)
- 둘째 Line 에는 아래와 같은 Format으로 Switch를 누른 회수를 표시 한다.
- Count: *** ( * Switch를 누른 회수)
- 출력 예
- KHU EE Kim SeDon
- Count: 123
- GCC_asm_sw_lcd_debounce_counter_soft.zip
- 컴퓨터 Keyboard (UART)를 입력으로 LCD 모듈을 출력 장치로 사용 하는 프로그램 예
- Keypad에 대한 이해와 응용
- Keypad 연결 회로도와 Key Press-Release 상태에 따른 신호 파형: key_press_release_state_signal.pdf
- Keypad(4 by 3) Device Driver 프로그램 예
Switch 와 Keypad Interfacing에 대한 설명 자료는 Switch debouncing 과 Keypad Interfacing를 참고 할 것.
LCD Interfacing에 대한 설명 자료는 Character LCD Display(LCD Display Controller와 LCD Module를 참고 할 것.
LCD Display Controller(hd44780) 자료 HD44780 dot-matrix liquid crystal display controller
LCD 모듈(LMC1623A-YTDDYN) LMC1623A.pdf
- c Listing file에 대한 이해
- Listing file을 설명 하기 위한 C Source file: sw_led_basic_c.pdf
- C Source file을 Compile 하여 생성된 Listing file: sw_led_basic_lss.pdf
- C 프로그램에서 함수를 Call 할 경우 Parameter passing과 함수에서 결과를 Return 하는 방법을 설명 하기 위한 C Source file: ex_AVR_c_c_parameter_pass_add_c.pdf
- 위 C Source file을 Compile 하여 생성된 Listing file: ex_AVR_c_c_parameter_pass_add_lss-Os.pdf
- 위 File의 Compile 결과 생성된 실행 File(Intel hex format): ex_c_c_parameter_pass_add_HEX.pdf
- C 프로그램과 Assembly 언어 프로그램을 Mixing한 프로그램 예
- GCC c 프로그램에서 Assembly Function을 이용 하는 예
- 연산 결과를 LED Array에 출력하는 예: GCC_c_call_asm_func_3v_add_led.zip
- 연산 결과를 UART에 출력하는 예: GCC_c_call_asm_add_uart.zip
- Assembly 프로그램에서 GCC c 함수를 이용 하는 예
- 연산 결과를 LED Array에 출력하는 예: : GCC_asm_call_c_func_3v_add.zip
- LCD와 Keypad 응용 프로그램 과제
- Device Driver(Keypad, LCD)는 Assembler로 작성 하여야 한다.
- LCD를 출력 장치로 Keypad를 입력 장치로 사용 하는 가산 기능을 갖는 계산기를 구현하라.
- I/O Format : 정수 + 정수 = 결과
- + 부호는 * Key, = 부호는 # Key 를 사용 한다
- 프로그램 예: GCC_c_asm_keypad_lcd_add.zip
- Multi Code Keypad 프로그램 예
- LCD와 Keypad (Multi Code Keypad) 를 이용 한 과제
- Device Driver(Keypad, LCD)는 Assembler로 작성 하여야 한다.
- LCD를 출력 장치로 Keypad를 입력 장치로사용 하여 가산(16Bit Unsigned integer), 감산(16Bit Unsigned integer), 승산(16Bit <- 8Bit * 8Bit),제산(/) 기능을 갖는 계산기를 구현하라.
- I/O Format 예 : 1(정수)*(Key Code Table 변환) +(Operator)2(정수)=3(결과)
- 기본 Key Code Table은 * Key를 Key Code Table 변환 Code로 사용 하고, # Key를 = 변환 Code로 사용 한다. 두번째 Key Code Table에서는 숫자 Key 2를 + (가산)Key로 사용 하고, 숫자 Key 5를 - (감산) Key로 사용, 숫자 Key 8를 * (승산) Key로 사용, 숫자 Key 0를 /(제산)Key로 사용 한다.
- 프로그램 예: GCC_c_asm_keypad_LCD_arithmetic.zip
C 프로그램과 Assembly 언어 프로그램을 Mixing한 프로그램 개발의 이해를 위한 자료: mixingCnAssembly.pdf
Listing file은 C Source file을 Complie 하면 생성되는 File로 프로그램 Debugging에 자주 사용 되는 중요한 File 이다.
- External Interrupt Programming 예
External interrupt에 대한 설명 자료는 ATMega128 External Interrupt를 참고 할 것.
- Timer 1 Output Compare Match Interrupt 를 이용 하여 LED를 1 Sec 주기로 점멸 하는 프로그램 예
- Timer 1 Overflow Interrupt 를 이용 하여 LED를 1 Sec 주기로 점멸 하는 프로그램 예
- 외부 Crystal 과 Timer 0 Over Flow Interrupt를 이용 하여 1 초 주기를 발생 시키는 예
- PD0 SW를 누르면 LED의 점멸 속도가 빨라 지고, PD1 SW를 누르면 점멸 속도가 느려지는 프로그램을 작성 하라.
- 처음 LED의 점멸 속도는 1 Sec 로 한다.
- SW를 누르면 한 단계 씩 속도가 변하도록 한다.
- Main 은 c 로 작성 하고, Timer 초기화와 Interrupt 처리, PD0와 PD1의 초기화화 Interrupt 프로그램은 Assembler로 작성 하여야 한다.
- 프로그램 예:GCC_c_asm_timer1_CTC_led_sp_contl.zip
- Timer 2 Over Flow Interrupt를 이용 한 Time Delay 예
- 2 Line LCD에 문자를 출력 하는 예(Timer 2 Over Flow Interrupt를 이용)
- Timer2 Over flow Interrupt Delay를 이용 한 Soft Keypad 제어 프로그램 예
- External Interrupt 와 Timer2 Overflow Interrupt를 이용한 Keypad 제어 프로그램 예
- External Interrupt 와 Timer3 Overflow Interrupt, Circular Buffer 를 이용한 Keypad 제어 프로그램
- Keypad Input에 External Interrupt 와 Timer3 Overflow Interrupt를 사용 할 것.
- keypad Input은 Circular Buffer에 저장 하고 필요할 때 get_char_buf() 함수를 이용 하여 Circular Buffer로 부터 문자를 read 하여 사용 한다.
- Conditional Profiling 예 이다. SW PD0를 누르고 keypad key 입력을 하면 입력된 Data가 Buffer에 저장 되고 출력 되지 않는다.
- 프로그램 예: GCC_asm_keypad_int_buffer_uart_timer3.zip
- PWM을 이용한 LED 밝기 제어
- Timer 1의 PWM을 이용 하여 LED의 밝기를 제어 한다.
- Timer3는 PWM Update 주기 발생에 사용 한다.
- PD0 SW를 누르고 있으면 LED 전체(0에서 7번 Bit 까지 모두)의 밝기가 서서히 밝아지고,
- PD1 SW를 누르고 있으면 LED 전체(0에서 7번 Bit 까지 모두)의 밝기가 서서히 어두워 지는 프로그램을 작성 하라.
- 프로그램 예: GCC_c_asm_led_PWM_bright_contorl.zip
- GCC c와 GCC Asmbly 언어를 사용 하여 Digital Clock를 구현 하라.
- main() 과 중요 함수는 c로 작성 하고 Device Driver는 Assembly 언어로 작성 할 것.
- Keypad를 입력 장치로 LCD를 출력 장치로 사용 하여,
- 시간, 분, 초 시간을 표시 하고,
- 현재 시간 설정이 가능 한 가능한 Digital Clock를 구현 하라.
- # Key: Alarm 시간 설정
- 프로그램 예: GCC_c_asm_digital_clock_timer1.zip
- Input Capture 을 이용한 펄스폭 측정 응용 예
- 펄스폭 측정 응용 예: Infrared_remote_interfacing.pdf
- Input Capture 을 이용한 펄스폭 측정
- 펄스폭 측정 : Timer1A의 Input Capture Rg(ICP1)를 이용 한다.
- 피 측정 펄스를 발생 : Timer1A의 Output Compare Register(OCR1A)를 측정 펄스를 발생 시키기 위하여 사용 한다.
- 피측정 신호의 펄스 폭을 측정 하기 위하여 Timer 1의 펄스 출력을 Timer 1의 Input Capture Register Tregger 신호의 입력 단자로 사용 한다.
- 회로 연결 : 외부 단자 연결 : Timer 1의 펄스 출력(J2 --> 7번)과 Timer 1의 Input Capture Register Tregger 신호의 입력 단자(J2 --> 16번)을 연결 한다.
- 펄스 폭 제어 Key
- * Key: 이 Key를 누르면 펄스 폭을 증가 시킨다.
- # Ket: 이 Key를 누르면 펄스 폭을 감소 시킨다.
- 프로그램 예: GCC_c_asm_input_capture_pulse_width_meas.zip
- Input Capture 을 이용한 Event(주파수) 측정
- Event Counting : Timer1A의 TCNT1 Rg 와 Input Capture Register를 Event Counting 목적으로 사용 한다.
- 측정 주기(1Sec) 발생 : Timer3A의 Output Compare(OC3A)를 측정 주기(1Sec) 발생 목적으로 사용 한다.
- 피 측정 Event 발생 : Timer0의 Output Compare(OC0)를 피 측정 Event 발생 장치로 사용 한다.
- 회로 연결
- Event 신호 연결 : Event 신호(OC0(PB4 : J2 --> 6번)) --> TCNT1의 입력 T1를 Event 입력 단자(T1(PD6 : J2 --> 18번))을 연결 한다.
- Input Capture 신호 연결 : 측정 주기(1Sec) 신호(OC3A(PE3 : J1 --> 6번)) --> Input Capture Register Tregger 신(ICP1(PD4 : J2 --> 16번))을 연결 한다.
- Event 주기 제어 Key
- * Key: 이 Key를 누르면 Event 주기가 빨라 진다.
- # Ket: 이 Key를 누르면 Event 주기가 느려 진다.
- 프로그램 예: GCC_c_asm_event_counter.zip
Timer/Counter에 대한 설명 자료는 ATmega128 timer를 참고 할 것.
- 기본 AVR Instruction 이해를 위한 Assembly Programming 예
- Pointer Register의 이용 예
- 산술 연산의 기초: avr_gcc_asm_arithmetic_basic.pdf
- 연산 프로그램 예
- 연산과 Loop 사용 프로그램 예
- Binary -> BCD, BCD -> 문자열 변환
- binary-BCD_Converting.pdf
- BCD Arithmetics_doc0938.pdf
- Binary 를 BCD Code로 변환 하는 예 : GCC_asm_bin2BCD16.zip
- Binary 를 BCD Code로 변환 하고 BCD를 문자열로 변환 하여 출력 하는 예 :GCC_asm_bin2BCD16_print.zip
- UART를 이용한 정수 입·출력(문자열을 2진수로 변환, 2진수를 10진수 문자열로 변환 하여 출력 하는 예) 예: GCC_asm_add_uart.zip
- 16 Bit 정수를 8 Bit 정수로 누는 예 : GCC_asm_div16_8.zip
- 4자리 BCD 정수의 입력과 BCD 연산 후 Decimal로 조정 하는 Utility Function 예:GCC_asm_BCD_util_s.txt
- Subroutine에 Parameter Passing 하기
- uP 내부의 Register를 이용 하는 예 : AVR_asm_param_pass_Rg_add.zip
- Stack를 이용 하는 예 : AVR_asm_param_pass_stack_add.zip
- Memory Block과 Pointer를 이용 하는 예: AVR_asm_data_pass_memory_add_long.zip
Pointer, 연산 알고리즘, Data의 Format Conversion, Subroutine에 Parameter Passing 하기, Global Variable과 Local Variable을 이해 하기 위한 Chapter 이다.
- Software Debugging 방법에 대한 자료
- Carry Flag를 clear 하지 않아 발생 하는 문제 예
- Input Port의 Pin 신호를 읽기 1.5 Cycle 전에 안정화 시키지 못하여 발생 하는 문제 예
- Interrupt Flag를 Clear 하지 않아 발생 하는 문제 예
- Profile(Unconditional 과 Conditional 두 가지 경우를 포함 하고 있음)를 이용한 Debugging 예:
- Conditional Profiling를 사용한 Debugging 예
프로그램 개발 시에 여러 종류의 오류가 발생 하기 때문에 이를 발견 하고 정정 하는 기술과 장비가 필요 하다.