이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

avr-asm-programming 통합 요약

Assembly Language Programming
  Assembly Language Programming 통합 요약



  • AVR Studio 환경에서 Assembly Language Program 작성 하기
    • 이 페이지에서는 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 한 프로그램을 작성 하기에 적합 하다.

    • 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
    • Atmel AVR Assembly Language Program을 쉽게 작성 할 수 있게 하기 위한 Template

      GCC AVR Assembly Language Program을 쉽게 작성 할 수 있게 하기 위한 Template


  • ATmega128 I/O Ports 이해를 위한 프로그램 예
    • ATmega128 I/O Ports에 대한 설명 자료는 ATmega128 I/O Port를 참고 할 것.

    • Time Delay Routine에 대한 이해를 위한 과제: AVR_asm_led_flash_basic
    • LED 가 1 Sec 주기(Software Delay를 사용)로 점멸 하는 프로그램을 AVR Assembly 언어와 GCC Assembly 언어로 각각 작성 하라.

    • 논리연산( Shift 포함)과 Time Delay에 대한 이해를 위한 과제
    • 0.2Sec 간격으로 00000001, 00000010, 00000100 -- 10000000, 00000001과 같이 led 가 Turn On 되는 프로그램을 AVR Assembly 언어와 GCC Assembly 언어로 각각 작성 하라.

    • I/O Port 와 SW에 대한 이해와 Debugging 기술을 이해하기 위한 Assembly Program 예
    • Pin Input, Output PORT, Shift operation에 대한 이해를 위한 과제
      • 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 인 경우에는 현재 회전 방향을 유지 한다.

      • AVR_asm_led_sw_shift.zip
      • GCC_asm_sw_led_basic_shift.zip
    • Pin I/O 대한 이해를 위한 과제

  • UART( Universal Asynchronous Receiver/Transmitter)의 이해를 위한 프로그램
    • UART에 대한 설명 자료는 Serial I/O(UART) Communication를 참고 할 것.

    • UART 비동기 직렬 통신 프로그램의 개념을 이해 하기 위한 과제
      • UART 초기화, 개발 보오드와 터미널(PC에서 실행 되는 통신 프로그램)사이의 문자와 문자열 통신의 이해를 위한 예

      • AVR_asm_usart_io_basic.zip
      • GCC_asm_usart_io_basic.zip: GCC Assembly 프로그램은 GCC C 프로그램과 호환성을 위하여 AVR Assembly 프로그램과 다른 Rg를 사용 함.
    • UART 통신을 이용한 Microcontroller 제어를 이해 하기 위한 과제
      • 컴퓨터 터미널(모니터) 프로그램(Tera Term, OC_Cnnsole 등)에서 문자 L 이 입력 되면 LED(PORTF)가 00000001, 00000010, 00000100 과 같이 좌측으로 회전 하고, R 이 입력 되면 LED 가 00000001, 10000000, 01000000 과 같이 우측으로 회전 하는 프로그램을 AVR Assembly 언어로 작성 하라.

      • AVR_asm_led_usart_shift.zip
    • UART 통신과 문자열(String) I/O을 이해 하기 위한 과제
      • 문자열을 다음과 같은 Format으로 입출력 하는 프로그램을 Assembly 언어로 작성 하라.

        • 첫 줄 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

  • Parallel Port Interface(Switch, LCD, Keypad)의 이해를 위한 프로그램
    • SW Interfacing과 Bouncing 문제
    • LCD 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

      • 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에 대한 이해와 응용

  • C 프로그램과 Assembly 언어 프로그램을 Mixing한 프로그램 개발
    • C 프로그램과 Assembly 언어 프로그램을 Mixing한 프로그램 개발의 이해를 위한 자료: mixingCnAssembly.pdf

    • c Listing file에 대한 이해
    • C 프로그램과 Assembly 언어 프로그램을 Mixing한 프로그램 예
    • 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

  • External interrupt를 이해 하기 위한 프로그램

  • Timer/Counter를 이해 하기 위한 프로그램
    • Timer/Counter에 대한 설명 자료는 ATmega128 timer를 참고 할 것.

    • 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 을 이용한 펄스폭 측정 응용 예
    • 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

  • AVR Instruction과 Programming

  • Software Debugging 기술

  • GCC Assembler를 사용 하여 프로그램을 개발 하는데 유용한 Utility Function 모음


  • Assembly Language Programming 관련 페이지 보기