ATmega128A의 메모리 구조(I/O 레지스터) 헤더파일 생성 및 #if

 

#1. ATmega128A 메모리의 구조

 

학습목표 - ATmega128A의 구조와 폰노이만/하버드 구조에 대해 안다.

 

ATmega128A 데이터시트의 7. Memories를 살펴 본다.

 

//ARM은 레지스터의 메모리가 주소가 나와 있지 않다. 레지스터의 개수가 크기 때문이다. 때문에 메뉴얼에 적힌 기본 주소를 보고 주소를 유추하여 사용하여야 한다.

 

<ATmega256A 메모리맵>

 

$1100번지 이후는 외부메모리를 장착하여 사용하여야 한다.

ATmega는 확장메모리가 설치 되어 있는지 알 수 없기 때문에 확장 SRAM 없이 확장영역의 주소를 입력하여도 에러가 나지 않는다.

Flash메모리에 firmware가 설치되는데 flash메모리는 128kbyte를 넘어갈 수 없기 때문에 펌웨어의 용량이 커져 버리면 해당 펌웨어를 사용할 수 없다.

 

//Compile을 거치면 해당 CPU가 인지 할 수 있는 기계어로 변경된다.

 

 

이전 주소는 CPU이지만 주소 값을 가짐으로 메모리 맵에 표시해 준 것이다.

 

실제 메모리의 주소는 $100번지부터이다.

 

CPUALU가 들어있지 않고 따로 분리 되어 2개의 버스로 명령어를 처리하는 구조를 하버드 구조(Harvard Architecture)라고 한다. I/O mapped Memory 방식을 가지고 있다.

 

CPU안에 ALU가 들어있는 구조를 폰 노이먼 구조라고 하고 이것은 I/O mapped I/O 방식이다.

 

폰 노이만 구조에서는 RAM에 실행파일과 논리연산 명령이 동시에 있을 경우 병목 현상이 생기게 된다. 이를 해결하기 위해 등장한 것이 하버드 구조이지만 하버드 구조는 BUS가 폰노이만 구조의 2배가 들고 이에 따라 제어를 위한 부가적인 장치 및 소프트웨어가 필요하기 때문에 성능은 하버드 구조가 좋지만 비용 면에서는 떨어진다.

 

#2. 메모리 맵과 I/O레지스터 작동 원리

 

학습목표 - 메모리 맵과 I/O레지스터 작동 원리를 이해한다.

 

메모리의 5대 영역.

 

1. Code(함수, 상수)

2. Data

3. BSS

4. Heap // 운영체제가 있어야만 만들어지는 메모리 영역이다.

5. Stack(지역 변수)

 

//주소가 위의 순서대로 이루어지지는 않는다.

 

 

데이터 시트의 메모리로 다시!

 

GPR(General Purpose Register)은 기억을 담당하는 레지스터이다.

 

I/O 레지스터는 $0x20부터 - $0xFF까지이다. (자세한 I/O내용은 register summary에 나와있다.)

 

//PIN - Port In

//DDR - Data Direction Register, Data(0V or 5V)

 

 

 

#3. 회로입출력을 위한 C코딩

 

학습목표 - 입출력 제어를 위한 C언어를 작성하고 이해할 수 있다.

 

 

위에 회로에 입출력 값을 제어하기 위한 C코딩.

 

PORTA에 전압을 인가한다는 상황에서,

 

0x3A = 0x01;

 

왼쪽 주소를 compiler는 상수 주소로 인식하게 하게 위해

 

1. casting: (unsigned char *)0x0A = 0x01;

2. 포인터 사용: *((unsigned char *)0x0A) = 0x01;

3. 최적화 차단: *((volatile unsigned char *)0x0A) = 0x01;

 

//volatile 최적화를 위해 값을 바로 집어넣지 않고 GPR에서 가지고 있다가 후에 입력할 수 있기 때문에 최적화 없이 바로 집기 위한 선언!

 

4. 복잡한 명령어를 단축: #define DDRA (*((volatile unsigned char *)0x0A))

DDRA = 0x01;

 

//단축명령어는 만인이 알아 볼 수 있는 이름으로 해 주는 것이 세계평화에 좋다.

 

//PORT1을 입력하면(5V) 전원을 인가하면 양쪽에서 5V가 인가되어 전류가 흐르지 않게 된다.

#4. 헤더파일의 적용 및 #if #end

 

학습목표 - 헤더파일을 작성하여 삽입할 수 있다. #if #end문을 사용할 수 있다.

 

헤더파일을 만들어 보자!

p/566 26-3 조건부 컴파일(Conditional Compilation)을 위한 매크로

 

전처리 문에서도 if를 쓸 수 있다.

 

#if는 반드시 #endif와 한 쌍으로 사용되어야 한다.

 

if문을 사용하여 참이면 코드를 포함 거짓이면 코드를 포함하지 않는다.

 

 

예제 p/567을 컴파일하여(cl /P) *.i 파일을 생성한 후 열람하여 어떻게 전처리언어가 처리되었는지 확인해 보자.

 

#if #else 문도 삽입 가능하다! 또한 if문에서 참 거짓 뿐만 아니라 특정 조건도 지정 가능하다.

 

else if 문을 줄여서 #elif를 쓴다.

 



반응형
Posted by newind2000

스마트 컨트롤러 - 발광다이오드에 불 켜기

 

#1. ATmega128A Datasheet(Memory & Register Summary)

 

학습목표 - 메모리의 Register의 구조를 이해한다.

 

ATmega128A Datasheet를 본다.

 

지난 시간에 배웠던 메모리 부분을 복습.

 

메모리 관련 알아두어야 할 주소는 $0020 - $00FF까지이다.(I/O Reg.)

 

 

 

GPR(General Purpose Register)은 사용자(C언어)가 조작하는 것이 아니라 CPU에서 작업 수행 시 작동한다.

 

I/O Register는 기능을 수행하는 레지스터이다.

 

29. Register Summary

 

표에서 나온 내용 중 괄호 안에 있는 주소가 Configuration A임으로 괄호안의 주소를 참조하여야 한다.

 


#2 - #4. ATmega128A 실습 - 다이오드에 불켜기

 

학습목표 - 발광다이오드에 교대로 불이 들어오게 프로그램밍 할 수 있다.

 

// 다리가 긴 쪽, 다이오드 안에 역삼각형 덩어리가 들은 것이 +

 

//DDR - Data Direction Register

 

CPU 공간은 최적화를 시키면 안된다. 최적화는 2개 이상의 명령어가 있을 시 CPU에서 효율성을 따져 명령어를 수행하는 것인데 CPU는 휘발성 메모리이기 때문에 최적화에 적합하지 않다.

 

실습 - 간단한 입출력 코딩)

 

발광 다이오드에 불이 들어오도록 코딩을 해보자!


 

#define으로 주소값을 문자화 시켜서 다시 코딩해보자!


 

반복적으로 불을 켜고 끄는 명령어를 입력하게 되면 CPU의 처리 속도가 빠르기 때문에 불이 깜빡거리는 효과를 볼 수 없다. 이 때 for문을 넣어서 CPU가 일을 하게 만들어 준다.

 

하지만! CPU의 최적화기능 때문에 반복문을 다 해내지 않고 결과 값만 도출시키기 때문에 깜빡거리는 현상을 볼 수 없게 된다. 이 때 volatile을 선언하여 최적화 기능을 없애버린다.

 

이에 발광다이오드에 유휴시간이 생겨나 불이 깜빡거리는 현상을 보게 된다.

 

 

//“무궁화 꽃이 피었습니다코드 for(uiCnt=0;uiCnt<60000;++uiCnt);


















반응형
Posted by newind2000

ATmega128A Datasheet(특징 및 메모리)WinAVR설치

 

#1. ATmega128A Datasheet

 

학습목표 - ATmega128A의 데이터 시트를 보고 특징에 대해 안다.

 

ATmega128A Datasheet 계속

 

특별한 마이크로컨트롤러 특징

- 파워 리셋과 브라운 아웃 디텍터

 

//브라운 아웃 - 입력되는 전원에 따라 칩의 일부만 작동하는 것 - > 표준 전압 이하에서 작동하지 않게 해준다.

 

- 내부적으로 조정된 RC oscillator(발진기)

 

// Crystal oscillator와 회로로 주파수를 만들어 낼 수 있다.

// RC oscillator는 저주파수를 만들고 정확도가 떨어진다. 가격은 싸다.

 

- 내외부의 interrupt

 

#2. ATmega128A Datasheet

 

학습목표 - ATmega128A의 데이터 시트를 보고 특징에 대해 안다.

 

 

 

// Interrupt <-> polling

// 기계에 문제가 있을 때 알려주는 것을 interrupt'라고 한다. ex) 가스 누수 경보기

// 문제가 있는 지 찾아보는 것을 polling'이라고 한다. ex) 수동 바이러스 검사

// polingCPU core를 사용하여 작동한다.

// 칩에서 비싸다는 의미는 회로를 가지고 있다는 것이다.

 

- 6가지 슬립 모드

- 소프트웨어로 시간 주파수 선택 가능

- Fuse 조작을 통한 ATmega103 호환모드

 

// 스위치를 통해 전원이 들어가지 않았을 시

 

// 합선은 저항이 0일 때 전류가 무한대로 흐를 때를 말한다.

 

// 전기는 흐르기 쉬운 곳으로 흐른다.

 

// 저항이 어디 붙어 있느냐에 따라서 풀업/풀다운으로 나뉜다. 풀업/풀다운은 애매한 상태(3의 상태)를 없애기 위해 사용된다.

 

- 풀업 저항으로 한 번에 끌 수 있다.

 

입출력과 패키지

 

- 53개의 프로그래밍 가능한 라인

 

- 64 lead(다리, )

 

#3. ATmega128Acompiler 설치

 

WinAVR을 다운로드 받는다.

 

WinAVR 가장 최근 버전(WinAVR-20100110...exe)

 

// Sourceforge는 오픈소스를 제공하는 커뮤니티이다.

 

AVR Studio에는 compile 기능이 없다. compile 후에 chip에 프로그램을 전송시키는 역할만 한다.

 

WinAVR을 다운받으면 설치한다.

 

! 별 특이사항 없이 계속 진행하고, 실행시킨 후 시리얼 넘버를 넣어준다.

 

실습 - WinAVR로 컴파일)

 

 

AVR폴더를 새로 만들어서 기본형에 #include가 빠진 기본형을 만들고 main.c로 저장하자.

 









#4. ATmega128A Datasheet

 

학습목표 - ATmega128A의 데이터 시트를 보고 메모리에 대해 안다.

 

 

데이터 시트 계속

 

작동 볼트

- 2.7 - 5.5V (저전압에서 돌아가지만 성능이 떨어진다. 5.5V이상의 전압이 들어가면 타 버린다.)

 

속도 등급

- 0 - 16MHz

 

 

1. Pin Configurations

 

//작대기가 들어간 핀은 0이 들어가면 동작한다. 64 - 53 = 11개는 작대기가 들어간 핀이다.

7. 메모리

 

7.1 플래쉬 메모리(PC로 치면 하드 디스크)

 

//ATmega128A3가지 메모리로 구성되어 있다.(FLASH, SDRAM, EEPROM)

 

//데이터 시트는 16진수를 표시하기 전에 달러 표시로 알려준다. ex) $FFFF

 

- 플래쉬 메모리 용량은 65,546 -> 64kbyte

 

// Flash메모리는 한 칸에 2byte이다.

 

기본 명령어가 2byte 혹은 4byte이다.

Flash64K * 2byte로 구성되어 있다. 즉 총 메모리는 128K이다.

 

7.2 SRAM 메모리(RAM)

 

일반 모드에서는 4096바이트를 사용 가능하며 외부장치 부착하여 64K 용량 확장 가능

 

확장된 160개의 입출력 레지스터의 사용 여부에 따라 AB로 나뉜다.

 

지정된 메모리 주소에 값을 입력하면 동작이 실행되는 것을 I/O Mapped Memory 방식이라고 한다.(레지스터가 주소를 가지고 있다!)

 

이것은 C언어로 레지스터를 건드릴 수 있다는 것을 의미한다.

 

I/O Mapped I/O는 메모리 address가 없음으로 C로는 직접 프로그래밍 할 수 없고 Assembly어로만 조작이 가능하다.

 

내일(3/4)은 주소를 이용하여 CPU에 불을 켜 볼 것이다.

 

 








 

 

반응형
Posted by newind2000

스마트 컨트롤러 - Atmega 128A데이터 시트와 AVR Studio 세팅

 

#1. ATmega 128A 데이터 시트

 

학습목표 - ATmega 128A 데이터 시트에 나와 있는 특징의 주요 내용을 안다.

 

Intel - CISC/ ATmega - RISC

 

ATmega128A datesheet 살펴보기

 

<특징>

 

RISC(Reduced instruction set computer) 구조

 

//전통적인 CISC CPU에는 프로그래밍을 돕기 위한 많은 수의 명령어과 주소 모드가 존재했다. 그러나 그중에서 실제로 쓰이는 명령어는 몇 개 되지 않는다는 사실을 바탕으로, 적은 수의 명령어만으로 명령어 집합을 구성한 것이 RISC이다. 그래서, RISCCISC보다 구조가 더 단순하다. 복잡한 연산도 적은 수의 명령어들을 조합하는 방식으로 수행이 가능하다.

 

 

- 133가지의 명령어가 있다. RISC방식임으로 이것들을 조합하여 사용할 수 있다.

대부분이 단번에 실행된다.

 

//General Purpose Register - GPR, 범용레지스터(기억용 메모리)

//Peripheral control register - 주변 제어 레지스터

 

- 범용레지스터 32 X 8, 8bit GPR32개와 주변 제어 레지스터가 있다.

 

- 16MHz, 초당 16만개의 명령어 처리

 

//MIPS million instruction per second

 

- 내장 2클럭 곱셈기

 

높은 내구성 비휘발성 메모리 구역

 

//휘발성(non-volatile) - 전원 공급을 중지하여도 메모리가 사라지지 않는 성질

 

- 자체로 프로그램 삽입이 가능한 플래쉬 메모리

 

//하드 드라이브에는 저장된 내용을 읽는 header가 있는데 하드 드라이브를 읽을 때 이 헤더가 HDD가까이 이동하게 된다.

 

//FlashSSD가 응집되어 있는 것이다.

#2. ATmega 128A 데이터 시트

 

학습목표 - ATmega 128A 데이터 시트에 나와 있는 특징의 주요 내용을 안다.

 

//SSD 사용 시 전기 소모가 줄고 외부충격에 대한 안정성도 높아진다.

 

//EEP ROM - Electronically Erasable Program ROM

 

// Flash는 읽을 때 블록 단위로 처리한다. 하지만 HDD는 물리적인 운동으로 메모리를 읽는 반면 flash는 전기적인 신호로 메모리를 읽기 때문에 flash가 처리속도가 빠르다.

 

// EEPROM은 처리속도가 빠르나 가격이 비싸다. EEPROM은 프로그램을 집어 넣을 때만 사용할 수 있다.

 

- 4kbytes EEPROM

 

- 4kbytes 내부 SRAM

 

- 만 번까지 flash 메모리를 지울 수 있다.(읽는 것은 상관없다.)/EEPROM10만번.

 

- 자가적으로 firmware를 업데이트 할 수 있다.

 

- 64kbytes의 추가적인 외부 메모리를 달 수 있다.

 

- 프로그램 코드를 볼 수 없게 보안을 걸어 놓았다.

 

// Reverse Engineering 만들어 놓은 제품을 분해하여 분석한 후 제조하는 것

 

 

- SPI 인터페이스 -> CPU의 내용을 볼 수 있다.

 

주변 특징

 

- 8bit Timer/Counter2개 있다.

 

- 2개의 16bit Timer/Counter2개 있다.

 

// Timer/Counter에 대해서는 다음에 언급하기로 한다.

 

- Real time Counter가 있다.

 

- 2개의 8bit PWM(고성능)이 있다.

 

- 6개의 2 - 16bit PWM(저성능)가 있다.

 

- 출력 비교 장치가 있다.

 

- 8개 채널의 10bit ADC

 

- Byte를 기본으로 한 2개의 TWI

 

//TWI - Two-wire Interface

 

- 2개의 프로그램 가능한 USART

 

- SPI를 지원한다.

 

- 내부 oscillator와 프로그램을 할 수 있는 watchdog

 

// WatchdogCPU를 연결하여 watch도구에 리셋을 입력할 수 있는 기능을 넣어두고 문제가 발생 시 watchdogCPU를 리셋 시킨다.

 

 

 

#3. AVR Studio 설치 및 주소 상수를 활용한 초기화

 

학습목표 - AVR Studio를 설치하고 주소 상수를 활용하여 실수 값을 초기화 할 수 있다.

 

** AVR Studio 설치

 

실습 - 주소 상수를 활용한 초기화)

 

지난 시간 변수 값을 초기화와 관련한 수업(2/27)에서 썼던 소스를 연다.

 

float 변수를 만들어서 주소 상수를 활용하여 변수 값을 초기화 시켜보자!

 

//fP = 0012FF28

 

 

 

1. 주소 상수를 넣어 초기화 시키는 방법

 

2. #define에 주소 상수를 넣어 초기화 시키는 방법

 

3. 포인터를 활용하여 초기화 시키는 방법

#4. AVR Studio setting

 

학습목표 - AVR Studio setting 후에 ATmega에 연결하여 기본 설정을 할 수 있다.

 

 

 

 

USB port는 컴퓨터 본체에 전원 장치 또한 연결 시켜 준다.

 

 

이제 AVR Studio 4를 세팅해 준다.

 



//port를 연결한 후 뽑을 때 뽑히지 않는다고 흔들게 되면 보드가 빠지거나 망가질 수 있으니 바로 뽑아야 한다.

 

//핀 또한 적혀져 있는 핀에 일치하게 꼿지 않으면 보드가 나가게 된다.











반응형
Posted by newind2000

스마트 컨트롤러 - ATmega12A 소개, 주소상수를 활용한 초기화, #define

 

 

#1&2 ATmega128A 지급 및 부품 설명

 



PCB 8, 전원 공급기 및 전선을 받음.

 


오실레이터에 주파수를 의미하는 숫자는 표시된 만큼은 정확하다.

ex)16.000=>16.000Mhz

 

//SMD(Small Mounded Device)

 

//왠만하면 손으로 MCU를 만지는 것을 삼간다. 정전기로 인해 회로가 파괴될 수 있다.

 

 

ATmega126A Datasheet.







www.atmel.com에 접속한다.

 

ATmega126A 데이트 시트를 다운 받는다.

 

/*RISC(Reduced Instruction Set Computer) & CISC(Complex Instcution Set Computer)

 

RISC방법은 메뉴얼화된 명령어를 사용하여 구동시키는 것이고 CISC방법은 세부적인 명령어를 통해 구동시키는 것이다.*/

#3. Pointer - 주소상수 입력을 통한 초기화

 

학습목표

 

지난 시간(2/26)에 입력하였던 코드를 불러온다.

 

// 0012FF28

 

int Num=50;

int *ip = &Num;

 

Num <- iP

50() 2000(번지)

 

iPNum을 가리킨다!

 

*iP = 100;

*2000 = 100; -> 2000을 상수로 생각함으로 주소임을 표시해 주어야 한다.

 

이것을 바탕으로! 주소 상수로 변수를 초기화 시키는 작업을 하겠다.

 

변수를 초기화 하는 방법은 총 3가지가 된다.

 

1. 변수에 직접 초기화한다.

ex) iNum=100;

 

2. 포인터로 초기화한다.

ex) *iP = 200;

 

3.주소값으로 변수를 찾아간 초기화 한다.

 

7

! *12FF28 = 200; 는 오류를 일으킨다. 좌항을 상수로 인식하기 때문이다. 해당 *CPU가 이항연산자로(곱하기) 인식하기 때문에 포인터 연산자로 인식하게 만들어주어야 한다.

 

그러므로 compiler12FF28주소 상수로 만들어 주는 작업이 필요하다.

 

우선 괄호를 쳐서 상수로 취급되고 있는 주소를 묶어준다.

ex) (12FF28) = 200;

 

 

casting으로 선언된 변수와의 형을 맞춰 준다.

ex) ((int *)12FF28) = 200;

 

*넣어 주어 포인터 선언을 한다.

ex) *((int *)12FF28) = 200;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

#4. #define의 활용

 

#define은 자주 쓰는 입력들을 미리 선언해 놓고 간단한 명령어를 통해 출력하는 전처리 언어이다.

 

전처리 언어는 컴파일 시 적용되기 때문에 프로그램이 구동되는 것에는 영향을 미치지 않는다.

 

p/559 예제

 


 

#define을 통해서 변수가 원하는 값을 표현해 주고 있음을 볼 수 있다!

 

 

 

/* Visual Studio에서 compiler*.i 파일을 생성하는 옵션 설정

 

*/











반응형
Posted by newind2000