LCD 프로그래밍을 위한 기초 작업

 

학습목표

 

- Makefile을 수정하여 c 파일을 추가적으로 컴파일 할 수 있다.

- ATmega I/O 레지스터 on/off를 위한 컴파일을 할 수 있다.

- 명령어 static의 기능을 알 수 있다.

ATmega에서 c파일을 추가 하려고 할 때,

 

makefile에서 SRC를 검색해서 찾은 후 한 칸 띄우고 옆에 추가하고 싶은 c파일을 적어준다.

tab키를 사용하여 #define과 정의항을 띄워준다.

 

//extern "c"C++에서 사용하는 언어이다.

 

static 변수는..

 

1. 지역 변수를 전역 변수화

 

2. 변수의 보안옵션(전역 변수에 static 선언 시 -> 외부 파일에서 접근 불가) //링크를 걸어서 컴파일 할 때 전역변수의 이름이 겹칠 수 있다. 이 때 static선언을 하면 외부 파일에서는 해당하는 변수를 볼 수 없다.

 

3. 함수의 보안옵션

 

필요한 형태로 결과 값을 도출하기 위해서는 ##을 활용하면 인자 사이에 원하는 특정 값을 입력할 수 있다.

 

ex) Add(int A, B) A ## 더하기 ## B

-> A 더하기 B







반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 17. 17:46

J-K Flip Flop을 활용한 카운터 만들기

 

학습목표

 

J-K Flip Flop을 사용하여 프로테우스에서 카운터를 만들 수 있다.

Jset, Kreset

 

R S flip flop에서 모두 1인 경우 부정인 상태를 J K가 보수인 상태로 바꾸어 준다.




JK Flip Flop의 특징 중 하나는 둘 다 1일 때 toggle(신호에 입력에 따라 반전)이 된다. 이 기능을 활용하여 counter을 만들어 볼 것이다.

 

 

 

 

 

프로테우스를 사용하여 counter만들어 보기!

 


 

 

 

 

반응형
Posted by newind2000

스마트 컨트롤러 - 포인터의 이해&LCD Datasheet

 

학습목표

 

포인터 변수의 활용과 문법에 대해 안다.

포인터 변수 대입 시 형일치를 판별할 수 있다.

LCD데이터 시트에서 특징과 핀번호를 알 수 있다.

 

포인터란 주소 값을 저장하기 위해 선언되는 변수를 포인터 변수라고 한다.

 

포인터를 선언할 때 변수형은 포인터(*)로 인해 결정되지만 해당 포인터가 가리키는 형을 따라서 변수형(ex. char, int...)

 

주소를 가리키는 앰퍼센트(&)는 단항 연산자이다. 때문에 앰퍼센트 앞에 항이 와 버리면 비트연산자로써 논리연산을 수행하게 된다.

 

반드시 포인터가 같은 형태를 가리키라는 법칙은 없다(일반적으로는 맞춰 주어야 한다.)

포인터를 사용하여 메모리를 해석하는 방법을 달리할 수 있다.

 

int형의 자료를 넣어 놨을지라도 메모리에 저장되어 있는 값을 포인터를 활용하여 float으로 해석하면 실수 형으로 값을 해석하여 표현하게 된다.

 

포인터를 활용하여 입력된 값들을 해석해보자!

 

포인터의 형 선언 시 아스터리스크(*)를 변수형과 변수명 사이 어느 곳에든 위치 시켜도 되지만 일관성은 유지할 것을 추천한다.

 

포인터의 변수형이 다르더라도 컴파일러는 오류를 내지 않고 경고를 표시만 나타내주며 컴파일을 해준다. 두 가지 변수가 주소를 취급하는 경우에는 오류를 내지 않는다.

 

예를 들어 아래의 코딩은 오류를 내지 않는다.

 

int num1 = s;

double *pnum1 = &num1;

 

// C++은 포인터 형이 다를 경우 컴파일 시켜주지 않는다.

 

포인터의 기능 및 처리절차를 이해해야 포인터와 관련하여 컴파일 시 오류가 나더라도 처리할 수 있다.

 

p/280 - 포인터 연산)

포인터 형은 메모리 공간을 참조하는 기준이 된다.

 

예를 들어,

 

int num;

int * pNum;

pNum = #

 

에서 *에 선언된 int(4byte)는 해당 주소를 가진 변수로 가서 int만큼(4byte)의 데이터를 표시하라는 뜻이다.

 

포인터의 형이 존재하는 이유는 포인터 기반의 메모리 접근기준을 마련하기 위해서이다.

LCD 데이터 시트




- 화살표 표시된 것들은 BUS

- VDD = VCC, VSS = GND

- VR은 가변저항

- LEDA(LED VCC), LEDK(LED GND)

 

핀설명

 

1. GND

2. VCC

3. 0V

4. 5V - data register, 0V - instruction register (프로그래밍을 해야 하는 핀)

5. 5V - Read, 0V - write (프로그래밍을 해야 하는 핀)

//LCM - LCD Module

6. LCD module on/off (프로그래밍을 해야 하는 핀)

7 - 14. BUS

15 - 16. LED 전원

 

전원부(1,2) BUS 그리고 LED 전원에만 선을 연결해 보자!

 

아트메가 연결 핀 약속.

 

PC0 - PA7 -> BUS 7 - 14

PG0 -> RS(4)

PG1 -> R/W(5)

PG2 -> E(6)



반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 16. 13:35

디지털 제어 - 레지스터 회로의 기초(D&JK Flip-Flop을 활용한 기억회로)

 

학습목표

 

D Flip Flop 회로도를 이해하고 브레드보드에 만들 수 있다.

JK Flip Flop 회로도를 이해하고 브레드보드에 만들 수 있다.

 

7474를 활용하여 D Flip-Flop 회로를 만들어보자.


1(1RD)를 눌렀을 때 5(1Q)high가 인가 되었다.

4(1SD)를 눌렀을 때 6(1Q)high가 인가 되었다.

 

* 2번에 값을 입력하였을 때는 아무런 변화도 없었다.

플로팅(floating)문제라고 생각하고 스위치가 있는 자리에 풀다운을 해주었다. -> 효과 없음

다이오드에까지 풀다운 해 준 결과 원하는 결과 값이 나왔다!



 

* 모든 +/-에 전압을 인가했기 때문에 자기장이 발생하여 모든 입력 값에 전압이 들어간 것 아닐까?






//JK는 카드놀이 JackKing에서 왔다.

 

JS(set), KR(reset)에 대응된다.





프로테우스로 J-K Flip-Flop을 만들어보자!

 

*MC74HC73과 함께 J-K Flip-Flop





J(14)K(3)high를 인가하였을 때 QQ바는 보수관계를 보인다.(high일 때 low, low 일 때 high)
















 

 

반응형
Posted by newind2000

스마트 컨트롤러 - 1차원 배열의 입력과 출력


학습목표

 

C에서 배열이 어떻게 구동하는지 이해할 수 있다.

 

1차원 배열

 

p/257

 

배열에서 3개의 변수를 만들었지만 그 이상의 변수를 초기화하여도 에러가 발생하지 않는다. compiler는 문법적 오류를 검사하기 때문에 경우에 따라서는 문제가 발견되지 않을 수 있다.

 

//visual studio에서는 배열을 생성할 때 사용자가 배열의 범위를 침범하여 코딩하는 경우를 대비하여 배열 사이를 12byte로 띄워놓았다.

 

First In Last Out으로 자료를 넣고 빼는 것이 stack 메모리의 출력 형식이다.

 

QueueFirst In First Out 형식이다. ex) 키보드, 마우스 입력

//순서가 중요시 되는 작업에는 First In First Out형식을 쓴다.

 

Stack구조는 자주 사용하는 것을 다시 쓴다는 규칙을 바탕으로 자주 쓰는 것을 쉽게 꺼내 쓸수 있는 곳에 보관하는 것이다. ->가장 최근에 만든 함수/변수가 가장 먼저 사용될 가능성이 높다!

 

p/259 예제 - 배열의 길이 계산)

 

배열을 만들 때 변수의 개수를 세기 귀찮을 때 개수를 넣지 않아도 compiler에서 자동으로 개수만큼 변수를 생성해준다.

 

초기화시키지 않은 배열의 값에는 0이 들어간다.

 

p/262 예제 - 문자열)

 

 

 

%s 는 시작 문자의 주소점에서 시작해서 0이 나올 때 까지 출력한다.

 

코드를 짜다가 아스키코드의 번호가 필요한 경우가 있다. 이 때 %c‘ ’을 활용하여 아스키 코드를 알아볼 수 있다.

 

p/263 scanf 함수를 이용한 문자열의 입력

 

scanf를 사용하여 문자열을 입력할 때 띄워쓰기를 하게 되면 띄워쓰기 전까지만 출력된다.

 

/* visual studio에서 scanf를 제한하는가?

 

위에 선언된 str변수는 buffer이기 때문에 사용자가 입력하는 내용을 변수의 용량이 넘치더라도 그대로 입력해준다.

 

위의 str변수의 크기를 8로 지정하였는데도 scanf로 인해 그 이상이 입력되는 상황이 발생한다. 때문에 visual studio에서는 scanf를 사용하지 못하게 한다. => scanf는 경계체크를 하지 않는다.

 

 

%s를 사용하지 않고 문자열을 출력하게 코딩할 수 있다.



 

 

반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 13. 13:35

디지털 제어 - Flip Flop회로(latch 회로, RS, D Flip Flop)

 

NOR/NAND latch 회로 복습

 

학습목표

 

7402를 활용하여 NOR회로를 만들 수 있다.

7400을 활용하여 NAND회로를 만들 수 있다.

NAND회로를 활용하여 RS Flip Flop 회로를 만들 수 있다.

7474회로로 D Flip Flop 회로를 만들 수 있다.

 

지난 시간에 만들었던 NOR/NAND latch회로를 만들어보자!

 

 





 

latchS-R 플립플롭의 가장 큰 차이는 클럭 공급의 차이이다.

클럭 공급으로 인해 데이터의 입출력이 연속이 아니라 클럭 공급의 형태로 바뀐다.

값이 1(S) 1(R)일 때 부정 값을 보완해주기 위해 나온 것이 D플립플롭이다.

 

/* 카르노 맵 그리는 법!

 

비트 2개가 한꺼번에 바뀌는 것을 방지하기 위해 SR값은 00 01 11 10으로 나열해 준다.

Q에는 2비트 값(0,1)을 기입해준다.

 

실습 - 클록형 S-R 플립플롭(NAND) 만들기






클럭의 high부분에서만 데이터가 처리되는 것을 레벨(level)트리거 라고 한다. 이 때 high부분에서 전압이 일정하지 않고 잡음이 발생하여 오동작이 발생할 수 있다. 때문에 high에서 low low에서 high로 바뀌는 부분에서 동작할 수 있도록 만든 것이 에지(edge) 트리거라고 한다.

//프로테우스에서 시뮬레이션 해보면 지연이 표시되지 않기 때문에 펄스 전이 검출기 회로에서의 지연 값을 볼 수 없다.



//파란색 구간은 부정을 표시한다.







 

//Q(t+1) 입력의 Q와 출력의 Q를 표시해주기 위한 표시.






 

반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 12. 17:33

디지털 제어 - AVR makefile 소스의 이해와 1차원 배열

 

AVR makefile 소스의 이해와 1차원 배열

 

학습목표

 

WinAVR에서 makefile 구동 개념을 안다.

makefile의 기본 문법을 안다.

1차원 배열의 기본개념의 대해 이해한다.

 

WinAVR Makefile

 

87 CPPSRC = , C++ 소스

 

97 ASRC = , 어셈블리 소스

 

103 OPT = s,optimization 최적화.(0 = 속도 최적화, s = 메모리 최적화)

 

110 DEBUG = dwarf-2, 출력하는 디버그 파일 형식 설정

 

//COFF - Common File Form

 

//윈도우 실행 파일은 PE format

 

117 EXTRAINCDIRS =, Extra Included Directories

 

125 CSTANDARD = -std=gnu99, C 표준 설정

 

129 CDEFS = -DF_CPU=$(F_CPU)UL, C++ defined

 

 

cl /DSMART=100 CDEF.c

 

// 컴파일 옵션에서 사용하는, /(C) = -(

 

129 CDEFS = -DF_CPU=$(F_CPU)UL -> #define F-CPU 16000000UL //UL unsigned long

 

-D를 추가할 시 한 칸 띄우고 같은 다시 적어주면 된다.

 

makefile에 소스코드에 없는 내용이 적혀서 구동할 수 있기 때문에 소스를 분석할 때 makefile을 같이 보아야 한다.

 

133 ADEFS = -DF_CPU=$(F_CPU)

 

137 CPPDEFS = -DF_CPU=$(F_CPU)UL

 

//아래에 CFLAG는 누적된다.

 

150 CFLAGS = -g$(DEBUG), DEBUG에 위에 선언한 dwarf가 들어간다.

 

151 CFLAGS += $(CDEFS), //상위에서 나온 내용이 아닌 경우 오류가 난다.

 

152 CFLAGS += -O$(OPT),

 

153 CFLAGS += -funsigned-char,

 

157 CFLAGS += -Wall, Warning All 경고를 전부 출력해라. -> 소스에 사소한 것이라도 알려 달라.

 

// ‘-’ 다음에 나오는 것들은 옵션이다.

 

164 CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)

 

CFLAGS는 가독성을 위해서 짧게 나누어서 나열한다.

 

233 MATH_LIB = -lm, math 라이브러리를 추가시킬 때 쓰는 옵션 //여기서 나오는 수학은 단순 사칙연산이 아니라 고등수학을 말한다. ex) sin, cos

 

262 LDFLAGS = -Wl,-Map=$(TARGET).map,--cref, LD(objexe로 만들어주는 기능)에 사용되는 flag(옵션)

 

340 CC = avr-gcc, C compiler(C:\WinAVR-20100110\bin)

 

355 MSG_ERRORS_NONE = Errors: none

 

389 ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS), /m MCU = atmega128

 

모든 flag값들을 ALL_CFLAGS가 다 가지고 있다는 의미

 

‘:’ label 표시이다.

 

// 탭으로 들여 쓰고 반드시 붙어 있어야 한다.

 

//대입 연산자랑 비슷한 순서로 수행된다.

 

 

 

 

 

이리하여 ‘make’를 쳤을 때 makefile이 어떻게 동작하는지 기본배경을 알 수 있다.

 

p/254 Ch. 11. 1차원 배열

 

같은 형의 자료를 한 개 이상 열거해 놓은 것을 배열이라고 한다.

 

모든 프로그래밍은 배열을 가지고 있고 그 개념은 거의 다 비슷하다.

 

C가 가지는 특징은 주소를 사용한다는 것이다. 또한 배열과 포인터는 밀접한 관련이 있다.

 

대괄호([])1개만 있으면 1차원 2개 있으면 2차원... so and so forth.

 

구형 c compiler에서는 배열 속 대괄호 안에 숫자를 변수로 만들어 쓸 수 없다.

//C++과 신형 c compiler에서는 허용한다.

 

p/256 예제 - 배열의 합)


 

반응형
Posted by newind2000
Busan IT/디지털 제어2015. 3. 12. 13:24

디지털제어 - 기억회로(NOR/NAND latch회로)

 

학습목표

 

- NOR 래치회로와 NAND 래치회로의 동작을 이해한다.

- S-R 플립플롭, D 플립플롭, J-K플립플롭, T플립플롭의 동작을 이해한다.

- 클록형 플립플롭, 에지 트리거 플립플롭, 주종형 플립플롭의 차이점을 이해한다.

- 비동기 입력의 동작을 이해한다.

 

 

플립플롭 하나는 한 개의 bit를 기억한다.

 

실습 - 기억회로 만들기)

 

NOR 게이트를 이용한 기억회로 //입력 값을 설정 한 후 회로에 전원을 인가한다.



정확한 이름은 NOR latch회로이다.

 

NOR gate 대신 NAND회로를 넣고 그려보자!

 

74HC02를 활용하여 NOR latch회로를 만들어보자!



74HC02를 사용하여 만들어 보았다.

NAND latch회로도 74LS00을 만들어 보았다.


반응형
Posted by newind2000

메모리(RAM)의 구조/지역변수&전역변수/AVR makefile

 

학습목표

 

메모리의 구조의 대하여 이해하고 변수생성 시 어느 영역에 저장되는지 안다.

폰 노이만 구조와 하버드 구조의 차이점을 이해한다.

지역변수와 전역변수의 차이와 활용에 대해서 안다.

재귀함수에 대해 안다.

Makefile에 있는 문법에 대해 안다.

 

//Intel이나 ATmega에서 메모리 영역의 사용은 동일하다.

 

명령어들은 메모리의 Code영역에 저장된다.

폰 노이만 방식은 Code영역과 저장용 메모리 영역의 버스를 달리함으로써 속도를 향상 시킨다.

 

전역 변수를 쓰면 함수의 인자가 필요하지 않게 된다.

 

전역변수는 프로그램을 복잡하게 만드는 주범임으로 가능한 한 사용을 최소화해야 한다.

또한 전역변수는 해당 프로그램이 시작될 때부터 종료할 때까지 메모리를 차지하게 된다. 때문에 RAM의 메모리를 지속적으로 사용하게 된다.

 

지역변수를 사용하면 변수의 생성과 소멸에 의해 CPU에 부하가 발생할 수 있지만 이것은 메모리 사용보다는 낮은 우선순위이다.

 

Static 지역변수


 

Static변수는 한 번만 초기화되는 전역변수이다.

 

p/234 예제 static 변수)

 

 

Static 변수도 전역변수의 일종임으로 가능한 한 지역변수를 사용하자!

 

사용해야 하는 우선 순위(왼쪽이 순위 높음)

 

지역변수 - static 지역변수 - 전역변수

 

레지스터 변수

 

레지스터 변수 선언하면 CPU내 레지스터에 저장될 확률이 높아진다. 때문에 빠른 변수의 처리를 원할 경우 register 변수를 선언하면 처리가 빨라질 수도 있다.

 

// register명령어와 비슷한 명령어는 volatile이다. 둘 다 compiler 실행에 간섭한다.

 

전역변수는 register 변수로 선언할 수 없다.

 

p/238 재귀함수

 

재귀함수는 만들지 말아라! 메모리를 많이 사용하기 때문이다.

 

무한 재귀함수의 문제점은 변수를 무한대로 생성하여 메모리를 지속적으로 차지하게 된다. Window운영체제에서는 이러한 프로그램을 강제종료 시키지만 이러한 재귀함수를 제한하지 않은 환경에서는 오작동이 발생할 수 있다.

 

// 지역 변수를 다른 용어로 buffer라고도 부른다.

 

// 할당된 메모리를 넘어가서 다른 영역까지 메모리를 침범하는 경우를 oveflow라고 부른다.

 

// 해킹의 용도로 고의적으로 stack을 넘치게 하여 컴퓨터에 오류를 일으키게 할 수 있다.

 

makefile에 대한 설명

 

line44 MCU = atmega128 //변수타입 없이 선언 되었다. MCU의 값 atmega128

line65 F_CPU = 16000000 //전에 800000이던 것을 수정하였다.

 

line83 SRC = $(TARGET).c //변수를 사용할 때는 $(TARGET)을 사용해해야 한다.

 

#을 넣으면 주석처리 된다.

$(*)을 넣으면 변수처리 된다.











 

반응형
Posted by newind2000
메모2015. 3. 11. 16:11



반응형

'메모' 카테고리의 다른 글

간단 메모  (0) 2015.08.21
100권의 금서  (0) 2015.07.29
세금 환급  (0) 2015.07.26
기록 방법  (0) 2015.01.28
Posted by newind2000