PIC16C84

pic16F84를 이용해서 이것저것만드는,
조금은 고급 강좌가 될겁니다.(대상연령 대학교1년 이상)

pic16F84를 갖고 놀기 위해서는 PIC writer 가 필요합니다.
나우누리/하이텔 같은곳에 가시면 직접 만들 수 있는 회로도가 있습니다만,
그냥 하나 구입하는걸 추천합니다.

PIC16F84 같은 컨트롤러는 아주 간단하고 쉽습니다.
한번 배워놓으시면 써먹을곳이 굉장히 많을 겁니다.
(자작 리모컨, 모터제어, 로봇제작, 전광판...등등..)

PIC writer 는 인터넷에서 주문하시면 됩니다.
제가 구입한 녀석은 11만원짜리.
모회사꺼는 18만원...

많은 분들이 구입하실꺼라면 공동구매하심 싸게 될지도...

방학이 시작되고 제가 기존에 하는일이 마무리되면 Chap. 1 이 시작될겁니다.

Chap. 1 What is the "PIC16C84" ???

일단 MicroController 가 뭔지부터 말해야겠죠. 그냥 하나의 컴퓨터라고 보시면 됩니다. 즉, 모니터 빼고 나머지부분... 메인보드를 하나의 칩으로 만든겁니다.

<PIC16F84 - pictured by Jin>

물론 작은만큼 여러 가지 제약이 따릅니다. 입출력 핀의 갯수, 내부 롬의 크기......
하지만 그것이 장점으로 작용할 수도 있습니다. 다리미라든지.. 그냥 기어다니는 장난감, 자동차 리모컨같은 곳에다가 덩치큰 8051같은 것은 어울리지 않죠.

BUT!! 작다고 성능이 구리다는 것은 절대아닙니다!!
입출력핀 갯수가 8051보다 적다는 것 뿐이지, 속도는 훨씬 빠릅니다.

그럼 마이크로컨트롤러가 무엇인가...
입출력핀의 작동을 프로그래밍 할 수 있는 칩입니다.

그러니깐,
처음에 전원을 넣으면 1번핀 전압을 High 로 만들고,
2초뒤에는 3번핀을 High 로....
그리고 대기하다가 4번핀에 입력이 들어오면 5번핀에 달린 LED 불켜기..
7번핀과 GND가 연결되어있는 전선이 끊어지면 2번핀에 연결되어있는 모터를 돌린다.
......................

이런 것들을 프로그래밍한후 PIC writer 로 집어넣으면 그대로 동작한다는 겁니다.

- 결국 병렬포트 제어와 별 다를 게 없습니다. portable 하다는 점외에는..

<PIC16C84 의 다리이름>

핀이름

구분

설명

ra0 ~ ra4
rb0 ~ rb 7

I/O 핀

모두 13개입니다. 모두 입/출력가능합니다.

Vdd, Vss

전원

Vdd 에는 5V , Vss 는 GND

OSC1, OSC2

클럭입력

시스템 클럭을 입력받는다.

mclr

리셋

0V 일 때 칩이 리셋된다.

t0ck1

타이머1 외부입력

타이머1 의 입력핀. ra4와 겸용이다.

16F84 라는 것이 있습니다. 16C84는 EPROM 이라서 한번만 쓰면 끝인데 반해,
16F84는 EEPROM이라서 1000번정도는 거뜬히 썼다 지웠다가 가능합니다.
썼다지웠다가 가능하다는 것외에는 모두 같습니다. (16F84가 좀더 느리던가..?)

<16C84 의 내부>

1KByte 의 롬 : 1KByte정도의 프로그램이 들어갑니다.
32Byte 의 레지스터 : 변수를 32개정도 쓸 수 있습니다.
3개의 인터럽트
1. 외부인터럽트 : rb0/int 핀의 상태가 변하면 인터럽트
2. 포트B변화인터럽트 : rb7,6,5,4의 상태가 변하면 인터럽트
3. 타이머 overflow : 내부타이머가 overflow 되면 인터럽트

1-1 Register file

중요한걸 빼먹었더군요.
레지스터파일은 하바드 구조에서만 존재합니다. 좀 특이한 구조이지만.... 저한테는 이게더 편하더군요. 프로그램 소스가 들어가는 롬(ROM)과는 달리 오직 데이터 저장에만 쓰이는 메모리입니다.

BANK 1

BANK 2

00

INDF

INDF

80

01

TIMER0

OPTION

81

02

PCL

PCL

82

03

STATUS

STATUS

83

04

FSR

FSR

84

05

PORTA

TRISA

85

06

PORTB

TRISB

86

07

87

08

EEDATA

EECON1

88

09

EEADR

EECON2

89

A

PCLATH

PCLATH

8A

B

INT CON

INT CON

8B

C ~ 2F

범용레지스터

Mapped in Bank 0

8C ~ AF

< 특수기능 레지스터 >

명칭

기능

INDF

간접 주소 지정방식에 사용되는 레지스터

TIMER0

8비트 타이머/카운터

PCL

프로그램 카운터의 하위8비트

STATUS

상태 레지스터

FSR

파일 선택 레지스터, 간접 주소 지정방식에서 사용됨.

PORTA

I/O 포트 A

PORTB

I/O 포트 B

EEDATA

EEPROM 데이터 레지스터

EEADR

EEPROM 어드레스 레지스터

PCLATH

프로그램 카운터의 상위비트를 기입할 때만 사용.

INTCON

인터럽트 제어 레지스터

OPTION

옵션 레지스터

TRISA

포트 A의 입출력 설정 레지스터

TRISB

포트 B의 입출력 설정 레지스터

EECON1

EEPROM 제어 레지스터 1

EECON2

EEPROM 제어 레지스터 2

Chap.2 PIC Assembly

Chap.1에서 적어놓은 하드웨어를 주물럭거리기 위한 소프트웨어입니다.

PIC 프로그래밍에는 C언어와 BASIC, 그리고, 어셈블리가 가능합니다. 물론 C나 베이직이 쓰기에 편하겠지만, 하드웨어를 직접 건드리는데는 어셈블리를 따라갈 수 없죠.
거기다가, PIC는 내부 롬의 용량이 비교적 작기 때문에 코드를 낭비해서는 안됩니다. 즉, 사람이 직접 어셈블리로 짜주는게 좋죠.

어셈블리에 약한 분들은 이번기회에 공부해두시면 앞으로 많은 도움이 될 것으로 믿습니다.

PIC 에서 쓰이는 어셈블리는 일반 MS-DOS라든지 MS-WINDOW에서 쓰이는 어셈블리와 모양이 좀 다릅니다. 이점을 유의해 주시고.... 아래에 나오는 명령어는 모두 37개입니다. 당장 모두 외워 버려도 상관은 없지만... 만일 보통레벨의 분들이라면 외우지 않길 권장합니다.
그냥 한번 읽어보시고, 이런 명령어가 있구나... 라고 알아만 두시면 됩니다. Chap.3에서시작될 예제들을 보시면서 모르는 명령어가 나올 때 사전처럼 이용하세요. 예제를 몇 번 읽다보면 명령어의 사용법이 저절로 외워질겁니다.

<참고> FSR 은 INDF 레지스터와 함께 간접 주소지정에 쓰입니다.
INDF 레지스터로 어드레싱을 하면 FSR 의 내용이 실제주소가 되어 데이터
메모리를 어드레싱합니다.

<예>MOVLW 20H : W레지스터에 20H 넣음.
MOVWF FSR : FSR에 20H를 넣음.
CLRF INDF : FSR이 가리키는 메모리를 클리어.
<결과> 20H번지가 클리어됩니다.

명령어

설명

예제

ADDLW k

W레지스터와 K값을 더해서 W에 저장.

ADDLW 15H

ADDWF f,d

W레지스터와 f레지스터내용을 더해서 d에 저장한다.
d가 "W"이면 W에 저장,
d가 "F"면 f레지스터에 저장.

ADDWF FSR, W

ANDLW k

W레지스터와 k를 AND한후 W에 저장.

ANDLW 5FH

ANDWF f,d

W레지스터와 f레지스터를 AND한후 d에 저장.

ANDWF FSR, F

BCF f,b

f레지스터의 비트b를 클리어한다.

BCF FLAG_REG, 7

BSF f,b

f레지스터의 비트 b를 셋한다.

BSF FLAG_REG, 7

BTFSC f,b

만약 f레지스터의 비트 b가 0이면 다음 명령을 스킵한다.

BTFSC FLAG, F

BTFSS f,b

만약 f레지스터의 비트 b가 1이면 다음 명령을 스킵한다.

BTFSC FLAG, F

CALL k

서브루틴 콜이다.

CALL DELAY

CLRF f

f레지스터의내용을 0으로 만든다.

CLRF FLAG_REG

CLRW

W레지스터를 0으로 만든다.

CLRW

CLRWDT

워치독 타이머를 리셋한다.

CLRWDT

COMF f,d

f레지스터의 내용을 반전해서 d에 저장한다.

COMF REG1, W

DECF f,d

f레지스터의 내용을 하나 감소해서 그 결과를 d에 저장한다.

DECF CNT, F

DECFSZ f,d

f레지스터의 내용을 하나 감소하야 d에 저장하고, 이때 만약 0 이면 다음명령을 스킵한다.

DECFSZ CNT, F

GOTO k

k로 무조건 점프한다.

GOTO NEXT

INCF f,d

f레지스터의 내용을 하나 증가해서 d에 저장한다.

INCF CNT, F

INCFSZ f,d

f레지스터의 내용을 하나 증가시킨뒤, 그 결과를 d에 저장하고, 만일 그 결과가 0이면 다음 명령을 스킵한다.

INCFSZ CNT, F

IORLW k

W레지스터의 내용과 k를 OR연산한뒤, W에 저장한다.

IORLW B'00000101'

IORWF f,d

W레지스터의 내용과 f레지스터의 내용을 OR연산한뒤, d에 저장한다.

IORWF RESULT, F

MOVLW k

상수 k를 W레지스터에 저장시킨다.

MOVLW 5AH

MOVF f,d

f레지스터의 내용을 d로 옮긴다.

MOVF FSR, F

MOVWF f

W레지스터의 내용을 f레지스터로 옮긴다.

MOVWF OPTION

NOP

아무처리하지 않고 1사이클을 소비한다.

NOP

OPTION

W레지스터의 내용이 OPTION레지스터에 로드된다.

OPTION

RETFIE

인터럽트 처리루틴에서 복귀한다.

RETFIE

RETLW k

k를 W레지스터에 로드하고, 서브루틴으로복귀한다.

RETLW 3AH

RETURN

서브루틴으로부터 복귀한다.

RETURN

RLF f,d

C플래그와 함께 f레지스터의 내용을 왼쪽으로 회전시키고, 그 결과를 d에 저장한다.

RLF REG1, F

RRF f,d

C플레그와 함께 f레지스터의 내용을 오른쪽으로 회전시키고, 그 결과를 d에 저장한다.

RRF REG1, W

SLEEP

프로세서를 SLEEP모드로 만든다.

SLEEP

SUBLW k

k에서 W레지스터의 내용을 뺀후, 그 결과를 W에 저장한다.

SUBLW 02H

SUBWF f,d

f레지스터에서 W레지스터의 값을 뺀후, 그 결과를 d에 저장한다.

SUBWF REG1, W

SWAPF f,d

f레지스터의 상위 4비트와 하위 4비트를 서로 맞바꾼후, 결과를 d에 저장한다.

SWAPF REG1, W

TRIS

W레지스터의 내용을 TRIS레지스터에 전송한다.

TRIS

XORLW k

W레지스터의 내용과 k값을 XOR연산한뒤 결과를 W레지스터에 저장한다.

XORLW AFH

XORWF f,d

W레지스터의 내용과 f레지스터의 내용을 XOR연산한후 그 결과를 d에 저장한다.

XORWF REG, W

APPENDIX 1. 시리얼 LCD - PIC - 컴퓨터

그래퍼님(Email : acmaskm@hotmail.com )께서 올려주셨습니다.
거듭 감사의 인사를 드리면서....

아래를 클릭하세요~!

control.new21.org/pic/grapher/index.html

시작하기...

시리얼 lcd 모듈이란...

mpu 에 대해...

PIC16F84 에 대해...

전체 부품 리스트...

실전! 롬라이터의 제작...

시리얼 lcd 모듈의 제작..

소스 분석...

프로그램 설정

'Computer Science' 카테고리의 다른 글

[STL] DEQUE  (0) 2008.09.10
XML Programming with C++  (1) 2008.08.31
Electronic combination lock with PIC  (0) 2008.08.29
키 바운싱 & 채터링 제거하기  (0) 2008.08.27
PIC의 활용 (PIC16F84, pic16f877)  (0) 2008.08.27

+ Recent posts