Busan IT/디지털 제어2015. 3. 11. 13:27

디지털 제어 - 엔코더/디코더/멀티&디멀티플렉서

 

학습목표 - 엔코더, 디코더, 멀티&디멀티플렉서의 논리를 이해하고 회로도를 그릴 수 있다.




 

오늘은 본격적으로 인코더에 대해서 알아보겠다.








 

2진수를 그레이코드 바꾸는 법

 

- 맨앞자리는 그대로 내려오고

- 그 위에부터는 두 개씩 XOR을 하여 내려오면 된다.

 

ex) 1011(2) -> 1110(Grey)

 

//카르노맵이란?

 

 

그레이코드를 2진수로 바꾸는 법

 

- 맨 앞지리는 그대로 내려오고

- 그 뒤부터 앞에 나온 값과 다음 자리를 XOR 값을 도출하면 된다.

 

ex) 1110(Grey) -> 1011(2)

 

 

패리티 비트(Parity bit)는 정보의 전달 과정에서 오류가 생겼는지를 검사하기 위해 추가된 비트이다. 전송하고자 하는 데이터의 각 문자에 1 비트를 더하여 전송하는 방법으로 2가지 종류의 패리티 비트(홀수, 짝수)가 있다. 패리티 비트는 오류 검출 부호에서 가장 간단한 형태로 쓰인다.

 

짝수(even) 패리티 - 전체 비트에서 1의 개수가 짝수가 되도록 패리티 비트를 정하는 것인데, 이를테면 데이터 비트에서 1의 개수가 홀수이면 패리티 비트를 1로 정한다.

 

홀수(odd) 패리티 - 전체 비트에서 1의 개수가 홀수가 되도록 패리티 비트를 정하는 방법이다.

 

7bit의 자료 데이터를 전송할 때 짝수 패리티는 자료 데이터 속 1의 개수가 짝수가 되도록 제일 앞자리에 0또는 1일 넣어서 8비트 1의 개수가 짝수가 되는 값으로 도출해준다.

홀수 패리티는 1의 개수가 홀수가 되도록 가장 앞자리에 0또는 1을 넣어주는 것이다.

 

패리티는 데이터를 한 공간에서 다른 공간으로 이동시킬 때 데이터가 제대로 전송되었는지 정검해주는 기술을 말한다.



포트는 총 10개이고 시작/종료 포트 각 각 1개씩, 데이트 비트 8개 총 10bit이다.

엔코더를 그려 보자



엔코더는 디코더의 반대이다. 2n승개의 코드 입력을 받아서 n개의 데이터를 내보내는 것이다.

디코더도 그려보자.

 

 

 

디코더 & 디멀티 플렉서

 

디코더는 코드를 분할하는 것이다. n비트의 코드 입력을 받아서 2n승개의 데이터를 내보내는 것이다.

 

ex) 2진법 -> 전광판 숫자로

 

엔코더

 

//수업의 목표는 1. 진리표를 만들어서 2. 진리표를 보고 회로도를 만드는 것이다.

멀티플렉서도 만들어 보자!



멀티 플렉서는 다양한 입력 값 중에 하나를 선택하여 출력하는 것이다.

 

 

아래의 회로를 만들어 보자!

 

1. 4 X 2(엔코더) X 4(디코더)

 

2. 1 X 4(디멀티플렉서) X 1(멀티플렉서)

 

 

1. 엔코더의/디코더/디멀티플렉서/멀티플렉서의 논리와 회로 구조를 이해한다.

 

2. 위의 주어진 엔코더와 디코더를 붙혀서 입력 값과 출력 값이 맞는지 확인한다.

 

 

코드란 어떤 정보를 특정 규칙의 다른 언어로 변환한 것인데, 프로그래밍에서는 정보를 디지털신호(2진수)로 변환하는 것이다.

 

Decoder2진 정보를 다른 형식의 단일 신호로 바꾸어 주는 회로이다.

n개의 정보를 입력 받아 2n승의 정보를 출력한다.

 

 

반응형
Posted by newind2000

Return의 기능/전역 변수 & 지역 변수/메모리의 영역 구분

 

#1. return의 기능(함수의 종료)

 

학습목표 - 함수의 문법과 사용을 이해하고 return의 기능을 이해한다.

 

어제 배운 것 복습

 

p/214 함수의 유형

 

- 인자와 반환 값의 유무에 따른 4가지 유형

 

- 지역변수란 함수 안에서만 실행되고 해당 함수가 끝나면 같이 사라지는 변수를 말한다.

 

- 함수의 개수를 알아내려면 메인 함수의 둥근 괄호의 개수를 살펴보면 된다.

 

 

p/215 return이 자니는 두 가지 의미 중 한 가지 의미만 살리기

 

1. 함수를 종료한다.

 

2. 값을 반환한다.

 

 

/*나누기에서

 

나누어지는 수 - 피제수

 

나누는 수 - 제수 */

 

 

앞으로 비교연산자 ‘==’를 쓸 때 변수를 오른쪽에 쓴다.

실수를 ‘==’ 대신에 ‘=’를 입력했을 경우 에러가 나게 됨으로 실수를 잡을 수 있다.

 

실습 - return의 함수 종료 기능)

p/216 함수의 정의와 그에 따른 원형의 선언

 

함수는 호출되기 전에 미리 정의되어야 한다. 이 때 지난 시간에 배운 함수의 선언함수의 정의가 나온다.

 

!!! #2. 둘째 시간은 쉬었어요 \(-0-)/

#3. 지역변수와 전역변수

 

학습목표 - 지역변수와 전역변수를 구분하여 사용할 수 있다.

 

 

지역변수는 해당지역을 벗어나면 자동으로 소멸된다.

 

지역변수는 선언된 지역 내에서만 유효하기 때문에 선언된 지역이 다르면 이름이 같아도 문제가 되지 않는다.

 

지역변수의 주기는 여는 괄호로 시작해서 1. 닫는 괄호를 만나거나 2. return을 만나면 끝이난다.

 

같은 이름의 변수가 있으면 가장 가까이 있는 변수에게 명령어의 효력이 발생한다.

 

p/228 지역변수

 

위와 같이 동일한 num변수가 “if문 내에서는 main함수의 num이 가리워진다라고 한다.

 

전역변수(Global Variable)

 

main함수가 전에 선언되는 변수를 전역변수라고 한다.

 

p/230 - 전역변수)

 

전역변수는 기본 0으로 초기화된다!!!!!

전역변수를 초기화하면 해당되는 변수의 크기에 해당되는 메모리는 전부 0으로 채워진다.

 

 

 

 

 

 

#4. 메모리의 영역 구분

 

학습목표 - 메모리의 영역 구분이 어떻게 이루어지는지 이해한다.

 

// 함수는 이름자체가 주소이다.

 

메모리

 

함수들이 있는 영역은 Code영역이다.

 

// Visual Studio에서는 기존 영역과

 

지역변수Stack영역에 있다.

 

전역변수는 BSS영역에 있다.

 

전역변수BSS영역이 있고 Data영역이라고 한다.

 

초기 값을 넣은 변수들은 Data영역에 포함되고 초기 값이 없는 변수들은 BSS영역에 들어간다.

 

 













 

 

 

 

 

 

 

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

디지털 제어 - 가산기 & 디코더의 논리회로

 

 

지난 시간에 했던 반가산기와 전가산기를 복습해보자.

 

전가산기는 반가산기 2개와 OR Gate 1개를 추가하여 만들 수 있다.

 

반 감산기의 회로는 ‘-‘자리수로 나누어 표현할 수 있다.

 

4비트 가산기를 만들어보자!







디코더는 코드 형식의 2진 정보를 다른 형식의 단일 신호로 만들어주는 회로이다.

Enable은 전체를 1로 만들어주는 역할을 수행한다.













 

 

점까지 총 8비트로 제어할 수 있다.

 

7세그먼트의 종류 2가지. VCC(A, +)common으로 GND(K, -)common으로 한 것으로 나눈다.

 

//디코더와 디멀티플렉서는 같다고 생각하면 된다.

 

게이트의 숫자를 2배로 늘릴 때 게이트를 복사하여 하나는 enable을 그대로 다른 하나는 enablenot gate를 붙혀 사용하면 된다.

 

 

내일은 인코더를 만들어 보고 인코더가 끝나면 flip-flop을 해본다.

 

 


 

반응형
Posted by newind2000

함수(정의부와 선언부, 함수의 유형)/분할 컴파일/Source Insight

 

#1. 함수의 분할(정의부와 선언부)

 

학습목표 - 함수를 정의부와 선언부로 나누어 코딩할 수 있다.

 

지난 시간에 레지스터/전처리 언어/함수/매크로에 관한 수업을 했다.

 

오늘은 함수에 대해 더 배우고 분할 컴파일에 대해서도 배워본다.

 

//잘게 분산된 일을 합치는 작업을 linker에서 수행한다.

 

실습 - 함수의 분리 저장)

 

Led of/off 함수를 분리하여 저장한 후 실행시켜본다.

 

 

 

실습 - 함수의 정의와 선언)

 

smart는 정의부/main은 선언부

#2. 분할 컴파일과 Source Insight 기본 조작

 

학습목표

 

다수의 분할된 코드를 컴파일하여 실행할 수 있다.

Source Insight의 기본 조작법을 숙지 한다.

 

작업을 조각낸 후 이를 합치는 과정을 link라고 한다. 팀 프로젝트에서 조각난 작업을 합치기 전 단계의 작업 결과물은 obj 파일들이 된다.

 

형성된 obj파일들이 제대로 되었는지 확인해 봐야 한다. 이를 테스트하는 것을 컴파일(compile)만 수행한다고 한다. 이 때 명령어는 “cl /c *.c"이다. //*는 파일명

 

이와 같이 작성된 코드를 따로 따로 컴파일하는 것을 분할 컴파일이라고 한다.

 

소스가 많아질 경우 수 많은 코드를 제어하는 것이 힘들어진다. 이때 우리는 도구를 사용한다! -> Source Insight

 

Source Insight 실행 후!

Project -> New Project Settings

소스가 있는 폴더를 지정




원하는 소스파일을 더블클릭하여 창에 올려준다.

줄번호를 표시해 주거나 글자 크기 등을 조절해주기 위해 option -> document option

 

옵션 설정 후 적용하기 위해서는 위의 창에서 'yes'를 입력해 주어야 한다.







Ctrl + Shift + f(찾기 단축기) //범위 지정된 단어가 바로 찾아진다.

 

Case Sensitive - 대소문자 구분

 

Project Wide - 모든 프로젝트에서 단어 찾기

 


위에 버튼을 통해 찾은 단어를 자유롭게 이동가능.

 

메모장에 사용자가 코딩 시 필요로 하는 기능 등을 추가해준 것이 Source Insight이다. 프로그램 작성 및 수정에는 도움이 되지만 자체 컴파일 기능은 없다.

#3. 분할 컴파일

 

학습목표 - 분할 컴파일을 활용하여 팀별 코딩을 할 수 있다.

 

팀으로 코딩해보자!

 

 

#4. 함수(함수의 유형)

 

학습목표 - 인자와 반환 값의 유무에 따른 함수의 형태를 구분하고 활용할 수 있다.

 

AVR로 가서!

Source Insight에서 창 내에 있는 변수들은 색깔로 표시된다.

 

수정하게 되면 노란색으로 변한다.

 

저장되면 채도가 낮은 연두색으로 바뀐다.

 

//수업 중에 언급하지 않으면 코딩은 메모장에서 한다!

 

분할 컴파일은 잘 정리해 놓자!

 

p/212 예제

 

함수 값에 인자/인수를 넣을 때 만들어준 함수의 형식에 맞게 넣어주어야 한다.

 

함수 속에서만 생성되었다가 함수가 끝나면 사라지는 변수를 지역변수라고 한다.

 

함수의 가장 복잡한 형태가 반환 값도 있고 인자도 있는 4번 형태이다.

 

인수가 없는 경우에는 void를 생략해도 된다. 하지만 컴파일러에 따라 꼼꼼하게 볼 수도 있으니 void를 넣어주는 습관을 기르자.

 

p/214 예제

 

 

 

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

디지털 제어 - 논리게이트의 개념과 특성

 

학습목표

 

논리 게이트와 논리 레벨의 기본 개념의 대해 알아본다.

기본 논리 게이트들의 동작 원리 및 진리표, 게이트 기호들에 대해 알아본다.

정논리와 부논리에 대해 알아본다.

게이트들의 전기적인 특성에 대해 알아본다.

 

//드모르간 정리에 의해 And회로 없이도 NAND회로가 작성가능하다!

 

기본 게이트(AND, OR, NOT)를 활용하여 다양한 논리회로를 만들 수 있다.

 

지난 시간에 했던 내용들을 다시 한번 살펴보자!

 

TTLCMOS 논리 레벨 정의영역

 

 

정의되지 않은 영역에 의해 논리회로에 신호가 들어가는 것을 막기 위해 pull-up 또는 pull-down을 사용해 준다.

//정의되지 않은 영역에서의 신호와 정확한 입출력에 의한 신호의 결과물 차이는 확연하다 ex) 다이오드 불 밝기의 차이

 












//드모르간 법칙에 대한 학습이 필요하다! 논리게이트는 입력 값에 따른 출력 값이 같으면 모양은 신경 쓰지 않는다.





XOR2bit 덧셈에 사용되는 논리회로이다.

//IC 7486

 




//IC 74266 - 별로 많이 안 쓰인다.





게이트에 입력이 들어가서 출력이 되기까지 걸리는 시간을 반응시간이라고 한다.




//시간차가 없는 LS/HC시리즈를 가장 많이 사용한다.

 

 

입력 범위에 대해서는 증폭회로를 사용하여 입력값을 조절해 줄 수 있음으로 입력전압 범위가 출력전압 범위보다 크다.

 



 

출력전류가 어디로 가느냐에 따라서,

칩의 아웃풋 = 싱크전류, 그라운드 = 소스전류



불확실한 신호가 입력되는 것을 막기 위해 사용.



 

// BJT(Bipolar Junction Transistor),MOS(Metal Oxide Semi-conduct)

 

 

논리회로를 이용하여 반가산기를 만들어 보자 -> 프로테우스로 만들어본다.



 

전가산기를 만들어 보자!

 
















 

 

 

 

반응형
Posted by newind2000

매크로 함수

 

#1. 매크로 함수

 

학습목표 - 매크로 함수의 정의와 사용문법을 이해한다.

 

#ifndef ~ #endif //만약 정의 되지 않았다면

 

#ifdef의 부정형임으로 설명 없이 넘어간다!

 

#if#ifdef의 차이

 

#if는 참/거짓을 따져 경우에 따라 입력한 명령어를 수행하게 만드는 명령어이다.

 

#ifdef는 다음 항으로 넣어주는 변수가 정의 되었는지 안되어 있는지 확인 후 경우에 따라 입력한 명령어를 수행하게 만드는 명령어이다.

 

헤더 파일을 만들 때 #if#endif1:1로 대응되는지 확인하기 위해서 주석으로 표시해 주어야 한다.

 

 

! 전처리 문의 중복처리를 막기 위한 코드이다. 원래 전처리 언어의 중복 사용을 권장하지 않지만 위의 코드는 동일 전처리 언어가 두 번 이상 선언 되었을 시 한번만 처리해 주는 코드임으로 유용하다.

 

가장 먼저 선언 되었을 시 #define으로 인하여 header파일이 실행된다.(#define으로 헤더파일이 실행되는 것에 관해서는 더 자세히 알아봐야 하지만 해당 코드로 인해 실행은 되기 때문에 그렇다고 유추할 수 밖에...) 다시 한번 헤더파일이 실행 됐을 경우 #ifndef으로 인해(이미 헤더파일이 실행 되었음으로) 아래의 명령어들은 실행되지 않음으로 억번을 넣더라도 한번만 실행된다는 사실! //실행되지 않는 경우라도 문법에 맞게 입력해주지 않으면 에러가 날 수 있다는 사실!

 

 

 

 

 

 

 

 

#2. 매크로 함수 실습

 

학습목표 - 수업시간의 배운 매크로함수의 정의를 실습에 적용하여 사용할 수 있다.

 

// 사용자가 코딩한 코드를 세미콜론(;)으로만 명령을 나눈다. 때문에 사용자의 가독성을 위해 엔터를 임의적으로 삽입하여도 무관하다.

 

매크로 함수 //함수처럼 생긴 매크로

 

전처리 언어의 일부이다.

 

#define SQUARE(X) X*X -> X가 들어간 곳을 X*X로 바꿔준다.



 

! 매크로 사용 시 원하는 값이 나오지 않을 경우 전처리 언어를 생성 후(cl /P *.c) 안에 내용을 살펴보면 된다. //*는 코딩파일 이름

 

p/561 - 563 까지의 잘못된 매크로의 예를 읽어 보고 이해하자!

 

// 연산의 순서에 대해 자신이 없을 때는 괄호를 사용하여 먼저 연산처리를 해주면 된다.

 

 

#3. 매크로 함수의 사용

 

학습목표 - 수업시간의 배운 매크로함수의 정의를 실습에 적용하여 사용할 수 있다.

 



 

좋은 코드는 치환을 활용하여 전처리 언어와 문자 사용을 늘려 사용자가 알아보기 편한 코드라고 할 수 있다.

p/536 마크로 함수의 사용

 

 

 

#4. 매크로 함수의 장단점

 

학습목표 - 매크로 함수의 장단점을 이해한다.

 

p/564 매크로 함수의 장단점

 

<장점>

 

1. 일반 함수에 비해 실행속도가 빠르다.

 

선행처리기에 의해서 매크로 함수의 몸체부분이 매크로 함수의 호출 문장을 대체하기 때문에 일반 함수를 불러올 때의 메모리할당 -> 실행 위치의 이동과 매개변수로의 인자 전달 -> return문에 의한 값의 반환의 과정을 거치지 않기 때문이다.

 

쉽게 말해 call - return 과정이 필요 없다.

 

2. 자료형에 따라서 별도의 함수를 정의하지 않아도 된다.

 

인자검사(형검사)를 하지 않기 때문에 속도가 빠르다.

 

<단점>

 

1. 정의하기가 까다롭다.

 

만드는 과정이 복잡하다.

 

2. 디버깅하기가 쉽다.

 

3. 실행파일이 커진다.

 

Library에 들어 있는 함수의 경우 호출을 통해 명령을 수행하고 끝나지만 macro 함수의 경우는 지속적으로 해당 코드를 불러와 사용하기 때문에 코드량이 늘어나 실행 파일이 커진다.

 

매크로와 선행처리기 단원은 마무리!

 

함수로 다시 돌아와서.

 

유형 4의 함수를 만들어 보자!

 

반환형이 없을 때 return은 생략 가능하다. 하지만 우리는 쓰자. (우리가 넣지 않으면 컴파일러가 return을 넣어주기 때문에.

 

실습 - 입력한 코드를 활용하여 다이오드에 불을 넣어보자!!(지난 번 중복임으로 설명생략)

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

논리식과 논리회로 이해와 실습

 

#1. 논리식과 논리회로

 

학습목표

 

- 기본 논리식의 표현 방법을 알아본다.

- 불 대수의 법칙을 알아본다.

- 논리회로를 논리식으로 논리식을 논리회로로 표현하는 방법을 알아본다.

- 곱의 합(SOP)과 합의 곱(POS), 최소항(minterm)과 최대항(maxterm)에 대해 알아본다.

 

 

지난 시간에 AND/OR gate 그리고 pull up/pull down에 대하여 학습하였다.

 

지난 시간에 not논리 회로에 대해 빠뜨려 먹었다.

 

기본적인 불 대수식은 and, or, not을 이용하여 표현

and식은 곱셉의 형식으로 표현하고 or식은 덧셈의 형식으로 표현한다.

not은 해당 명제에 언더바를 사용하여 표현한다.

완전한 논리식은 입력 항목들의 상태에 따른 출력을 결정하는 식

 

불 대수 법칙 (불 대수 공리)






1 - X0의 덧셈에서 X에 따라 값이 결정된다.

2 - X1의 곱에서는 X에 따라 값이 결정된다.

3 - X1의 덧셈에서 X에 상관없이 값은 1이다.

4 - X0의 곱에서 X에 상관없이 값은 0이다.

5 - X에서 X를 더하면 값은 X이다.

6 - X에서 X를 곱하면 값은 X이다.

7 - X~X를 더하면 X값에 상관없이 값은 1이다.

8 - X~X의 곱은 X값에 상관없이 값은 0이다.

9 - X를 두 번 부정하면 X이다.

10&11 - 덧셈과 곱셈의 논리 값에서 교환법칙은 성립한다.

12&13 - 덧셈과 곱셈이 합친 논리 값에서 결합법칙은 성립한다.

14&15 - 덧셈과 곱셈이 합친 논리 값에서 분배법칙은 성립한다.

...



//각각의 경우를 대입하여 증명하는 방법을 수학적 귀납법 증명이라 부른다.

//not은 작은 동그라미 하나를 회로에 추가함으로써 나타낼 수 있다.

  

실습 - 논리회로 구성의 실제)

 

NOR GATE 회로 구성을 해보자!

 

//not gate 회로 74HC04

 

 

 

#2 - #3. 논리회로 값의 실습

 

 






 

#4. 논리회로 실습

 

NOR회로 NAND회로를 그려보자!



//Exclusive Or - 두 개의 명제가 같으면 0, 입력 값이 다르면 1

 

프로테우스로 그려보자!



 

반응형
Posted by newind2000

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
Busan IT/디지털 제어2015. 3. 5. 13:30

디지털 제어 - 디지털 논리 회로

 

#1. 디지털 논리회로

 

학습목표 - OR/AND 회로에 대해 이해한다.

 

디지털하면 이진법! 01로 신호화.

 

디지털 신호는 표본화 양자화 부호화 과정을 거쳐서 완성된다.

 

아날로그 신호는 연속 디지털 신호는 비연속이다.

 

MP3의 소리 출력을 예로 들어 디지털 신호에 대해 살펴보자.

 

인간의 가청 주파수인 20 - 20kH를 추출하여 진동수를 조절하여 소리의 세기, 높이, 음색을 조절할 수 있다.

 

<소리의 3요소>

논리회로에서 AND회로는 곱셉이라고 생각하고 OR회로는 +라고 생각하면 된다.

이 때 01이상의 숫자로 구분하여 1이상일 때는 작동 0일 때는 비작동이다.

 

논리회로에서 왼쪽은 입력 오른쪽은 출력이라고 가정한다.

<논리회로의 기호>

 

AND/OR 작동 원리를 실습해 보자.

 

AND 회로는 74XX08시리즈, OR 회로는 74XX32시리즈.

 

ex) MC74HC32AN 회사 OR gate

 

<MC74HC32AN 핀과 논리 설명>

 

! 핀의 번호는 시계반대 방향으로 1 - 14번까지

 

 

#2 - 3. 디지털 논리 회로의 실습

 

MC74HC32AN 데이터시트를 보고 논리회로를 파악한다.

 

// 5volt LED에 바로 전압을 인가하면 LED가 타버린다. 저항을 넣어야 한다.

 

각 논리 값을

 

0 0

1 0

0 1

1 1

 

로 설정하고 출력 값을 확인해보자.

 

 

<브레드보드 선 연결 회로>

 

#4. 논리회로와 pull-up/pull-down

 

Floating을 방지하기 위해 pull-up 또는 pull-down을 사용해 보자.


 

 

반응형
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