PIC16C84의 외형 RA2 1 RA1 I/O PIN I/O PIN RA3 RA0 RTCC OSC1 발 진 RESET 발 진 RESET /MCLR OSC2 전 원 VSS PIC16C84 VPP 전 원 RB0 RB7 RB1 RB6 I/O PIN I/O PIN RB2 RB5 RB3 RB4
참고 - 오실레이터 발진방법 분류 RC : RC오실레이터 ( 4Mhz 까지 ) 타이밍이 중요하지 않은 저가의 제품 XT : 표준 크리스탈 ( 4Mhz 까지 ) HS : 고속 크리스탈 ( 20Mhz 까지 ) LP : 저전력, 저주파 크리스탈 ( 32Mhz 까지 ) 저소비전력이 필요한 제품
PIC16C84의 내부 ROM – 14bit 단위 구성 1024word로 구성 CPU – 중앙처리장치 RAM - 8bit 단위 구성 36 byte크기 I/O – 입 출력 지정이 자유로운 PORT RTCC – 실시간 카운터 (시간을 카운터하는 목적)
PIC16C84의 블록 구성도 I/O ROM CPU RAM Counter 프로그램 메모리 맵 PAGE0 54/55 PAGE1 56 ROM CPU RAM PAGE2 57 Counter PAGE3 프로그램 메모리 맵
1장 메모리 구조 1. PIC16C84의 메모리 ROM RAM 14bit 단위 구성 8bit 단위 구성 1장 메모리 구조 1. PIC16C84의 메모리 ROM RAM 14bit 단위 구성 8bit 단위 구성 1024 word 의 크기 36byte 의 크기 EEPROM으로 구성 SRAM 으로 구성 프로그램 저장용도 데이터 저장용도
프로그램 메모리 ( ROM ) 000H 리셋 벡터 002H 003H 004H 005H 인터럽트 벡터 3FFH
레지스터 파일 ( RAM ) 뱅크0 뱅크1 00H INDIR 01H RTCC OPTION 02H PC 03H STATUS FSR 05H PORTA TRISA 06H PORTB TRISB 07H 08H EEDATA 09H EEADR 0AH PCLATH 0BH INTCON 0CH GENERAL PURPOSE REGISTER 2FH
2장 레지스터 STATUS 레지스터 I/O 레지스터 워킹 레지스터 RTCC 레지스터와 프리스케일러와 OPTION 레지스터 2장 레지스터 STATUS 레지스터 I/O 레지스터 워킹 레지스터 RTCC 레지스터와 프리스케일러와 OPTION 레지스터 WDT 타이머 ( 와치독 타이머 )
1. STATUS 레지스터 STATUS 레지스터의 구조 7 6 5 4 3 2 1 RP 플래그 TO 플래그 PD 플래그 ZERO RP 플래그 TO 플래그 PD 플래그 ZERO 플래그 DC 플래그 CARRY 플래그
1-1 CARRY 플래그 연산명령 수행 후, 연산 결과가 자리 넘침이나 자리 빌림이 발생하였을 때 그 상태를 표시. 덧셈 명령 실행 시… 8비트 수의 한계인 255를 넘지 않았을 때에는 캐리 플래그는 0이 되고 255를 넘었을 때에는 캐리 플래그는 1이 된다. 뺄셈 명령 실행 시… 뺄셈 연산 중 자리 빌림이 발생하지 않는다면 캐리 플래그는 1 자리 빌림이 발생한다면 캐리 플래그는 0이 된다. A < B 일 때 캐리 플래그는 0이 된다. A = B 일 때 캐리 플래그는 1이 된다. 비교시의 캐리 플래그 A > B 일 때 캐리 플래그는 1이 된다.
1-2 DC 플래그 ( DIGIT CARRY BIT ) ADDWF, SUBWF 명령 실행시 하위 4비트에서의 자리올림이나 내림 발생시 세트 또는 리셋된다. 주로 BCD 연산 등에서 사용하며 모든 동작은 캐리플래그와 같다.
1-3 ZERO 플래그 STATUS 레지스터의 여러 플래그 중 가장 자주 쓰인다. 용어가 의미하듯이 명령 수행의 결과가 0이 되었을 때 1로 세트되는 플래그이다. 두 수의 결과가 0인지 판단할 때도 쓰이지만 일치하는지 여부에도 자주 사용한다. 20 - 10 = 10 < 결과가 0이 아니므로 ZERO 플래그는 0 20 – 2- = 0 < 결과가 0이므로 ZERO 플래그는 1
1-4 PD 플래그 ( POWER DOWN BIT ) 최초의 전원 공급 또는 CLRWDT 명령으로 1로 세트되고 SLEEP 명령으로 0으로 리셋된다.
1-5 TO 플래그 ( TIME OUT BIT ) 최초 전원공급시나 CLRWDT 명령 실행시, SLEEP 명령 실행시 1로 세트되고 와치독 타이머가 타임아웃될 때 0으로 리셋된다.
참고 - PD와 TO에 대하여… TO PD 리셋의 원인 1 1 1 1 SLEEP 상태에서 WDT에 의해 리셋됨 SLEEP 상태에서 WDT에 의해 리셋됨 1 NORMAL상태에서 WDT에 의해 리셋됨 1 SLEEP상태에서 MCLR단자에 의해 리셋됨 1 1 최초의 전원투입에 의해 리셋됨
1-6 RP 플래그 (레지스터 페이지 선택 플래그) 앞의 레지스터 파일은 뱅크0과 뱅크1, 두 가지가 있는데 이중 하나의 뱅크를 선택할 때에 사용한다.
참고 - RP 플래그에 대하여… BIT 5 설 명 프로그램 페이지 0번을 선택한다. 1 프로그램 페이지 1번을 선택한다. 설 명 프로그램 페이지 0번을 선택한다. 1 프로그램 페이지 1번을 선택한다. 페이지가 2개 일 때 BIT 6 BIT 5 설 명 프로그램 페이지 0번을 선택한다. 1 프로그램 페이지 1번을 선택한다. 1 프로그램 페이지 2번을 선택한다. 1 1 프로그램 페이지 3번을 선택한다. 페이지가 4개 일 때
2. I/O 레지스터 PORTA 레지스터 4개 RA0 ~ RA3 PORTB 레지스터 8개 RB0 ~ RB7 TRIS 레지스터 – TRIS 레지스터의 비트를 1로하면 입력으로 설정되고 0으로 하면 출력으로 설정된다.
3. 워킹 레지스터 CPU에서 어큐뮬레이터라고 불리는 레지스터로 PIC에서는 워킹레지스터 또는 W레지스터라고도 불리고 있고, 모든 산술, 논리 연산 명령의 중심이 된다.
4. RTCC 레지스터와 프리스케일러와 OPTION 레지스터
4-1 RTCC 레지스터 RTCC레지스터는 읽고 쓸 수 있으며 읽을 때는 현재 카운트되고 있는 값이 읽히고, 쓸 때는 써넣는 값으로 세팅이되어 그 값부터 카운트를 시작하게 된다. 내부 RTCC로 동작시 타이머 역할을 한다. 값이 0FFH에 도달하면 다시 0부터 증가한다. 주로 카운트하는 목적으로 사용이 된다. 프리스케일러로 256:1까지 분주할 수 있다. 외부 RTCC로 동작시 카운터 역할을 한다. RTCC핀에 입력되는 펄스의 개수를 센다. 상승또는 하강에서 카운트를 할지는 OPTION명령에서 결정한다.
4-2 프리스케일러란? PRE와 SCALER의 합성어로 전치분주기이다. 카운터 앞에서 신호를 나누어 주는 역할을 한다. 2:1분주 프리스케일러 RTCC 카운터 4:1분주 프리스케일러 RTCC 카운터
4-3 OPTION 레지스터의 사용법 5 4 3 2 1 RTS RTE PSA PS2 PS1 PS0 프리스케일러의 값 RTS RTE PSA PS2 PS1 PS0 프리스케일러의 값 RTCC분주 WDT 분주비 프리스케일러 지정 비트 0 0 0 1 : 2 1 : 1 0 0 1 1 : 4 1 : 2 0 … RTCC 0 1 0 1 : 8 1 : 4 1 … WDT 0 1 1 1 : 16 1 : 8 RTCC 카운트 시기 1 0 0 1 : 32 1 : 16 1 0 1 1 : 64 1 : 32 0 … RTCC핀의 신호가 LOW에서 HIGH로 전환될 때 증가 1 1 0 1 : 128 1 : 64 1 1 1 1 : 256 1 : 128 1 … RTCC핀의 신호가 HIGH에서 LOW로 전환될때 증가 RTCC 신호원 0 … 내부의 명령 수행 클럭 1 … RTCC핀
5. WDT 타이머 ( 와치독 타이머 ) 0으로부터 증가하여 0FFH를 넘게 되면 칩을 리셋시킨다.
PIC의 명령어 PIC16C84는 35개의 명령어를 가지고 있다.
ADDLW K Add Literal to k W레지스터의 값과 상수 k의 값을 더한 뒤 그 결과를 w레지스터에 저장한다. ADDLW 10H , W = 15 실행후의 W = 25H 결과가 0이 아니므로 Z플래그는 0이 되고, 결과가 255 미만이므로 C플래그는 0이 된다.
ADDWF f,d Add W to F W레지스터의 값과 f레지스터의 값을 더한 뒤 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) ADDWF BF1,F , W = 10H BF1 = 15H 실행후의 W = 10H BF1 = 25H ADDWF BF1,W
ANDLW k AND Literal and W W레지스터의 값과 상수 k를 AND 연산한 뒤 그 결과를 W레지스터에 저장한다. ANDLW 0FH , W = 0AAH 실행후의 W = 0AH
ANDWF f,d AND W with f W레지스터의 값과 f 레지스터의 값을 AND연산한 뒤 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) ANDWF BF1,F , W = 0AAH BF1 = 0FH 실행후의 W = 0AAH BF1 = 0AH ANDWF BF1,W
BCF f,b Bit Clear f f레지스터의 비트 b를 0으로 만든다. BCF BF1,7 , BF1 = 0FFH 실행후의 BF1 = 07FH
BSF f,b Bit Set f f레지스터의 비트 b를 1로 만든다. BSF BF1,7 , BF1 = 00H
BTFSC f,b Bit Test, Skip if Clear f레지스터의 비트 b가 0이면, 다음 명령을 스킵한다. BTFSC BF1,7 1번 – 7번 bit가 1일 때 실행 2번 - 7번 bit가 0일 때 실행
BTFSS f,b Bit Test, Skip if Set f레지스터의 비트 b가 1이면, 다음 명령을 스킵한다. BTFSS BF1,7 1번 – 7번 bit가 0일 때 실행 2번 - 7번 bit가 1일 때 실행
CLRF f Clear f f레지스터를 0으로 만들고 ZERO플래그를 1로 만든다. CLRF BF1
CLRW Clear W Register W레지스터를 0으로 만들고 ZERO플래그를 1로 만든다. CLRW
CLRWDT Clear Watchdog Timer 워치 독 타이머를 리셋시키고 워치 독 프리 스케일러도 리셋시킨다. STATUS 레지스터의 TO, PD비트는 1로 만든다. CLRWDT
COMP f,d Complement f f레지스터의 내용을 반전시켜 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) COMP BF1,F , BF1 = 0AAH 실행후 BF1 = 55H COMP BF1,W
DECF f,d Decrement f f레지스터의 내용을 하나 감소시켜 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) DECF BF1,f , BF1 = 11H 실행 후 BF1 = 10H DECF BF1,W
DECFSZ f,d Dec. f Skip if Zero f레지스터의 내용을 하나 감소시켜 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) 그리고 감소시킨 결과가 0이면 다음 명령을 스킵한다. DECFSZ BF1,F (W) 1번 – 결과가 0이 아닐 때 실행 2번 - 결과가 0일 때 실행
GOTO k 번지 k로 무조건 분기한다.
INCF f,d Increment f f레지스터의 내용을 하나 증가시켜 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) INCF BF1,F , BF1 = 11H 실행 후 BF1 = 12H INCE BF1,W
INCFSZ f,d Inc. f Skip if Zero f레지스터의 내용을 하나 증가시켜 그 결과를 d르 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) 그리고 결과가 0이면 다음 명령을 스킵한다. INCFSZ BF1,F (W) 1번 – 결과가 0이 아닐 때 실행 2번 - 결과가 0일 때 실행
IORLW k OR Literal with W W레지스터의 값과 상수 k를 OR연산한 뒤 그 결과를 W레지스터에 저장한다. IORLW 0FH , W = 0AAH 실행 후 W = 0AFH
IORWF f,d OR W with f W레지스터의 값과 f레지스터의 값을 OR연산한 뒤 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) IORWF BF1,F , W = 0AAH BF1 = 0FH 실행 후 W= 0AAH BF1 = 0AFH IORWF BF1,W
MOVLW k Move Literal to W 상수 k를 W레지스터에 저장한다. MOVLW 012H
MOVF f,d Move f f레지스터의 값을 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) MOVF BF1,W , BF1 = 0FH 실행 후 W = 0FH BF1 = 0FH MOVF BF1,F
MOVWF f Move W to f W레지스터의 값을 f레지스터에 저장한다. MOVWF BF1
NOP No Operation 아무 처리도 수행하지 않고 1사이클만 소비한다. 주로 시간지연 목적에 쓰인다.
RLF f,d Rsotate Left f with Carry Carry플래그와 함께 f레지스터의 값을 왼쪽으로 회전시키고 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) RLF BF1 C
RRF f,d Rotate Right f with Carry Carry플래그와 함께 f레지스터의 값을 오른쪽으로 회전시키고 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) RRF BF1 C
SLEEP Go Sleep Mode 슬립 모드로 진입한다. 프로세서는 슬립 모드로 진입하고, 오실레이터 발진은 중단된다.
SUBLW k Sub Literal from W 상수 k에서 W레지스터의 값을 뺀 후 그 결과를 W레지스터에 저장한다. SUBLW 02H , W = 1H 실행 후 W = 1H 자리 빌림이 발생하지 않았으므로 CARRY플래그는 1이 된다.
SUBWF f,d Sub W to f f레지스터의 값에서 W레지스터의 값을 뺀 뒤 그 결과를 d로 보낸다. SUBWF BF1,F , W = 1H BF1 = 01H 실행 후 W = 1H BF1 = 0FFH C = 0 자리 빌림이 발생 하였으므로 CARRY플래그는 0이 된다.
XORLW k Ex.OR Literal with W W레지스터의 값과 상수 k를 XOR 연산한 뒤 그 결과를 W레지스터에 저장한다. XORLW 0FH , W = 0AAH 실행 후 W = 0A5H
XORWF f,d Ex.OR W with f W레지스터의 값과 f레지스터의 값을 XOR 연산한 뒤 그 결과를 d로 보낸다. ( d가 W이면 W레지스터에 저장하고 F이면 f레지스터에 저장한다. ) XORWF BF1,F , W = 0AAH BF1 = 0FH 실행 후 W = AAH BF1 = 0A5H XORWF BF1,W
CALL k Subroutine Call 서브 루틴을 콜하는 명령이다. 면저 복귀할 어드레스를 스택에 저장하고 지정한 번지 k로 분기한다.
RETFIE Return from Interrupt 인터럽트 처리 루틴에서 리턴한다. 인터럽트 루틴으로부터 메인 루틴으로의 리턴에 사용하는 명령으로 리턴과 동시에 GIE비트를 1로 만들어 준다.
RETLW Return Literal to W 상수 k를 W레지스터에 저장하고 리턴한다. RETLW 012H 이 명령은 리턴과 동시에 어떤 인수등을 전달할 때 유용하게 사용된다.
RETURN Return from Subroutine 단순 리턴 명령이다.
SWAPF f,d Swap f f레지스터의 상위 니블과 하위 니블을 서로 맞바꾼 후 그 결과를 d로 보낸다. SUBWF BF1,F
P I C 실 습 3주차 – LED 제어 및 제트카 점멸 제어 2002년 1월 17일
LED 제어 부문 LED 제어 회로도, 회로분석, ASM 분석 문제 1 문제 2 문제 3
1. LED 제어 1-1 회로도 1-2 회로분석 1-3 ASM 분석
1-1 회 로 도
1-2 회 로 분 석 Sw상태 입력 출력 on low high off high low 입력 PORT는 PIC의 경우 high로 설정이 되기 때문에 low로 만들어 주어야 입력을 받게 된다. SW 를 OFF시 입력 PORT에는 high가 걸려 있고 SW를 ON할 경우 입력 PORT가 접지와 연결이 되어 low가 되어 입력을 받게 된다. 출력 PORT는 low로 설정이 되어 있기 때문에 high를 걸어 주어야 LED가 빛을 발하게 된다. 4번 핀은 low일 때 칩을 reset하므로 high를 걸어 주어야 한다. Sw상태 입력 출력 on low high off high low
1-3 ASM 분석 자료 1번 참조
2. 문제 1번 2-1 회로도 2-2 회로분석 2-3 ASM 분석
2-1 회 로 도
2-2 회 로 분 석 Sw상태 입력 출력 on low low off high high 입력 PORT는 PIC의 경우 high로 설정이 되기 때문에 low로 만들어 주어야 입력을 받게 된다. SW 를 OFF시 입력 PORT에는 high가 걸려 있고 SW를 ON할 경우 입력 PORT가 접지와 연결이 되어 low가 되어 입력을 받게 된다. 출력 PORT는 low로 설정이 되어 있기 때문에 high를 걸어 주어야 LED가 빛을 발하게 된다. 4번 핀은 low일 때 칩을 reset하므로 high를 걸어 주어야 한다. Sw상태 입력 출력 on low low off high high
2-3 ASM 분석 자료 2번 참조
3. 문제 2번 3-1 회로도 3-2 회로분석 3-3 ASM 분석
3-1 회 로 도
3-2 회 로 분 석 Sw상태 입력 출력 ( PORTB 0~7 ) on low high off high low 입력 PORT는 PIC의 경우 high로 설정이 되기 때문에 low로 만들어 주어야 입력을 받게 된다. SW 를 OFF시 입력 PORT에는 high가 걸려 있고 SW를 ON할 경우 입력 PORT가 접지와 연결이 되어 low가 되어 입력을 받게 된다. 출력 PORT는 low로 설정이 되어 있기 때문에 high를 걸어 주어야 LED가 빛을 발하게 된다. 4번 핀은 low일 때 칩을 reset하므로 high를 걸어 주어야 한다. Sw상태 입력 출력 ( PORTB 0~7 ) on low high off high low
3-3 ASM 분석 자료 3번 참조
4. 문제 3번 4-1 회로도 4-2 회로분석 4-3 ASM 분석
4-1 회 로 도
4-2 회 로 분 석 Sw 1 Sw 2 on on low low high on off low high low off on 입력 PORT는 PIC의 경우 high로 설정이 되기 때문에 low로 만들어 주어야 입력을 받게 된다. SW 를 OFF시 입력 PORT에는 high가 걸려 있고 SW를 ON할 경우 입력 PORT가 접지와 연결이 되어 low가 되어 입력을 받게 된다. 출력 PORT는 low로 설정이 되어 있기 때문에 high를 걸어 주어야 LED가 빛을 발하게 된다. 4번 핀은 low일 때 칩을 reset하므로 high를 걸어 주어야 한다. Sw 1 Sw 2 입력 1 입력 2 출력 on on low low high on off low high low off on high low low off off high high low
4-3 ASM 분석 자료 4번 참조
제트카 점멸 제어 부문 제트카 점멸 제어 회로도, 회로분석, ASM 분석 문제 1 문제 2 문제 3
1. 제트카 점멸 제어 1-1 회로도 1-2 회로분석 1-3 ASM 분석
1-1 회 로 도
1-2 회 로 분 석 내부적으로 시간에 따라 LED가 순차적으로 켜지고 꺼짐
1-3 ASM 분석 자료 5번 참조
2. 문제 1번 2-1 회로도 2-2 회로분석 2-3 ASM 분석
2-1 회 로 도
2-2 회 로 분 석 내부적으로 시간에 따라 LED가 순차적으로 켜지고 꺼짐
2-3 ASM 분석 자료 6번 참조
3. 문제 2번 3-1 회로도 3-2 회로분석 3-3 ASM 분석
3-1 회 로 도
3-2 회 로 분 석 내부적으로 시간에 따라 LED가 순차적으로 켜지고 꺼짐
3-3 ASM 분석 자료 7번 참조
4. 문제 3번 4-1 회로도 4-2 회로분석 4-3 ASM 분석
4-1 회 로 도
4-2 회 로 분 석 내부적으로 시간에 따라 LED가 순차적으로 켜지고 꺼짐
4-3 ASM 분석 자료 8번 참조
E N D
Pic test borad con1과 con1-1은 led제어시 con1과 con1-2은 fnd제어시 pic16c84용 test borad 5v용 전원