너무 오랜만에 포스팅을 하는거 같습니다..ㅠㅠ 몇달만인지...

그래서 하루방문자는..여전히..2자리에..1과~2를 왔다갔다..ㅋㅋ

이제부터 열심히 하겠습니다!ㅎ 그동안 쌓아놓은 자료들이 참 많습니다! ㅎ

여튼 여담은 여기서 끝내고 MCU 내부구조에 대해서 자세히 알아보겠습니다^^

-------------------------------------------------------------------------------

STACK POINTER 의 뒤를 이어서~ 이번에는 왼쪽 부분의 구조를 살펴보겠습니다.




6) 프로그램 카운터


프로그램 카운터는 내가 실행시킨 명령어의 주소를 가리키는 역할을 한다.

자 이게 무슨말이냐 하면 이전에 ATmega128은 플래시 프로그램 메모리를 128K 가지고 있다고 하였습니다.

이 메모리는 응용프로그램부 (사용자가 직접 코딩하여 만든 프로그램을 넣는공간)와 부트 프로그램부로 나눠지고

응용프로그램은 그냥 시스템에 전원이 들어오면 막 실행되는 것이 아니라 "프로그램 카운터"를 거쳐서 실행이 됩니다.

즉, 프로그램의 실행은 MCU가 프로그램카운터가 가리키는 주소의 명령어를 차례대로 실행시키는데 그 주소가 

아마 응용프로그램부의 프로그램을 가리키니깐 우리가 코딩한 프로그램이 실행이 되겠지요? ㅎㅎ


따라서, 

프로그램 카운터 = 줄여서 PC 라고 하겠습니다! 


PC의 크기는 16bit 이고~ 그래서 64[Kword](2x64Kbyte) = 128Kbyte)의 FLASH PROGRAM MEMORY 공간을 가리킬수 있습니다.


7) 명령어 레지스터 (Instruction register)


앞에서 PC는 명령어 실행을 위해 플래시 프로그램메모리의 주소를 가리키고있다고 했습니다. 그럼 가리키고만 있으면 무언가 실행이 될까요? 아마 안되겠죠? 그래서 명령어 레지스터는 해당된 주소의 저장된 명령어를 명령어 레지스터로 인출합니다 ^^

(그리고 각 명령어는 "명령코드,오퍼랜드,연산결과가 저장될 내용(항목)"들을 가지고 있습니다.)


(오퍼랜드 : 컴퓨터 프로그래밍에 있어서 연산 대상이 되는 값이나 변수를 지칭하는 말이다. 연산 내용을 나타내는 기호는 [연산자] 또는 [오퍼레이터(operator)]라고 한다. 예를들어 [A + 10]라는 식에서, [A]와 [10]은 오퍼랜드이며, [+]는 오퍼레이터이다. 기계어나 어셈블리 언어에서는 명령 대상이 되는 레지스터나 값을 오퍼랜드라고 부른다.)


8) 명령어 디코더 (Instruction decoder)


명령어 디코더는 명령어 레지스터로 가져온 명령어를 디코딩하여 명령코드에 해당하는 제어신호를 만듭니다.

따라서 위의 일련의 과정을 따라서 우리가 코딩한 프로그램이 PC를 통해 명령어 레지스터로 가져와지고 명령어 디코더로 해석되어져서 제어신호가 나오고 ALU로 전달되거나 그 결과값이 어딘가 저장되는 겁니다. 오해하시면 안되는 부분이 명령어를 해석하고 바로 I/O핀으로 출력신호가 나오는것이 아니라~ 이제 연산과정을 거치러 ALU로 이동한다는것입니다 ^^



**상태레지스터 예제문제**

이런건 시험에서 많이 출제하시더라구요..ㅎㅎ 제가 다니던 학교에서도 이걸 풀었습니다..ㅠㅠㅋㅋ 

아무쪼록 도움이 되었으면 합니다 ^^


I(7) : interrupt enable    1= 전체 interrupt enable, 0 = 전체 인터럽트 disable


T(6) : 비트 복사 저장,

      BST명령으로 레지스터의 한 비트를  T bit에 복사한다.

      BLD명령으로 T bit를  레지스터의 한 비트에 복사한다.


H(5): half carry flag  :   0000 1000 + 0000 1000 <-이와같이 연산결과 비트3에서 비트4로 캐리가 발생하면 1이 된다. half carry 발생

                                 이는 BCD연산에 유용하다.

 

S(4):  sign bit :  V 배타적 OR  N (XOR을 의미합니다)


V(3): overflow bit  :  2의 보수 오버플로 플래그 (그냥 오버플로가 아닙니다!), 비트7과6의 배타적 OR


N(2): negative bit :  연산결과가 MSB가 1이면 이 플래그가 1인된다. 음수라는 의미임


Z(1): zero bit : 연산결과 모든 비트가 0이면 이 플래그가 1이 된다. 0을 나타냄


C(0): carry bit : 연산결과 MSB에서 캐리가 발생하면 1이 된다.


[예제] 아래는 두수의 연산에 대한 결과를 상태레지스터로 나타낸 도표이다. 이를보고 두수의 관계를 설명하라.

 

 

 N

Z 

C 

관계 

설명 

 i = i - k;

1

0 

i < k

연산결과가 음수이며 캐리비트가 1이기 때문에 연산시 캐리를 빌려왔다. 따라서 i가 k보다 작다. 

 i = i + j;

 0

0 

알수없다 

결과가 음수인지 양수인지 알수없다. 단지 캐리비트가 1이라는 사실로는 아무것도 알수없다. 

 i = i - o;

0 

1 

i = 0 

Z비트가 1이면 연산결과가 0이다. 따라서 둘의 관계는 같다




**추가적으로 SREG는 가장 최근에 실행된 산술연산의 결과 정보를 저장합니다. 이 결과에 따라 다음에 실행되는 명령어에 영향을 끼치는 데요..문제는 ATmega128이라는 녀석은 인터럽트가 발생했을때 상태 레지스터를 하드웨어가 자동으로 저장않습니다. 따라서 소프웨어적으로 인터럽트 발생시 상태레지스터를 저장하고 인터럽트수행후 다시 복원을 해야 오류가 발생하지 않습니다.



갑자기 궁금해서 올려봅니다..ㅎㅎ BCH 와 BCD 란 무엇일까요? ---------------------------------


그전에 주의하실점은 같은 철자의 약자를 가진 BCH,BCD가 많다는 것입니다 ^^;

참고로 여기서 설명하는것은 MCU 프로그램을 코딩하실때 사용하시는 코드입니다~!


BCH (binary-coded hexadecimal) 

: 4자리의 2진법으로 표현된 16진법입니다!


16진 

BCH 

10진 

 0

0000

0001 

0010 

0011 


즉, BCH로 표현할수있는 숫자는 총 16가지 (2 X 2 X 2 X 2 = 16) 입니다. 0~15까지. 이는 하나의 BCH 숫자는 1개의 바이너리로 표현되기때문입니다. 또한, 이것은 C언어에서 사용하는 int형(signed)과 동일하겠군요..그럼 활용할수있는 방법이 떠오르시죠?..

그리고 AVR (저는 주로 AVR Studio를 사용합니다 ㅎ) 에서는 RAM주소와 같은것을 표현할 때 주로 사용합니다. 

ex) 0000H ~ FFFFH 따위로 표현.  

그렇지만 실제 코딩에서는 0X00  , 0X01 과 같은 1개의 자리가 16진을 의미하는 16진법형 표현을 가장 많이 사용합니다.

ex) 0x00 = 0000 0000 (2진법) = 0 (10진법) 을 의미합니다.

      0x10 = 0001 0000 (2진법) = 16 (10진법) 을 의미합니다.

      0x23 = 0010 0011 (2진법) = 35 (10진법) 을 의미합니다.


위의 예제를 보시면 이해가 아마 되실거라 생각됩니다. 나중에는 저 숫자들만 봐도 머릿속에서 자동으로 암산이 되실겁니다..^^:

실제적으로 가장많이 사용하는 형태이기때문에 헷갈리시지 않도록 잘 정리하시길 바랍니다.


BCD (binary-coded decimal) ------------------------------------------------------------------

: 2자리의 2진법으로 표현된 10진법입니다.



10진

BCD 

10

0001 0000 

12 

0001 0010 

32 

0011 0010 



 

세상에는 눈에는 보이지만 보이지 않는것이 더 많다..(?)
(이게 갑자기 왠 헛소리?)
이제부터의 부분은 이해하기가 까다롭고 힘듭니다..
(..제가..힘들었기 때문에...-_-)
암튼 서론은 이제 집어치우고 본론으로..!!
 이제부터는 ATmega의 내부구조에 대해서 정리하겠습니다.

 

 

 

[ATMEGA128의 내부구조]

일단 CPU부터 시작해보겠습니다..
아 그전에 위에 보이는 그림의 굵은 선은 앞장에서 말한 말한  버스입니다.
이 버스를 흔히 도로가에 다니는 시내버스, 동네버스~ 그런버스라고 가정해봅시다.
왜냐면 버스는 무언가를 이동시키기는 통로이기 때문입니다.!

 바로 시내버스는 많은 사람들을~
 저기 그림의 버스는 여러 데이터들을!!

암튼 앞으로 사용할 ATMEGA128은 명령어버스와 데이터버스로 두개의 버스로 분리된 (이게바로! 하버드구조) 구조입니다. 
그럼 이곳은 누가 사용하느냐? 아래의 표를 참조해주세요.
(굳이 여기서 폰이노만과 하버드구조를 비교하진 않겠습니다)
 

아래의 그림을 보시면 어디서 많이 본 이름들이 보입니다.
바로 위에서 내부구조라고 올려놓은 그림에서 중앙왼쪽부분만 따로 떼어놓은것이라고 볼수있습니다.


이 그림이 바로 CPU CORE부분입니다. 아트메가를 더 잘 이해하기 위해서는 분명히 이해하고 넘어가야할 부분이며 처음에는 그냥 이게 무슨 그림이지 이렇게 생각하며 넘어갈게 될겁니다. 하지만 후에 어느정도 공부를 하고 다시 보면 아 이 화살표가 왜 여기서 이렇게 가는지, 왜 이 구조도를 이렇게 그렸는지 어느정도는 이해할수있을 겁니다! 일단 이부분은 고성능 ALU가 32개의 일반목적레지스터를 단일싸이클로 처리 한다고만 하겠습니다.

 아래의 그림은 위의 CPU CORE부분과 동일한 부분을 첫번째 내부구조그림에서 필요한것만 잘라서 떼어낸 그림입니다.

1) 플래시 프로그램 메모리 

프로그램 메모리는 8비트로 구성되어있지만 기본적으로 한 개의 번지가 16비트 단위로 구성되어 16비트 마이크로프로세서인 것처럼 동작을 합니다. (8bit = 1byte / 16bit = 2byte)
아트메가의 플래시 메모리는 명령어(모든 AVR의 명령어는 16비트 또는 32비트 길이로 구성 )를 저장하는 역할을 하며 (후에 AVR STUDIO로 코딩하게되어 프로그램을 주입하게 되면 이곳에 저장됩니다.)

64Kbyte X16bit(2byte) = 128Kbyte
플래시로 되어 있는 내부 프로그램 메모리는 부트 프로그램 섹션(boot program section)과 응용 프로그램 섹션(application program section)의 두 가지 영역으로 나누어져 있습니다.

예를 들면 컴퓨터를 켰을때 ROM에 저장된 프로그램들이 실행되어 윈도우 부팅전까지 COMS셋업을 해주는것 처럼 그런 부분이 아트메가에선 부트섹션이며 컴퓨터에서 설치된 윈도우나 한글97과 같은 프로그램은 아트메가에서 사용자가 컴파일러로 작성한  프로그램으로  응용 프로그램 섹션에 저장됩니다.

 내부 프로그램 메모리는 특정의 메모리 잠금 비트(memory lock bit)를 사용하여 쓰기와 쓰기/읽기의 금지를 할 수 있습니다. 이는 내가 수고해서 만든 코드들을 다른 사람들이 훔칠수 없게 잠금장치를 거는것입니다. - 여기에 관해 역해킹을 알아봤는데 어셈로 저장된 Flash memory의 정보를 읽어올순 있지만..이를 다시 C코드화 하는건 경우의 수가 너무 많아서 불가능하다고 결론을 내렸습니다. 

 

2)ALU (산술-논리 연산장치) 

AVR의 ALU는 32개의 일반 목적의 동작 레지스터(general purpose working register)와 직접적으로 연계되어 동작합니다.

즉 ALU는 두뇌의 산술처리하는 부분에 해당되며 32개의 목적레지스터는 두뇌의 순간기억장치에 해당합니다. 이 두개가 서로 연계되어 더하기 빼기 등을 하며 동작하는 것입니다. 결국 컴퓨터는 0101...을 빠르게 연산하는 기계니깐요..
ALU는 레지스터 간 또는 레지스터와 상수 간의 산술 또는 논리 연산을 단일 클럭 사이클에 수행 연산된 결과에 대한 ALU의 상태를 상태 레지스터로 갱신됩니다. (3번 상태레지스터참고) AVR에서는 강력한 하드웨어 곱셈기를 가지고 있어서 부호있는 정수/부호없는 정수의 곱셈 연산과 소수점 형식의 곱셈 연산을 빠르게 수행할수있습니다.

 

3)상태 레지스터 (Status register)

가장 최근에 실행된 산술 연산의 명령어 처리 결과 에 대한 상태를 나타내 주는 레지스터입니다.
조건부 처리 명령에 의해 프로그램의 흐름을 변경하는데 사용될 수 있습니다.
(조건부 명령이란 FOR,WHILE,SWITCH.. 등을 말하는겁니다)
상태 레지스터는 인터럽트를 처리하는 과정에서 자동으로 저장되거나 복구되지 않으므로, 반드시 소프트웨어에서 이러한 동작을 처리하여 주어야 합니다. (즉 플립플롭처럼 유지되는거죠)

     

 I(7) : interrupt enable    1= 전체 interrupt enable, 0 = 전체 인터럽트 disable

(주로 코딩을 하시면 SREG레지스트중 i비트를 가장 많이 다루시게 될겁니다.)
 T(6) : 비트 복사 저장,  T bit를 통하여 bit 전송

(UART통신시 사용하면 편합니다)
 H(5): half carry flag  :   0000 1000 + 0000 1000  half carry 발생
 S(4):  sign bit :  V 배타적 OR  N (XOR을 의미합니다)
 V(3): overflow bit  :   1000 0000 + 1000 0000  overflow bit set

(오버플로는 음수+음수 = 양수 일때 발생합니다)
 N(2): negative bit :  연산결과가 음수임
 Z(1): zero bit : 연산결과가 0임을 나타냄
 C(0): carry bit : 연산결과 자리 수 올림(더하기), 혹은 빌림(빼기) 

위의 상태레지스터는 i비트빼고 잘 사용하진 않지만 후에 코딩이 길어지거나 프로그램의 조건문이 너무 길어지거나 애매할때 조금만 고민해보시면 사용이 편하다는걸 아시게될겁니다.

 

4) 범용레지스터 (위의 ALU와 함께 쓰이는 부분)

AVR의 고성능 RISC 명령을 수행하는데 최적화 되어 있는 레지스터
(SRAM의 일정한 한부분이 이루고있다. 일종의 특공대로 구성된 RAM으로 봐도 무방합니다)
1 바이트 크기(8bit)로 32개의 범용 레지스터로 구성

(R0~R25까지 데이터저장 또는 연산에쓰이며 R26부터는 2개씩 쌍으로 묶어서 16bit(2Byte)레지스터로 사용합니다. 또한 R26부터 총6개의 레지스터인데 각 한쌍씩 X,Y,Z레지스터라고 따로 부르고 있으며 X,Y는 데이터 메모리 지정, Z는 flash memory을 읽어올때 사용합니다.) 
연산의 대상이 누산기가 아닌 이들 32개의 범용 레지스터들을 사용하여 연산을 할 수 있어서 연산의 속도가 빠릅니다.
또한 레지스터간의 연산은 보통 1 사이클의 명령으로 이루어집니다.

 

5) 스택포인터(SP)

 

 마이크로컨트롤러 응용에서 서브루틴이나 인터럽트 발생시에 복귀되는 주소를 임시로 기억하기 위해서 사용되거나 일반 프로그램에서 지역 변수 또는 임시 데이터를 저장하는 용도로 사용되는 LIFO(Last In First Out) 구조의 메모리를 스택이라하며,

LIFO는 말그대로 마지막에 저장된 데이터가 맨 처음 불러져 나온다는 의미입니다.

[][][][][] 의 모양과 같이 한쪽이 막힌 동전지갑과 같은 동작이라고 생각하시면 이해가 빠릅니다.
스택 포인터는 항상 데이터의 상단(top of stack)을 가리키는 16비트 레지스터로서 SP라고 표시되는데, 이는 데이터 저장이 가능한 스택의 번지를 의미하는것입니다.

예를들어, C언어의 코딩중 스택의 의미를 극단적으로 표현해보겠습니다.

{  
  (1)번째 동전을 지갑에 넣어라;
    {    
      (2)번째 동전을 지갑에 넣어라;
      두번째동전을 빼라;   
    }
  첫번째동전을 빼라;  
 }

위의 명령은 설명을 위해 억지 예를 든것 뿐입니다.
프로그램의 실행은 바깥괄호부터 시작하지만 실제처리는 맨 안쪽 괄호부터 끝이납니다.
바로 스택을 이용하기때문입니다. 넣은순서대로 처리가 끝나는것이 아니라, 마지막에 넣은것이 먼저끝이되는 LIFI구조가 바로 스택입니다.


스택의 동작 : 푸싱(동전을넣는것), 팝핑(동전을빼는것) 동작으로 구분됩니다.
스택은 SRAM 영역내에 존재, SP 레지스터의 초기값은 적어도 0x60 번지 이상의 값으로 설정
(메모리구조는 다음에 한꺼번에 설명하겠습니다)


참고로 인터넷에 ATmeag128을 검색하시면 수두룩 빽빽하게 기본구조와 특징 핀에 대해서 설명을 하고있습니다. 당연히 그 자료를 더 많이 참고하시기 바랍니다.;; (아래그림의 출처는 저입니다 -_-;..물론 색깔입힌것밖에 없지만..ㅋㅋ)

 

『 들어가기에 앞서 알고가면 좋은 상식

  아트메가에서 TTL(Trasistor to Transistor Logic)신호란?

  Low신호 : 0~0.8V

  High신호 : 2~5.0V

  를 뜻하며 하위(0)와 상위(1)를 구분짓는 전압의 크기이다. 』

 

앞에서 AVR AVR 이라 말을 했는데 이건 아래와 같습니다.

 

『AVR 은 Alf(Bogen) Vergard(Wollen) Risc 의 약자로서 ATMEL사에서 제작된 RISC 구조의 MCU를 뜻합니다.. 가격적인 측면에서는 약간 고가라는 단점이 있으나 1 cycle에 1 instruction이 수행되는 고속의 MCU라는 점, ISP (In System Programming)이라는 기능을 통해 매우 저렴하게 개발환경을 구축할수 있다는 점, RISC 타입이고, Harvard Architecture의 특징으로 C언어에서 우수한 성능을 발휘한다는 점, 막강한 각종 컴파일러가 무료로 제공된다는 점, 이밖에 ADC, PWM, SPI 등등의 고기능을 손쉽게 구현할 수 있다는 장점이 있습니다.

또한 AVR의 강점으로 꼽을 수 있는 것은 제작사가 컴파일러 WAVRASM 과 상당히 강력한 디버거인 AVR Studio를 제공한다는 것입니다.  -출처 : 인터넷에 떠도는 내용-  』

 

▶ ATmega128의 주요특징

→ 속도 : 16MHz의 클럭을 사용할 때, 16MIPS의 연산속도를 갖는다.
              ATmega128 과 128L을 나누는 기준(물론 다른차이점도 존재)이기도 합니다.
ATmega128는 2.7V~5.5V의 전원 전압에서 동작하며, 시스템 클럭의 입력 범위        0~16MHz (ATmega128L : 2.7V ~ 5.5V , 0~8MHz)

 
→ 내장 메모리 :
              128K 바이트의 ISP 방식 프로그램용 플래시 메모리 (최대 10,000번 W가능)

               4K 바이트의 EEPROM (최대 100,000번 W가능)
               4K 바이트의 데이터 저장용 SRAM 
               128Kbyte= 플래쉬 메모리 , 4Kbyte = 데이터(SRAM+EEPROM) + 스택(SRAM)


→ 부가 I/O 장치 :
             독립적인 프리스케일러와 비교 모드를 갖는 2개의 8비트 타이머/카운터
             독립적인 프리스케일러, 비교 모드와 캡쳐 모드를 갖는 2개의 확장 16비트 타이머/카운터
             독립적인 오실레이터를 갖고 있는 실시간 카운터
             6개의 PWM 채널
             8채널 10비트 ADC
             2개의 프로그램 가능한 직렬 USARTs
             마스터/슬레이브 모드를 갖는 SPI 직렬 인터페이스
             내장된 오실레이터로 구현된 프로그램 가능한 워치독 타이머
             아날로그 비교기 내장
             53개의 프로그램가능한 입출력 I/O

            
→  기타 :
          전원 투입 리셋과 프로그램 가능한 저전압 검출(BOD : Brown-out Detection) 기능
          조정 가능한 RC 오실레이터의 내장
          리셋벡터와 8개의 외부 인터럽트 소스, 26개의 내부 인터럽트 소스
          슬립모드로서 6개의 전원 절약 모드를 가지고 있음 (아이들, ADC 노이즈 감쇄기, 전원 절감,

          전원 차단, 대기, 확장 대기)
          내장 메모리의 프로그래밍과 온칩 디버깅이 가능한 JTAG(IEEE std. 1149.1) 인터페이스 제공
          64핀의 TQFP(Thin Quad Flat Package) 또는 MLP(Micro Lead Frame) 패키지로 구성되어 있음


 

[외부적으로 보이는 아트메가의 핀의 구성과 용도]

 먼저 위 그림을 보시면 제가 힘들게 네모 반듯하게 색깔을 칠해놨습니다. 이건..머 중요한게 아니고.. 암튼 딱 보시면 구분이 되실겁니다.  ATmega128은 사용하기 편하도록 용도별로 포트들이 나누어져 있습니다. 총 64개의 핀이 존재하며 A~G포트로 분류되어있습니다. 앞으로 어느정도 공부하시고 지식이 쌓이시게 되면 저 그림 한장으로 설계에서부터 코딩까지 다 하시게 될겁니다. 가장 많이 보게될 그림입니다.

 

『내부풀업 : 내부적으로 나오거나 들어가는 신호를 강하게 만들어주는 기능 』

 

*모든 포트A~G핀은 양방향 I/O핀으로의 기능과 괄호안의 다른 중복기능을 가짐

 I/O는 DDRX, PORTX, PINX 의 레지스트리로 제어가능

*PINX로 검색해서 들어오시는 분이 계셔서 혹시나 해서 남겨봅니다^^; (후에 I/O포트로 다시 포스팅할예정입니다)
DDRX 의 경우 (X는 A,B,C~~등등 아트메가의 구분되는 포트명) 해당핀의 입력/출력을 정의하는 레지스터입니다!
이 값이 0값 일경우 해당핀은 입력으로 동작하며 1값일 경우 출력으로 동작이 됩니다.
즉 해당핀에 연결된 I/O가 LED라고 가정해보면 LED에 불을 켜고 싶다면 해당핀의 DDR값은 1값으로 출력으로 정의해야하며
설계하신 회로에서 LED의 다른핀은 GND가 연결되어있으며 반대쪽 핀은 ATmega128의 핀에 연결되어있다면
출력값을 정의하는 PORT레지스터에 1의 값을 주면 High신호인 5V의 값이 ATmega128의 해당핀에 나오게 됩니다.
그래서 LED에는 불이 켜지게 되겠지요 ^^;.. 설명이 장황하고 길었습니다만..요약하자면
ATMEGA128에 연결되는 I/O의 종류에 따라서 ATMEGA를 입력으로 사용할건지 출력으로 사용할건지는 DDRX 명령으로 내린다.
그래서 해당핀에 값을 출력한다면 PORTX레지로, 값을 읽어들인다면 PINX레지를 사용해야한다.
 

 

포트 A(PA7∼PA0) 

외부 데이터 메모리와 데이터 전송시 하위 주소와 데이터 버스로 사용
 - 외부메모리를 둘 경우에는 주소버스(A7-A0)와 데이터버스(D7-D0)로 사용.
8비트의 양방향 I/O 포트로 사용 가능
외부에 메모리를 인터페이스하지 않을 때에는 내부 풀업 저항(20㏀∼50㏀)을 갖음.


포트 B(PB7~PB0)  : 나눠서 다른 기능도 사용이 가능하다. 포트A는 불가.
포트는 중복된 기능을 가지고 있는 포트. 내부적으로 풀업 저항(20㏀∼50㏀)
8비트의 양방향 I/O 포트로 사용 가능

PB7(핀17) OC2,OC1C : 타이머2용의 비교신호 출력 혹은 타이머 1용의 비교신호C 출력
PB6(핀16) OC1B : 타이머 1용의 비교신호B 출력
PB5(핀15) OC1A : 타이머 1용의 비교신호A 출력
PB4(핀14) OC0 : 타이머0 용의 비교신호 출력
PB3(핀13) MISO : SPI 채널의 마스터 데이터 입력 혹은 슬레이브 데이터 출력 신호 단자
PB2(핀12) MOSI : SPI 채널의 마스터 데이터 출력 혹은 슬레이브 데이터 입력 신호 단자
PB1(핀11) SCK : SPI 채널의 마스터 클럭 출력 혹은 슬레이브 클럭 입력 신호 단자
PB0(핀10) SS : SPI 태널의 슬레이브 선택 입력 신호 단자


포트 C(PC7~PC0)
외부 데이터 메모리와 데이터 전송시 상위 주소와 데이터 버스로 사용
외부메모리를 둘 경우에는 주소버스(A15-A8)로 사용된다.
8비트의 양방향 I/O 포트로 사용 가능
외부에 메모리를 인터페이스하지 않을 때에는 내부 풀업 저항(20㏀∼50㏀)을 갖음

 

*ATmega128은 외부메모리 확장시 64K 까지 가능하다. 이는 위의 노랑과 초록으로 표시한 포트A,C 총16핀 을 이용한 주소와 데이터버스 사용이 가능하기 때문이다. 2의 16승은 64K 이기 때문이다.


포트 D(PD7∼PD0)
포트는 중복된 기능을 가지고 있는 포트.  내부적으로 풀업 저항(20㏀∼50㏀)  8비트의 양방향 I/O 포트로 사용 가능

PD7(핀32) T2 : 타이머2 클럭 입력
PD6(핀31) T1 : 타이머1 클럭 입력
PD5(핀30) XCK : USART1 외부클럭 입출력
PD4(핀29) ICP1 : 타이머1 입력 캡춰
PD3(핀28) INT3/TXD1 : 외부인터럽트 3 혹은 USART1 송신
PD2(핀27) INT2/RXD1 : 외부인터럽트 2 혹은 USART1 수신
PD1(핀26) INT1/SDA : 외부인터럽트 1 혹은 2선 방식의 직렬 인터페이스용 데이터 단자
PD0(핀25) INT0/SCL : 외부인터럽트 0 혹은 2선 방식의 직렬 인터페이스용 클록 단자



포트 E(PE7~PE0)
내부 풀업 저항이 있는 8비트 양방향 입출력 단자. 타이머용 단자, 외부인터럽트, 아날로그 비교기, USART용 단자로도 사용된다
내부적으로 풀업 저항(20㏀∼50㏀) 8비트의 양방향 I/O 포트로 사용 가능

PE7(핀9) INT7/ICP3 : 외부인터럽트 7 혹은 타이머3 입력 캡춰
PE6(핀8) INT6/T3 : 외부인터럽트 6 혹은 타이머3 클럭 입력
PE5(핀7) INT5/OC3C : 외부인터럽트 5 혹은 타이머 3용의 비교신호C 출력
PE4(핀6) INT4/OC3B : 외부인터럽트 4 혹은 타이머 3용의 비교신호B 출력
PE3(핀5) AIN1/OC3A : 비교기 -입력 혹은 타이머 3용의 비교신호A 출력
PE2(핀4) AIN0/XCK0 : 비교기 +입력 혹은 USART0 외부 클럭 입출력
PE1(핀3) PDO/TXD0 : 프로그램 데이터 출력(ISP 케이블의 MISO와 연결) 혹은 USART0 송신
PE0(핀2) PDI/RXD0 : 프로그램 데이터 입력(ISP 케이블의 MOSI와 연결) 혹은 USART0 수신



포트 F(PF7∼PF0)
포트는 중복된 기능을 가지고 있는 포트 . 내부적으로 풀업 저항(20㏀∼50㏀)  A/D 컨버터의 입력포트로 사용
8비트의 양방향 I/O 포트로 사용 가능

PF7(핀54) ADC7/TDI : ADC 입력채널 7 혹은 JTAG 테스트용 데이터 입력 단자
PF6(핀55) ADC6/TDO : ADC 입력채널 6 혹은 JTAG 테스트용 데이터 출력 단자
PF5(핀56) ADC5/TMS : ADC 입력채널 5 혹은 JTAG 테스트용 모드 선택 단자
PF4(핀57) ADC4/TCK : ADC 입력채널 4 혹은 JTAG 테스트용 클럭 단자
PF3(핀58) ADC3 : ADC 입력채널 3
PF2(핀59) ADC2 : ADC 입력채널 2
PF1(핀60) ADC1 : ADC 입력채널 1
PF0(핀61) ADC0 : ADC 입력채널 0



포트 G(PG4~PG0)
포트는 중복된 기능을 가지고 있는 포트 . 내부적으로 풀업 저항(20㏀∼50㏀)
외부 메모리 접속을 위한 스트로브 신호용, RTC(Real Time Counter) 타이머용 발진기 단자로도 사용된다
5비트의 양방향 I/O 포트로 사용 가능
           : 마스터 리셋 입력(액티브 LOW 신호)

PG4(핀19) TOSC1 : 타이머 0의 RTC 기능 사용시 클럭 발생을 위한 수정발진자 접속단자
PG3(핀18) TOSC2 : 타이머 0의 RTC 기능 사용시 클럭 발생을 위한 수정발진자 접속단자
PG2(핀43) ALE : 외부 메모리에 접근할 때 하위주소값을 래치하도록 신호를 출력
PG1(핀34) RD : 외부 테이터 메모리를 읽을 때 사용되는 스트로브 신호 출력 단자로 사용
PG0(핀33) WR : 외부 데이터 메모리에 쓸 때 사용되는 스트로브 신호 출력 단자로 사용


기타핀 (11개핀)
AVCC : A/D 컨버터 및 포트 F의 전원 (아날로그 장치에 공급하는 별도의 전원)
AREF : A/D 컨버터의 참조전압
PEN : SPI를 활성화 시키는 프로그래밍 인에이블 핀

RESET : 리셋신호, 최소 50Ns이상 low 상태유지 필요
XTAL1, XTAL2  : 크리스탈이나 오실레이터가 연결되어야 함.
VCC, GND : 작동을 위한 필수연결.

(VCC와 GND가 2~3개씩 존재한 이유는 원활한 공급을 위해서입니다)


앞으로 쓰일 필수 개념과 용어 정리.

 ■ 메모리 : RAM과 ROM으로 물리적으로 구분할수있습니다. (휘발성, 비휘발성)

        

 


SRAM : POWER ON시 내용유지됨

DRAM : POWER가 있더라도 사용자가 조치를 안취하면 소멸됨

PROM : 1회 프로그램가능

EPROM : R/W가능(IC위)

EEPROM : 전기적신호로 R/W

CACHE : 빠른 SRAM을 뜻한다고 일단 생각하고 넘어가겠습니다.

 

 AVR에서 용도에 관해서 메모리를 구분하면

1.플래쉬메모리 : 프로그램 코드를 저장합니다.                                       [프로그램메모리]

2.SRAM : 프로그램 코드를 실행하는 도중 발생되는 데이터를 저장합니다.  [데이터메모리]

3.EEPROM : 별도의 고정적인 데이터를 저장합니다.                               [데이터메모리]

그래서 플래쉬메모리가 128Kbyte인 ATmega128의 경우 뒤의 128은 바로 플래쉬메모리의 크기를 얘기합니다. (후에 자세히 포스팅)

 

■ 입출력장치

 

말그대로 인풋 아웃푹을 말하는 I/O입니다. 입출력장치로 말하고요..별거 없습니다.

 

■  하버드 구조 (RISC) : Reduced Instruction Set Computer

 

 

간단히 말해 명령어와 데이터가 서로 다른 버스를 사용하는 구조라는 것입니다.

아마 바로 이해되시지는 않을겁니다. 먼저 이를 이해하기 위해서는 버스개념과 데이터, 명령어

이 3가지를 확실히 알고계셔야 합니다.( 네이버에 검색을 통해 )

그래서 명령어와 데이터를 동시에 CPU로 전달할수 있기때문에 빠른 수행이 가능합니다.

(도로가 시골길 이었는데 왕복 2차선이 된것과 같은 느낌이지요..)

 

■ BCH 코드 : 16진법과 10진법을 2진법표현으로 나타낸 코드

 

  흔히 BCD코드라고 많이 부릅니다. 저도 BCH로 불러야할지 잘은 모르겠으나 어쨌든 앞으로의 코딩시

15까지의 수를 2진수로 표현하기 때문에 눈에 익혀놓으시기 바랍니다.

후에 코딩시 0xFF 나 FFFFH, 0000H 라는 표현을 자주 접하실텐데요 그것과 관련된 내용입니다.

또한 BCH코드로 비트연산이 가장 중요하나 지금은 이런게 있다고만 아시고 나중에 자세히 다시 설명하겠습니다.

 

■ 아스키코드 : 미국에서 표준화가 추진된 7비트 부호. 1963년 당시의 ASA(American Standards Association:미국 표준 협회)에

의해 제정되어 미국의 표준 부호가 되었다.


아스키코드는 컴퓨터 인터페이스(장치)들간의 소통언어라고 볼수있습니다.

소통시에는 위에서 쓴것처럼 BCH 코드로 8비트씩 끊어서 아스키코드로 PC에 입력됩니다.


 

 



마이크로컨트롤러를 공부하는 가운데 가장 흔해빠지고 정보를 쉽게 찾을수 있는
마이크로컨트롤러가 바로 ATmega128입니다.

마이크로컨트롤러는 마이크로프로세스와는 엄연히 다른단어입니다.
우리가 흔히 사용하는 PC의 중앙처리장치 CPU가 마이크로프로세서라 부르고
있으며 마이크로컨트롤러는 거기에 입출력장치(I/O)나 메모리 등이 내장된 형태
 즉, 자기자신만으로 동작이 가능한 형태를 말합니다.

 
 

 오늘도 저를 비롯한 많은 공대생들이 아무런 기초지식도 없이
순전히 인터넷의 힘과 달랑 책한권으로 AVR을 향해 맨땅에 헤딩합니다..



 AVR을 처음시작하시는 분께 조금이나마 제 포스팅이 도움이 되길 바라며 지금부터 조금씩 작성해보겠습니다...
누군가를 가르치거나 설명하는것엔 아직 미숙하기에 그냥 연습장삼아 몇개 끄적끄적인거라 생각하시고 넓은 아량으로 읽어주시면 좋겠습니다..

 

-----------------------------------------------------

 

AVR을 시작하기에 앞서 필요한 준비물. 

기필코 하고야 말겠다는 불타는 투지.

끝.

+ Recent posts