Contrrl And Display Instruction

데이터 시트 설명

상위비트부터 체크한다.

DB0가 1이면 LCD화면을 클리어 한다.


캐릭터LCD의 커서를 맨 앞으로 당긴다.


엔트리 모드로 세팅한다. LCD커서마다 주소값을 가지는데 00~1F까지 있는데 

증가 및 감소 시켜 커서 이동을 한다.


디스플레이 ON/OFF 제어 명령이다. 


커서나 화면자체를 이동시킨다.


a를 찍어내는 함수작성.


a를 찍어주는 Data_a함수를 선언 및 정의 해준다.

DDRA는 RS, RW, E를 정의 해준다.

DDRC는 DataBus 입력 또는 출력으로 쓰임.


메인함수에 선언해준다.


main.c

Makefile

smart.h



AVR Studio를 이용하여 LCD를 실행한 모습.


 실습으로 사용하는 LCD는 HY-1602W-204_LCD이다.

 타이밍 다이어그램 대로 소스 구현해보기

 

main.csmart.h

DDRA  = (1<<PIN_RS) |(1<<PIN_RW) | (1<<PIN_E);

→PIN의 RS와 R/W와 E의 각각 DDRA의 PIN자리에 High값을 주기위해서는

  다음과같이 작성하면된다.

DDRA = 0x07;

그러나 이런식으로 하면 어떤 핀을 의미하는건지 이해하기 어렵고 헷갈린다. 그래서

위의 소스와 같이 PIN에 매크로를 정의 해주어서 보기 쉽게 구현하는것이 낫다.

 

임의의 값과 변경된 값을 비교해 보면 바꿀 위치의 값이 변했다는 것을 알수 있다.

 

 

 

연결리스트 기존 소스

 

LinkedList.cLinkedList.hmain.c

뒷 추가 삽입

 

 

 

 

앞 추가 삽입

 

 

메인 및 실행

 

Linked List(z, 1추가하기)

 

 

 

 





ch25.메모리 관리와 메모리의 동적 할당

malloc 함수의 반환형이 void형 포인터인 이유와 힙 영역으로의 접근

원하는 공간 크기만큼 메모리 공간을 할당하고 그 메모리의 주소 값을 반환하겠으니 포인터 형의 변환을 통해서 직접 결정.

free 함수를 호출하지 않으면 프로그램 종료 후에도 메모리가 남게 되는가?

그러한 일은 결코 일어나지 않는다. 프로그램이 종료 되면 운영체제에 의해서 전부 해제가 되기 때문.

하지만 종료 직전에 꼭 free함수를 이용해 해제 해줄 것!!

 

main1.c


문자열을 반환하는 함수를 정의하는 문제의 해결

함수가 호출될 때마다 문자열 저장을 위한 메모리 공간의 할당이 가능해야 하고, 이 메모리 공간은 함수를 빠져나가도 소멸되지 않고 존재해야 한다.

 

main2.c


malloc 함수의 사촌 뻘 되는 calloc 함수

void * calloc(size_t elt_count, size_t elt_size); ->성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환


calloc함수는 두 개의 숫자를 인자로바이트를 힙 영역에  전달받는다. 총 120바이트를 힙 영역에 할당해달라. 첫 번째 전달인자로는 할당할 블록의 갯수 정보가 전달되고, 두 번째 전다린자로는 블록 하나당 바이트 크기의 정보가 전달된다. 4바이트 크기의 블록(elt_size) 30개를(elt_count) 힙 영역에 할당해달라. malloc함수는 메모리 공간을 별도의 값으로 초기화 하지 않아서 쓰레기 값이 남게 된다. calloc은 메모리 공간을 0으로 초기화시킨다.

 

힙에 할당된 메모리 공간 확장 시 호출하는 realloc함수 

한번 할당된 공간은 크기를 확장 할 수 없다. 하지만 realloc함수를 사용한다면 가능하다.

void *realloc(void *ptr, size_t size); -> 성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환

ptr이 가리키는 메모리의 크기를 size 크기로 조절해달라.

int  * arr = (int *)malloc(sizeof(int)*3);

->길이가 3인 int 형 배열 할당.

arr = (int *)realloc(arr, sizeof(int)*5);

->길이가 5인 int형 배열로 확장.

20140417 - LCD의 이해

ATMega128 2014. 4. 17. 14:06 Posted by Owen.K

LCD에 대해..


캐릭터 LCD와 그래픽 LCD

1-1 캐릭터 LCD

 문자를 위주로 표시하기 위한 LCD로서 LCD내부의 메모리에 문자에 관련된 DOT에 대한 정보가 내장되어 있는 제품입니다. 즉 문자 'a'를 출력하면 아스키값으로 그대로 문자를 불러들여 표시해 줍니다. 물론 폰트를 만들어 사용하는것도 가능하나, 문자사이의 1라인의 공백으로 인해 그래프를 그린다던지 이미지를 표시하기엔 무리가 있는 제품입니다. 가격이 저렴하고, 사용이 간편합니다.


1-2 그래픽 LCD

 문자 및 그래픽을 위한 LCD로서 컬러 및 모노가 있습니다. 캐릭터 표시를 위한 방법은 대부분 기본적으로 내부롬에 저장되어 있습니다. 따라서 캐릭터LCD의 기능은 기본적으로 가능합니다. 표시할때 각 좌표의 x,y 포인트에 맞추어 1이나 0을 줌으로써 표시하거나 표시하지 않을수 있습니다. 또한 한꺼번에 여러포인트를 기록하는 경우도 있습니다. 즉 8비트씩 그려나가는 방법을 사용하는 경우도있습니다. 제품별 차이가 천차만별인데.. 우선 모노 그래픽 LCD의 경우 단색표시만 가능합니다. 메이커별로 사용방법 및 특성이 차이가 있어, 사용이 까다로운 편입니다. 초기화 과정부터 사용과정까지 캐릭터 LCD보다는 사용이 어렵습니다. 가격이 높은 편이고, 기종에 따라 단종이 쉽게 되는 경우가 있어, 사용시 되도록 단종 예정이 없는 제품을 잘 골라서 사용해야 합니다. 컬러는 더욱 사용이 어려우며, 많은 정보를 처리해야하므로, 높은 사양의 컨트롤러 및 프로세서가 필요합니다.




PIN에 따른 LCD, Adapter, ATMega Board 연결

타이밍 도




LinkedList 함수화시키기


void Node_Printf(Node *)보다 typedef 구조가 먼저 선언 되었기 때문에

typedef~Node를 먼저 정의 해준다.


main2.c


링크드 리스트의 분할 컴파일


분할 컴파일은 왜 하는가?

소스의 양이 많을 때 기능마다 따로 쓰이게 하기 위해서 분할 컴파일을 한다. 

main에서 짬뽕으로 섞인다. 대부분의 시간을 ~.c에서 ~.obj로 변환할 때 잡아먹기 때문에 

~.obj끼리 링크를 걸면 시간이 줄어들어서 분할 컴파일을 한다.

.lib는 .obj들이 모여있고 필요한 기능을 따로 뽑아낸다.


방법1

1. main.c -> main.obj = cmd에서 cl /c main.c

2. LinkedList.c -> LinkedList.obj = cmd에서 cl /c LinkedList.c

3. cl main.obj LinkedList.obj

방법2

1. main.c -> main.obj 

   LinkedList.c -> LinkedList.obj = cmd에서 cl *.c =>LinkedList.obj, main.obj...LinkedList.exe

방법3(가장 좋은 방법이다.)

1. main.c -> main.obj

   LinkedList.c -> LinkedList.obj = cmd에서 cl main.c LinkedList.c

=>main.obj, LinkedList.obj......main.exe 



LinkedList.c


LinkedList.h


main.c


전처리기와 사용자 정의 자료형 함수선언 등을 잘라낸다. 

오전에 배웠던 헤더파일 중복을 방지하는 코드를 이용하여 LinkedList.h 헤더파일의 #ifndef와 #endif 사이에 붙여넣는다

main.c에서 전처리기를 포함시킨다.(#include "LinkedList.h")

밑에 함수들을 잘라낸다.

LinkedList.c 파일을 새로 만들어 LinkedList.h 전처리를 포함시킨 후 잘라낸 함수들을 붙여넣는다.

main.c가 한결 간결해진 모습을 볼 수 있다.

분할 컴파일은 여러 가지 방법이 있지만 아래의 방법이 가장 빠른 방법이란다.


매개변수의 결합과 문자열화

문자열 내에서는 매크로의 매개변수 치환이 발생하지 않는다.

 

macrostring.c

문자열 내에서 매크로의 매개변수 치환이 발생하게 만들기 : #연산자

 

macrostring1.c

특별한 매크로 연산자 없이 단순히 연결하는 것은 불가능하다.

 

univnum1.c

필요한 형태대로 단순하게 결합 : 매크로 ## 연산

 

univnum.c

 


 

헤더파일로 분할 컴파일을 해봅시다.

헤더파일을 만들어봅시다.

source insight를 실행 후에 Project->New Project(만일 프로젝트가 열려있으면 Close Project하고  옆에 있는 대로 수행한다.)

그러고 나서 프로젝트 만들 폴더를 생성하고

만든 폴더안에 들어가서 주소를 복사한다.

다시 소스 인사이트에 와서 프로젝트 이름을 쓰고, 밑에 주소를 붙여넣는다. OK를 누르면

New Project Settings가 뜨는데 여기서 Browse클릭하고, 선택되어 있는 폴더의 상위폴더를 선택 후에

확인을 누른다.

그 다음에 OK를 누르면,

프로젝트에 추가 시킬 파일들이 나열되는데 해당되는 파일들을 선택한다.












헤더파일 사용 중복 방지를 위해서

아래 사진은 studio.h의 소스이다. 헤더파일 중복을 방지하기 위한 소스인데

같은 한쌍이다.

위 사진처럼 소스인사이트에서 studio.h와 같이 smart.h도 같이 써주었다.



조건부 컴파일을 위한 매크로


#if...#endif : 참이라면

if문이 조건부 실행을 위한 것이라면, #if...#endif는 조건부 코드 삽입을 위한 지시자이다.


ifendif.c


#ifdef...#endif : 정의되었다면

#if...#endif와 유사하다. #if는 매크로가 참이냐 거짓이냐를 기준으로 동작한다면, 

#ifdef는 매크로가 정의 되었느냐, 정의되지 않았느냐를 기준으로 동작.


ifdef.c


#else의 삽입 : #if, #ifdef, #ifndef에 해당


else.c


#elif의 삽입 : #if에만 해당

if문에 else if를 여러 번 추가할 수 있듯이, #if문에도 #elif를 여러 번 추가할 수 있다.


elif.c


ATMega LED 와리가리


main.c





20140415 - Linked List

c언어 2014. 4. 15. 16:27 Posted by Owen.K

연결리스트

연결관계


main.c



연결관계


main1.c



연결관계


main2.c


EEPROM Description 내용



*(volatile unsigned char *)0x3A = 0x01;        //PA0를 출력

0x3A를 휘발성 1byte로 캐스팅해서 따라가라

*(volatile unsigned char *)0x3B = 0x01;        //PA0를 High로 출력.

0x3B를 휘발성 1byte로 캐스팅해서 따라가라

unsigned uiCnt;

for(uiCnt=0; 65000>uiCnt; ++uiCnt);              //65000을 한번에 넣어버린다.


volatile unsigned uiCnt;

for(uiCnt=0; 65000>uiCnt; ++uiCnt);             A, ON //최적화하지말고 하나하나 다 세라.

*(volatile unsigned char *)0x3B = 0x01; 

for(uiCnt=0; 65000>uiCnt; ++uiCnt);             B, OFF //최적화하지말고 하나하나 다 세라.

*(volatile unsigned char *)0x3B = 0x00

순서



선행처리기

선행처리는 컴파일 이전의 처리를 의미.



#define PI 3.14 - PI를 만나면 무조건 3.14로 치환해라!





대표적인 선행처리 명령문

#define을 지시자라고 한다.

main3.c


#define : Function-like macro

매개변수가 존재하는 형태로도 정의할 수 있다. 이를 함수와 유사한 매크로라하는데 이를

매크로 함수라고한다.


매크로 정의 시, 먼저 정의된 매크로도 사용 가능.

장점 : 일반 함수에 비해 실행속도가 빠르다. 자료형에 따라서 별도로 함수를 정의하지                않아도 된다.                                                                                                                       (호출된 함수를 위한 스택 메모리의 할당, 실행위치의 이동과 매개변수로의 인자 전달, 반환무에  의한 값의 반환)


단점 : 정의하기 까다롭고, 디버깅이 쉽지 않다.


고로, 작은 크기의 함수나 호출빈도가 높은 함수들을 매크로로 정의하면 이점을 최대한 누릴 수 있다.


main4.c


main5.c


main6.c

main.c

선행처리한 소스들만 추려서 수정하는 법

1. 우선 만들어 놓은 디렉토리에서 Makefile을 notepad로 연다.

2. Ctrl+F를 눌러서 CFLAGS를 찾아 그 뒤에 --save-temps를 적고 저장하고 닫는다.

3. 해당 파일들이 포함되어 있는 cmd창에서 make clean->make를 하면 

해당 파일의 ~.i파일이 생성된다. 

찾아서 실행한다.

4. 열어보면 선행처리 해놓은 소스 원본들만 모여있다.

5. 여기서 수정 및 관리를 해준다.



20140414 - 회로도 읽는 법, 레지스터,

ATMega128 2014. 4. 14. 23:10 Posted by Owen.K

 회로도 읽는 법

 

 

 

레지스터

 

 

 

메모리

 

 

 폰노이만 - 단순                                                            하버드 구조 - 복잡