AVR for Arduino/Atmel MCU

AVR 코딩에 대한 이해가 필요해서 아래와 같이 정리를 했다.



1. AVR이란 Atmel에서 개발한 MCU의 등록 상표인데, 아두이노 우노 보드에 쓰여서 많이 쓰이고 있다.



2. 아두이노는 Atmel의 MCU를 메인 프로세서로 사용하고, 언어 특성은 C/C++ 이다. 하지만 AVR 코딩 특성을 일부 반영하여서 아두이노 보드를 고속으로 동작시킬 수 있다.



3. 즉 아두이노에서 사용되는 명령어 세트들은 아두이노 보드를 보다 고속으로 작동시킬 수 있도록 AVR 수준 내지는 어셈블리어 형태에 가까운 특별한 명령어들이 사용된다.

그래서 외부로부터의 인터럽트 처리과정 (ISR)과 각 핀들의 입출력 모드 설정 (pinMode) 및 입출력에 해당하는 명령어를 혼합 사용하여 아두이노 보드의 연산 속도를 끌어올릴 수 있다.


4. 핀 모드 설정 방식

- pinMode(pin#, OUTPUT); pinMode(pin#, INPUT);
- PORT
 아두이노 우노 보드의 PIN PORT는 아래와 같이 정의된다.
    - PORTD: Digital pin 0~7 - PD0 ~ PD7
    - PORTB: Digital pin 8~13 - PB0 ~ PB5
    - 이렇게 PORTD, PORTB로 정의된 것은 C/C++에서 정의되는 것이 아니라, AVR에서 정의한 것이다.


5. 아두이노의 핀맵을 살펴보면서 설정을 어떻게 하는 지 보자.



Arduino UNO Pin Map
위의 아두이노 핀맵에서 Digital Pin으로 설정된 0 ~ 13을 사용하려면, 4번의 방법으로 pinMode(pin, args)으로 미리 설정해주어야 한다. 참고로 이 pinMode는 "Arduino.h"에서 정의되어 이용이 가능한 것이다. 

혹은 PORTD, PORTB를 이용해서 설정할 수도 있다. 참고로 이 PORTD, PORTB, DDRD, DDRB는 AVR에서 정의되는 것이다.
pinMode와 digitalWrite에 해당되는 AVR의 정의를 아래와 같다.

Arduino 정의                /                AVR 정의 (Boolean Bit7 6 5 4 3 2 1 0)
pinMode(3, HIGH)     /                DDRD |= B00001000
digitalWrite(3, HIGH)/               PORTD |= B00001000
pinMode(8, HIGH)     /                DDRB |= B00000001
digitalWrite(8,HIGH) /               PORTB |= B00000001

|= (or) 은 Port를 8비트 Boolean 정보를 OR로 연산처리해서 DDRD, PORTD,.. 에 값을 입력한다는 것이다. 또한 여기서 8비트 앞에 B는 Boolean을 의미한다.


6. 아두이노 매뉴얼에 나와있는 digitalWrite과 pinMode는 아래와 같이 정의되어 있다.



 digitalWrite()

[디지털 입출력]
설명
HIGH 또는 LOW 값을 디지털 핀에 출력합니다.

핀이 pinMode() 를 통해 OUTPUT 으로 설정되면, 그 핀의 전압은 HIGH 일 때 5V(또는 3.3V 보드에서 3.3V), LOW 일 때 0V (ground)로 설정됩니다.

핀이 INPUT 으로 설정되면, digitalWrite() 는 입력 핀의 내부 풀업 저항을 활성화 (HIGH) 또는 비활성화 (LOW)할 것입니다. 내장 풀업 저항을 활성화하기 위해서는 pinMode() 를 INPUT_PULLUP 으로 설정하는 것을 권장합니다. 디지털 핀 튜토리얼을 보면 더 많은 정보가 있습니다.

pinMode() 를 OUTPUT 으로 설정하지 않고 LED를 핀에 연결하면, digitalWrite(HIGH) 가 불릴 때 LED 불빛이 흐리게 나타날 수 있습니다. 명시적으로 pinMode() 를 설정하지 않으면 digitalWrite() 는 내부 풀업 저항을 활성화시킬 것이고, 그것은 마치 전류를 제한하는 큰 저항처럼 동작할 것입니다.


pinMode()

[디지털 입출력]
설명
특정 핀을 입력 또는 출력으로 동작하도록 설정합니다. (digital pins)의 설명을 보면 핀들의 기능이 자세히 나옵니다.

아두이노 1.0.1부터, INPUT_PULLUP 모드를 통해 내부 풀업 저항을 활성화할 수 있습니다. 덧붙여, INPUT 모드는 명시적으로 내부 풀업을 비활성화합니다.


7. 아두이노 PORT 사용의 예 (AVR 기반)


- pin 4, pin 6LED ONPORTD |= B01010000 -> digitalWrite(4, HIGH), digitalWrite(6, HIGH)

- pin 10 LED ON
PORTB |= B00000010 -> digitalWrite(1, HIGH)

- 추가로 pin 3에 LED ON
PORTD |= B00001000 를 수행하면,
결과는 PORTD = B00111000 이다.


8. 추가적으로 PORTC에 대한 (아날로그 핀) 정리


PORTC는 아날로그 핀이며 PC0에서 PC5까지 6개의 pin이 존재한다.






- 참고:
https://steemit.com/kr/@codingart/49-avr-ddrd-portd-led-on-off
https://www.arduino.cc/reference/ko/language/functions/digital-io/digitalwrite/

Comments

Popular posts from this blog

UART Communication

RS-485 Communication 구현