http://cafe.naver.com/circuitsmanual





카페 대문에서 보시듯이 상업성이 전혀 없습니다~ 순수하게 지식을 추구하는 카페이지~ 지식의 교류가 있는곳이라 생각됩니다.

"키트"님이 항상 활동하시고요~ 부족한 부분을 성심성의껏 질문하신다면 무조건 답해주십니다 ^^ 

하지만 그전에 혼자서 노력을 해보고 질문을 하셔야겠죠?.. 

무턱대도 소스해석해주세요~ 밑도 끝도 없는 질문은 어디에서나 민폐입니다~ㅎ

아무튼~ 이곳도 추천해드립니다~!

http://cafe.naver.com/carroty



AVR을 하시면서 이곳을 모른다면 말이 안되죠..^^;

초보에서 대단한 전문가님까지 많이 계신곳입니다~


지금 AVR을 시작하셨다면 이곳을 추천해드려요~

너무 정리가 잘되어 있으셔서..감히..가지고왔습니다..ㅠㅠ 불쌍한 우리 공대인들에게 도움이 되길 바라며..



* 전체 크기의 스크린샷은 1920 x 1080 해상도입니다.

* 설치 진행 환경은 Windows 7 32bit입니다.

* Windows XP 32bit / Windows 7(x86/x64) 모두 설치 및 실행 가능합니다.

* 설치 이후 라이센스 문제로 데모로 실행된다고 하시는 분들은, 라이센스 매니저를 별도로 실행하여 라이센스 세팅을 다시 진행해보세요. 여기에 설명되어 있습니다.

Orcad는 많은 프로그램 중 전기/전자/통신을 전공하는 분들이라면 한번 이상은 만져봐야 할 프로그램이 아닌가 생각합니다.
이 글에서는 Orcad 16.3 버전의 설치 방법에 대해 알아봅니다. 
(정식은 아니고, Shooters라는 그룹 혹은 개인이 릴한 자료)



통상적으로 어느 릴 그룹에서 릴한 자료는 별도의 *.nfo 파일을 포함하고 있거나,
별도의 폴더를 추가하여 놓습니다.

SHooTERS 라는 폴더를 들어가봅니다.

해당 폴더 안에는 정상적인 사용을 위한(정품 인증 회피를 위한) 방법과 필요한 파일들이 있습니다. 
이를 이용해 설치를 진행하도록 합니다.
(모든 복돌 프로그램의 공통사항이라 해도 과언이 아닙니다.)

다시 CD/DVD로 돌아와서 setup.exe를 실행하면,
다음과 같은 설치화면을 볼 수 있습니다.


License Manager를 먼저 설치해줍니다.

설치 경로 지정은 D드라이브로 하였습니다.
(기본은 C:\Cadence\LicenseManager 입니다.)



순조롭게 진행되다가, 다음과 같이 라이센스 파일의 위치를 지정하라는 메시지가 뜹니다.
라이센스 파일은 설치용 CD/DVD 안에 있는 파일을 지정해줍니다.
Browse 버튼을 눌러, (설치CD/DVD)\SHooTERS\license_manager\orcad_163.lic 의 경로를 지정해주시면 됩니다.


파일 경로를 지정한 모습. Next를 눌러줍니다.

파일 경로를 지정해준 뒤 뜨는 화면입니다.
다른 것은 변경하지 마시고, Host Name : 부분에 본인 컴퓨터의 이름만 적어줍니다.
혹 컴퓨터 이름이 한글로 되어있다면, 영문으로 변경하고 진행하셔야 합니다.
한글 컴퓨터 이름은 인식하지 않아 문제가 생깁니다.



이후 Next를 누르시면 설치가 끝납니다.

설치가 끝난 이후,
설치 CD/DVD의 다음 경로로 이동합니다.

\SHooTERS\license_manager



보이는 cdslmd.exe 파일을 복사하여,
다음의 경로에 붙여넣습니다.
C:\Cadence\LicenseManager\
(스크린샷에서는 D:\Cadence\LicenseManager)


이 과정까지 끝났다면,
제품 설치에 들어갑니다.


Product Installation을 선택하여 제품을 설치합니다.



공백으로 놔두셔도 큰 문제 없습니다.


설치 경로의 지정.


설치하려는 제품의 선택. 전 제품을 설치를 선택해봤습니다.


읽어보시고 적당한 것 선택하시면 되겠습니다.


기본 경로는 C드라이브입니다. (여기에서는 D드라이브로 변경)


설치를 위한 설정 사항을 한번 확인하시고, Next 한번, Install 한번을 누르면 설치가 시작됩니다.
설치 과정에서 기타 필요한 프로그램도 같이 깔립니다만, 별도 설정을 해주실 부분은 없습니다.


인스톨이 진행 중입니다. 대략 10분 가량이 소요되는 듯 합니다.


인스톨 마지막 과정에서 이런 화면이 나오면 Next를 눌러줍니다.
Next 클릭 이후 별다른 반응이 없다면, Alt-tab 키를 이용해서 다른 창이 뜨지 않았나 확인해보세요.

인스톨이 완료되었습니다. Finish 를 눌러줍니다.


설치 CD/DVD의 Shooters\경로로 가서, orcad_163.exe 파일을 복사합니다.


복사한 orcad_163.exe 파일을 C:\Cadence\ 경로에 붙여넣기 합니다.
붙여넣기 한 파일을 실행합니다.

orcad_163.exe 를 실행하시면 작은 도스창이 뜨고,
얼마간의 시간이 지난 후 자동으로 종료가 됩니다.
도스창이 종료되면 재부팅을 해줍니다.

재부팅이 끝나면, 프로그램을 실행해봅니다.





설치가 잘 되었습니다.

'Engineering > Using the ORCAD' 카테고리의 다른 글

[ORCAD] DRC 에러대처  (3) 2012.11.01

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

그래서 하루방문자는..여전히..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 


 

집에서 뒹굴뒹굴 놀고있는 USB나 Micro5핀 단자가 많이 있으실겁니다~

이번에는 놀고있는 케이블을 개조해서 필요한 형태로 쓰기위한 정보입니다!

 

1. USB 4pin 일반형태

 

         

        [Male 형태]                            [Female 형태]

 

Male형태는 말그대로 숫놈(?)입니다 ^^; 직사각형 모양 (12mm x 4.5mm)의 규격이며 주로 우리가 USB메모리가 저렇게 생겼지요

Female형태는 암놈(?) 입니다; 둥근 직사각형이며 (8mm x 7.2mm) 주로 케이블이나 기기에 저렇게 달렸있지요..

 

형태는 아래와 같이 2가지로 구분이 되며 케이블 헤드부분을 보시면 알겠지만 우리가 자주 봐왔던 형태입니다.

위에서 소개한 USB 4핀은 아래의 그림에서 첫번째 그림(A) 에 해당하며 B는 동일하지만 모양만 정사각형형태입니다.

핀번호를 참고 하시고요~ 만약 중국산이시면..직접 테스터기로 찍어보시길..추천합니다...ㅠㅠ 중국산은 꼭 이런 규격아닌경우도 있더군요...아까운 장비를 날려먹을수도 있으니..저가형 USB는 믿지마세요 ^^;

 

 

 

Pin Name Cable color Description
1 VCC Red +5 VDC
2 D- White Data -
3 D+ Green Data +
4 GND Black Ground

 

 

 

2. Micro 5pin 형태

 

 

미니 5핀의 경우는 위에서 소개해드린 USB 4핀과 동일한 기능을 가지지만 1핀이 더 존재합니다!

즉, 어떤 하나의 핀은 NC (No connected) 이거나 Gnd라는 소리지요~! 그렇지만!

 

이건 규격참 애매합니다잉~ 그러니깐 지금부터 딱 정해드리겠습니다! 이대로만 하는거에요! ㅎㅎ

한번 해보고 싶었습니다..ㅠㅠ ㅋㅋ

 

주로 핀은 아래와 같이 3가지의 형태가 존재합니다! 

     (1)              (2)              (3)

왼쪽부터 1,2,3으로 명명하겠습니다!

 

(1)  Pinout

 

Pin Name Cable color Description
1 VCC Red +5 VDC
2 D- White Data -
3 D+ Green Data +
X ID   May be N/C, GND or used as an attached device presence indicator (shorted to GND with resistor)
4 GND Black Ground

 

X번의 경우 제조사에 따라서  4~5번 핀을 연결시켜서  ID (장치 인식 고유 신호) 로 사용하기 때문에 아래의 (2)과 모양은 같지만 

1, 2, 3, 4로만 된 케이블은 1, 2, 3, 4+5로 된 케이블과는 호환이 되지 않습니다. 반드시 찍어보시길 추천합니다.

 

 

(2) Pinout & Standard Color

 

 Pin

Name 

Cable color 

Description 

 1 

 VCC

 RED   +5 VDC
 2  D-  White  Data -

 3

 D+  Green  Data +
 X      This pin may be connected to GND for cable detection in some cases.
 4  GND  Black  Ground

 

(3) Mini - USB 4PIN

 

Pin

Name

Cable color

Description

1 VCC Red +5 VDC
2 D- White Data -
3 D+ Green Data +
4 GND Black Ground

 

 



기존 케이블2개로 (마이크로USB케이블 하나와 일반 USB확장케이블)

직접만들어보는 USB-OTG케이블 제작설명에 대해서 포스팅 추가합니다.


아래의 두 그림은 USB의 HOST와 SLAVE모드를 구분합니다. 예를들면 스마트폰과 마우스를 연결한다면,

스마트폰은 -HOST, 마우스는-SALVE가 됩니다.


[Micro USB to USB in normal(slave) mode]

[Micro USB to USB in host mode]


위의 그림을 숙지하시고 아래와 같이 진행하시면 됩니다.

1. 준비물 확인

-Generic microUSB cable  (마이크로 USB케이블)

-USB extension cord   (확장케이블)

-Soldering Iron   (솔더링 -납땜을 위하여)

-Wire Stripper / Cutter  (스트리퍼, 니퍼)

-Solder   (인두기와 땜납)

-Heat-shrink  (열수축튜브, 가열하면 쪼그라드는 튜브입니다)




[왼쪽(검) : Generic microUSB cable / 오른쪽(횐) :USB extension cable]

2. 케이블 제작


1) 확장케이블 (숫놈부분만 제거합니다)을 충분한 길이만큼 자르세요. 우린 암놈만 사용합니다.

2) USB케이블의 암놈부분을 자르세요. 이걸 이제 연결할겁니다. 이것도 충분한 길이를 남겨놓으세요

3) 다음으로 위에서 설명한 HOST와 SLAVE 모드의 그림을 참조하셔서 사용용도에 맞도록 색깔에 맞춰서 연결하세요.

  : 빨강은 빨강끼리 초록-초록, 검정-검정으로 하시면 됩니다.

    HOST모드의 경우 4,5번 핀은 서로 땜질을 하시든 꼬으시든 연결해주세요. 

    그리고 쇼트를 방지하기위하여 수축튜브를 사용하시는 권장합니다. 그냥 테이핑 하셔도 됩니다.



[마이크로 USB 헤더를 열어본 사진입니다]


[4번 5번 핀을 서로 쇼트(연결) 시키는 사진입니다]


[마이크로USB(숫놈)와 일반(확장케이블) USB (암놈)를 연결한 사진]

제작은 위의 방법을 따르시면 됩니다.


그리고 참고로 아래의 그림은 Micro USB type A,B 핀배열사진 입니다.

보시는대로 소켓형태만 다를 뿐, 내부의 핀 배치는 동일합니다.



*출처 :

http://www.yogaretnam.com/gadgets/make-your-own-usb-otg-cable/#reply

먼저, 클래스에 대한 이해를 하기전에 왜 클래스가 필요한지 생각해보아야 합니다.

앞서 우리는 왜 변수를 선언하고 사용하는지에 대해서 이해를 했습니다.

변수의 형이라는것은

 - 변수가 사용하는 메모리의 크기

 - 변수가 가질 수 있는 정보

 - 변수를 어떻게 조작하는가?

에 대한 정보가 포함된 정보입니다. 따라서 새로운 형을 만든다는 것은 프로그래머가 디자인하는 시스템에 맞는 최적의 형을 그 문제를 쉽게 해결할수 있는 변수를 만드는 것입니다.

 

1. 클래스란?

관련된 함수들과 연관된 변수들의 집합. (즉 여러 변수들과 함수들을 내가 필요한것만 골라서 뭉쳐놓은것! =묶는다=객체=캡슐화) 

  - 캡슐화라는건 프로그래머에게 상당한 이점을 준다. 객체안에 무엇있는지 어떻게 동작하는지 알필요가 없다. 우린 그냥 잘 사용한

    다. 예를 들어 커피자판기에 우린 돈만 넣고 버튼만 누르면 커피가 나온다! 자판기가 어떻게 동작하는지는 몰라도 커피를 뽑는데

    에는 전혀 지장이 없다!

 

그리고 클래스의 변수들은 멤버변수 또는 자료멤버라고 부르며

          클래스의 함수들은 멤버함수 또는 클래스의 메쏘드라 부른다.

 

 

예를들어 자판기 클래스의 멤버함수는 동전투입부(), 음료출력부() 라 할수가 있고, 변수로는 콜라버튼, 사이다버튼 이라 할수가 있다. ( 예시가 너무 조잡하네요 ^^;..)

 

1-1. 클래스의 선언

클래스를 선언하기 위해서는 class라는 예약어를 사용해야 합니다.

 

class Who

{

int itsAge;

int itsSex;

Talk();

};

 

Who라는 클래스를 선언하였으며  중괄호안에 자료멤버(멤버변수)를 썼습니다. 그리고 메쏘드로는 Talk()를 선언하였습니다.

이 클래스를 선언하였다고 Who 클래스에게 메모리를 할당하지는 않습니다. 단지 클래스의 정보만을 컴파일러에게 알려줍니다.

(그리고 보통 프로그래머들은 멤버변수의 앞에 its를 붙여서 멤버변수임을 구별합니다)

 

이제 클래스를 선언하였다면 객체를 정의해보겠습니다.

 

Who ChulSu;  //Who 클래스명으로 객체 철수를 정의함. : 이것을 Who를 실체화하는것이라 생각하면 된다.

 

클래스 멤버에게 접근하는법은 아래와 같습니다.

ChulSu.itsAge = 18; //철수의 멤버변수에 18살을 대입.

ChulSu.Talk();        //함수를 쓰려면 이와같이 정의한 객체 철수를 통하여 사용.

 

1-2. 객체에 값을 할당

 

기존의 C나 C++에서 int = 1; 이라고 값을 대입하지 않았습니다.

클래스는 일종의 데이터 형이라고 생각해야 합니다.

따라서 Who = 1; 이라는것을 문법상 오류입니다.

 

int a;

a= 1; 과 같이 우리는 사용할 것입니다.

 

Who.Chulsu;

Chulsu.itsAge = 18;

 

과 같이 사용하여야 합니다.

 

2. private(전용) 와 public(범용) 의 이해

 

클래스를 선언할때 주로 같이 사용되는 예약어로 private 와 public이 있습니다.

기본적으로 클래스를 선언하게 되면 private속성으로 자동선언이 되어집니다.

 

private : 전용멤버(privat클래스의 변수)는 그 클래스 안의 해당 메쏘드(함수)에 의해서만 접근이 가능함 

public : 범용벰버(public클래스의 변수)는 다른 클래스의 객체에 의해서도 접근이 가능함

 

예제)

 

#include <iostream.h>

 

class Who

{

public :

      int itsAge;

   char itsSex;

};

 

int main()

{

Who.Chulsu;

Chulsu.itsAge = 18;

Chulse.itsSex =  m;

 

      cout<<"Chulsu Age =";

      cout<<Chul.itsAge;

return 0;

}

 

 

 

만약 예제에서  public : 을 주석 처리해버리거나 빼버리면??  -> 컴파일 오류가 난다.

이는 내가 만든 Who라는 클래스라도.. 그리고 Who의 객체인 Chulsu라 하더라도 public이 아닌 private로 선언된 클래스의 멤버들에 관해서는 접근이 되지 않는 것이다.   private 로 선언된 클래스내 멤버변수들은 클래스내의 함수들에 의한 내부적인 동작으로만 실행이되고 접근이 될뿐이다! 

 

그럼 public에서는 private로 접근할수 없는가?..아니다. 범용 접근자 메쏘드(함수)를 만들어서 클래스의 전용(private) 멤버 변수들을 읽고 쓸수가 있다! (이런 알고리즘은 전용성과 보안성이 생긴다)

 

(예시)

 

class Who

{

 

public :

  unsigned int GetAge();

  void SetAge(unsigned int Age);

  unsigned char GetSex();

  void SetSex(unsigned char Sex);

 

Talk();

private :

  unsigned int itsAge;

  unsigned char itsSex;

 

};

 

 

 

즉 위와 같이  전용변수로써 나이와 성별을 지정해놓으면 객체는 보호된다.

 

3. 클래스 메쏘드의 구현

 

멤버함수의 정의는 클래스의 이름으로 시작하여 두개의 콜론을 넣고 함수명을 쓰고 매개변수를 쓰면 된다.

 

(예시)

 

#include <iostream.h>

 

class Who

{

public :

  int GetAge();

  void SetAge(int age);

  void Talk();

private:

  int itsAge;

};

 

 

int Who::GetAge()   //클래스 메쏘드 함수

{

return itsAge;

}

void Who::SetAge(int age)

{

itsAge = age;

}

 

void Who::Talk()

{

cout<<"HAHAHa..\n";

}

 

int main()

{

Who.ChulSu;

ChulSu.setAge(18);

Chulsu.Talk();

cout<<"ChulSu Age is";

cout<<ChulSu.GetAge();

cout<<"\n";

ChulSu.Talk();

return 0;

}

 

위의 예시에서 중점적으로 봐야하는 부분은 int Who::GetAge()  void Who::SetAge(int age)의 구현부입니다.

접근자 메쏘드의 쓰임이 왜 이렇게 이루어졌는지 클래스선언부를 꼭 확인하시고 개념을 이해하도록 합니다.

 

4. 생성자와 소멸자

 

작성중..

 

 

8-bit with 8K Bytes In-System Programmable Flash

 

 

간단한 특징은 아래와 같습니다.

 

(1) 저 전력 고성능의 RISC구조 - 8MHz를 사용 시 8MIPS, 16MHz 사용 시 16MIPS 실행
(2) 데이터 및 비휘발성 프로그램 메모리
    - 8K Bytes의 프로그램 가능한 Flash Memory (직렬 프로그래밍 인터페이스 방식)
    - 1K Bytes의 내부 SRAM
    - 512 Bytes의 데이터 EEPROM(직렬 프로그래밍 인터페이스 방식)
    - In-System Programing을 위한 SPI Interface
(3) 주변장치의 특징 - 8비트 범용 작업 레지스터 32개
    - Programmable Serial USART
    - Master/Slave SPI Serial Interface
    - 별도의 프리스케일러를 갖는 8비트 타이머/카운터 2개
    - 비교·캡쳐 모드와 8~10비트의 PWM기능을 갖는 16비트 타이머/카운터
(4) 내부 및 외부 인터럽트 소스
(5) 저 전력 Idle, Power Save과 Power-down 모드
(6) 동작전압 : 4.5∼5.5V
(7) 동작클럭 : 0∼16 MHz

 

Features
• High-performance, Low-power AVR® 8-bit Microcontroller
• Advanced RISC Architecture
– 130 Powerful Instructions – Most Single-clock Cycle Execution
– 32 x 8 General Purpose Working Registers
– Fully Static Operation
– Up to 16 MIPS Throughput at 16 MHz
– On-chip 2-cycle Multiplier
• Nonvolatile Program and Data Memories
– 8K Bytes of In-System Self-Programmable Flash
Endurance: 10,000 Write/Erase Cycles
– Optional Boot Code Section with Independent Lock Bits
In-System Programming by On-chip Boot Program
True Read-While-Write Operation
– 512 Bytes EEPROM
Endurance: 100,000 Write/Erase Cycles
– 1K Byte Internal SRAM
– Programming Lock for Software Security
• Peripheral Features
– Two 8-bit Timer/Counters with Separate Prescaler, one Compare Mode
– One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture
Mode
– Real Time Counter with Separate Oscillator
– Three PWM Channels
– 8-channel ADC in TQFP and MLF package
Eight Channels 10-bit Accuracy
– 6-channel ADC in PDIP package
Eight Channels 10-bit Accuracy
– Byte-oriented Two-wire Serial Interface
– Programmable Serial USART
– Master/Slave SPI Serial Interface
– Programmable Watchdog Timer with Separate On-chip Oscillator
– On-chip Analog Comparator
• Special Microcontroller Features
– Power-on Reset and Programmable Brown-out Detection
– Internal Calibrated RC Oscillator
– External and Internal Interrupt Sources
– Five Sleep Modes: Idle, ADC Noise Reduction, Power-save, Power-down, and
Standby
• I/O andPackages
– 23 Programmable I/O Lines
– 28-lead PDIP, 32-lead TQFP, and 32-pad MLF
• Operating Voltages
– 2.7 - 5.5V (ATmega8L)
– 4.5 - 5.5V (ATmega8)
• Speed Grades
– 0 - 8 MHz (ATmega8L)
– 0 - 16 MHz (ATmega8)
• Power Consumption at 4 Mhz, 3V, 25°C
– Active: 3.6 mA
– Idle Mode: 1.0 mA
– Power-down Mode: 0.5 μA

 

 

아트메가128을 통해서 이미 다 공부해보시고 원하는 기능만을 구현하실때 사용하시면 참 편리합니다^^

적당한 I/O 갯수로 원하는 동작을 심플하게 디자인된 회로로 만들어 내실수 있습니다.

 

 

 

 

ATMega8.pdf

 

SHT1x / SHT7x
Humidity & Temperature Sensor

 

Relative humidity and temperature sensors
- Dew point
- Fully calibrated, digital output
- Excellent long-term stability
- No external components required
- Ultra low power consumption
- Surface mountable or 4-pin fully interchangeable
- Small size
- Automatic power down

 

 

SHT1x / SHT7x Product Summary
The SHTxx is a single chip relative humidity and temperature multi sensor module comprising a calibrated digital output. Application of industrial CMOS processes withpatented micro-machining (CMOSens® technology) ensures highest reliability and excellent long term stability. The device includes a capacitive polymer sensing element for relative humidity and a bandgap temperature sensor. Both are seamlessly coupled to a 14bit analog to digital converter and a serial interface circuit on the same chip. This results in superior signal quality, a fast response time and insensitivity to external disturbances (EMC) at a very competitive price. Each SHTxx is individually calibrated in a precision humidity chamber with a chilled mirror hygrometer as reference. The calibration coefficients are programmed into the OTPmemory. These coefficients are used internally during measurements to calibrate the signals from the sensors.
The 2-wire serial interface and internal voltage regulation allows easy and fast system integration. Its tiny size and low
power consumption makes it the ultimate choice for even the most demanding applications.

The device is supplied in either a surface-mountable LCC (Leadless Chip Carrier) or as a pluggable 4-pin single-in-line
type package. Customer specific packaging options may be available on request.

 

 

 

 

 

온도 습도 센서.pdf

 

 

* 자바는 C++을 기반이기 때문에 우선 C++에서의 함수에 대한 개념을 잡고 가겠습니다.

참고문헌 : teach yourself c++ (정보문화사)

 

1. 함수란 무엇인가?

 흔히 프로그래밍을 접해본 분이라시면 main() 이라는 함수는 알겁니다. c++에서 모든 프로그램은 꼭 하나의 함수를 갖는데 그 함수가  main()함수 입니다. 따라서 프로그램을 시작할때 항상  main()함수를 실행하며 이 main()함수는 다른 함수들을 호출할수도 있습니다.

 

main()

{

  a++;

  func1(); //func1을 호출 - 실행하며 func1을 모두 마친뒤엔 다시 main()문으로 돌아와 func1() 다음줄 부터 작업을 이어갑니다.

  b++;

  func2();

  c++;

  return 0;

}

 

위와 같이 함수는 분기와 반환을 기본으로 수행하는 프로그램의 흐름을 정의합니다.

 

 

1.2 함수의 선언

 

함수의 형태는 아래와 같이 정의됩니다.

 

         반환값형   함수명   ( 매개변수 )

   예시 :   int        Sum         (int a)

            {                           //중괄호로 묶여 있음

               수행 내용;

             } 

 

함수는 프로그램에서 어딘가에 분명 위치하게 되어있을 겁입니다. 하지만 프로그램은 전처리문을 제외하곤 main() 함수를 먼저 실행합니다. 프로그램은 분기,호출점을 만나지 않는 이상 위에서 아래로 순차 실행을 하기때문에 만약 main에서 사용할 함수의 정의가 main() 함수의 다음에 있다면 프로그램은 그 함수를 main()문이 끝나고 다음줄로 넘어갈때 까지 알지 못합니다. 따라서 함수 원형의 선언이 필요합니다.

함수원형이란 말그대로 어떠한 함수를 정의해놓았다면 (이때 정의란, 위와같이 중괄호로 내용까지 포함된 형태의 함수) 중괄호낸 제외한 함수이름만을 main()문 윗 부분 어딘가에 정의해놓은것입니다. 원래함수는 마칠때 ; '세미콜론'을 붙이지 않지만 함수원형정의는 함수가 어딘가에 있다고 알려주는 알림문이기때문에  함수원형 정의후 ; 세미콜론을 붙여줘야 합니다.

 

위의 예시로 다시 예를 들어 보겠습니다

#include <iostream.h>

 

int Sum(int a);

 

 int main()

{

int c=0;

c =Sum(2);

return 0;  //return은 예약어 입니다. 함수가 종료된후 처음 호출된 분기점으로 돌아가서 리턴값을 반환해주라는 명령입니다.

}

 

int Sum(int a)

{

  int b=0;

  b += a;

  return b;
}

 

위의 예시를 보시면 직관적으로 왜 Sum함수의 원형이 main문 위에 위치하는지 함수란 어떻게 동작하는지가 이해가 될거라 생각이 됩니다. ^^;

 

 

1.3 함수의 인자

 

-함수의 인자는 모두 같은 형 필요는 없습니다.

void Sum (int a, char b, float c)

 

-함수의 매개변수로 함수를 사용할수 있습니다.

void Sum ( flot ( int a, int b) )

 

-함수의 매개변수로 전달된 값은 그 함수 안에서만 살아있는 지역변수로 사용됩니다. 이것은 call by value 라는 의미로 알려져 있습니다.

 

-반환값

함수는 어떠한 결과값을 반환하기 위해서 예약어 return을 사용하며 그 뒤에 반환하고자 하는 값을 씁니다.

return 1;             //그냥 값1을 반환합니다.

return (x>2);      // x값에 따라서 참,거짓을 반환합니다.

return (Fun1()); // Fun1을 실행하여 나오는 반환값을 이것을 리턴하는 함수의 반환값으로 사용합니다.

 

 

 

2. 함수에서의 변수는?

 

지금 다룰것은 자료형을 의미하는 것이 아닙니다 ^^; 함수의 몸체안에 있는 변수인지 혹은 밖에 있는 변수인지에 따라서 지역변수, 전역변수로 나눠지는 형태를 설명하겠습니다.

 

지역변수는 말 그대로 어느 지역안에서만 사용할수 있고 남아있는 변수를 의미합니다. 그 지역은 함수의 중괄호를 의미하구요.

아래의 예를 보겠습니다.

 

 

#include <iostream.h>

 

void Test()

{

  a =2;

 cout<<a<<endl; 

}

 

 int main()

{

int a=1;

Test();

cout<<a<<endl; 

return 0; 

}

 

출력결과 : 2

               1

 

예상하시는 대로 a라는 변수는 서로 다른 지역에 존재하기때문에 영향을 미치지 못합니다. 지역변수란 바로 이런의미를 가집니다.

그럼 전역변수는 어떤 의미인가요? 아래의 예를 보겠습니다.

 

#include <iostream.h>

 

 int a=3;

 

void Test()

{

  a=2;

 cout<<a<<endl;

}

 

 int main()

{

Test();

cout<<a<<endl;

return 0; 

}

 

출력결과 :  2

                2

 

모두 예상하신 답과 일치하나요? 역시 전역변수는 전역으로 사용이 가능합니다. 하지만 프로그램의 어디서든 이 변수는 값을 변경할수있기때문에 되도록 사용하지 않는것이 좋습니다. 의도하든 의도하지않던 어쨌거나 프로그램 오류의 가능성이 높아질수가 있기 때문이죠. 만약 5000줄짜리 프로그램을 코딩한다고 할때 프로그램의 첫줄에 내가 자주사용하는 이름의 변수를 전역으로 선언하여 사용한다고 생각해보세요. 후에 4000줄까지 코딩을 내려오다가 동일한 변수명을 어느 함수에서 사용해서 값을 바꿔버렸습니다. 그렇다면 아래의 함수에서 전역변수의 값이 변경되어 분명 찾기힘든 오류가 생길것입니다..ㅠㅠ 그러므로 주의를 하시던지 사용을 줄이시던지 그건 앞으로의 습관이 중요할 것 같습니다.

 

그리고 동일한 예시를 아래와 같이 약간 변경해보겠습니다.

 

#include <iostream.h>

 

 int a=3;

 

void Test()

{

  int a=2;    // 동일한 변수명으로 a를 선언하였습니다.

 cout<<a<<endl;

}

 

 int main()

{

Test();

cout<<a<<endl;

return 0; 

}

 

출력결과 :  2

                3

 

이번에는 지역변수와 전역변수가 함께 나왔습니다. 물론 변수명은 동일하지만 이 둘은 엄연히 다른 변수입니다. 앞의 예시들을 다 이해하셨다면 어떠한 프로그램이 나와도 전역과 지역변수때문에 혼동되시는 일은 없으실거라 생각이 듭니다.

 

 

 

 

3.함수의 중첩 (다형성)

 

 

c++에서는 같은 이름을 가진 함수들을 중첩시켜 만들수 있습니다. 이는 매개변수의 갯수가 다르거나 그것들이 혼합된것을 각각 다른 함수로 보기 때문에 그렇게 봅니다. 즉, 동일한 함수명을 가지더라도 매개변수가 다르면 다른 함수로 각각 본다는 것입니다.

 

int Sum( int );

int Sum( int , int);

int Sum( char);

 

( 제가 개인적으로 Sum함수를 좋아하는건 아닙니다..-_-;;..)

위의 함수는 모두 다른 함수입니다.

 

 함수의 중첩은 함수의 다형성이라고도 불립니다. 이는 많은 형태의 함수라는 말이며 동일한 함수명이지만 인자나 매개변수, 매개변수갯수가 달라서 동일한 함수명을 가진 각기 조금씩 다른 기능을 가진 함수를 여러개 만들지만 필요한 알고리즘에 따라서 각각 호출할때 사용하시면 매우 훌륭한 프로그램이 될수가 있습니다. (뛰어난 가독성을 지니게 됩니다)

 

또다시 Sum으로...예를 들어보겠습니다...(썸....-_-..음..)

 

#include <iostream.h>

 

 

int Sum(int a)

{

 int a+=2;   

 return a;

}

 

int Sum(int a, int b)

{

 int a+=b;   

 return a;

}

 

 int main()

{

 int c=0;

 

 c= Sum(1);

 cout<<c<<endl;

 c = Sum(1,2);

 cout<<c<<endl;

 

 return 0;

}

 

출력결과 :  3

                3

 

위의 Sum()함수는 모두다 함수명은 갖지만 분명 다른 기능을 하는 함수들입니다. 서로 매개변수가 다르기 때문에 첫번째 Sum은 입력값에 +2를 하여 출력해주면 두번째 Sum()은 두개의 입력값을 더하여 출력해줍니다.

이와같이 함수명은 동일하지만 프로그래머의 의도에 따라서 다양하게 함수를 중첩하여 사용할수가 있습니다!

 

 

** 인라인 함수와 재귀함수는 다음에 다루도록 하겠습니다..ㅠㅠ**

 

 

4. 함수의 동작?..어떻게?

이 부분은 메모리에 대한 개념을 잡고 넘어가야 할 산입니다..^^;...아무래도 마이크로컨트롤러를 다뤄보신 분이라시면 이미 알고 계실지도 모르겠습니다. ㅎ

 

함수를 호출하면 호출한 함수로 분기되며, 처음 호출한 함수의 매개변수는 전달되며 함수의 내용이 실행됩니다.

또한 그 함수가 끝나면 그 함수가 선언된 형에 따라서 값을 리턴하며 다시 처음 함수를 분기한 부분으로 돌아가게 됩니다.

 

이런일은 어떻게 순차적으로 가능한걸까요? 그리고 어떻게 분기되는지, 각 변수들은 어느곳에 저장되는 알수있을까요?

 

4.1 RAM나누기

 

간단하게 우리 사용하는 프로그램의 램 공간을 몇가지로 나눠 생각해 볼수가 있습니다.

  - 전역공간

  - 자유 메모리

  - 레지스터

  - 코드영역

  - 스택 

 

 

 1) 전역공간은 : 말그대로 전역변수들이 저장되는 공간입니다.

 2) 레지스터 : CPU안에 존재하는 특별한 메모리 영역을 말합니다. MCU를 배우셨다면 ALU안에 어떠한 범용레지스터, 상태레지스

    터등이 존재한다는 것을 아실겁니다.  이 레지스터들은 여러 종류가 존재하며 우리가 사용하는 부분들은 다음 수행할 코드를 가리

    키는 레지스터입니다. 이들은 명령 포인터라고 호칭합니다.

 3) 코드영역 : 어떤 메모리 일부분에 프로그램에서 만든 명령들을 2진수의 컴퓨터 언어로 저장되는 공간입니다. 이들의 각 코드들은

     어떠한 명령어로 변환이 되는데 이 명령은 메모리의 특정주소에 존재하게 됩니다.

   

     2000  int a = 1;

     2001  int b = 2; 

      .....

     2010  return 0;

 

  3) 스택 : 스택은 프로그래머가 코딩한 프로그램에서 각 함수에 의해 필요한 데이터들을 보관하기 위해 할당된 특별한 메모리영역

               입니다. 스택이라고 명명한 이유는 그 뜻이 접시꾸러미와 동일하게 동작하기 때문입니다. Last-In-First-Out. 즉, 쉽게

              풀자면 어릴때 사용한 동전지갑을 떠올린다면 쉽습니다. 마지막에 넣은 동전이 제일먼저 나오는 구조를 의미합니다.

              즉, 극단적으로 표현하자면 함수의 중괄호가 동전지갑이며 그 안에 동전을 하나씩 넣는 것이 어떠한 명령이자 데이터입니

              다. 이것을 수행하고 마지막의 명령 혹은 데이터가 하나씩 종료가 되며 리턴되는데 이를 스택으로 생각하시면 됩니다..

              말이 참 어려워 졌는데..ㅠㅠ 아래에 예를 하나 들고서 5장을 마칩니다.

 

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

 

 

 

 

 

 

+ Recent posts