【카운터로서 사용한다】
PIC의 타이머는 입력으로서 내장 시계 신호 이외에, 외부로부터의
펄스 신호를 사용할 수도 있습니다.
그 입력 핀이, RA4(T0CKI)입니다. 이것을 사용하면(자), 외부 신호의
카운트를 할 수가 있어 인원수 카운터나, 주파수 카운터 등
(을)를 만들 수가 있습니다.
여기에서는 우선, 쉬운 인원수나 사상의 카운터를 만드는 방법의 소개와
비교적 어려운 주파수 카운터로서 동작시키는 방법의 양쪽 모두를 소개해
.
【PIC의 카운터의 내부 구성】
실제의 PIC의 내부 카운터의 구성은 밑그림과 같이 되어 있습니다.
여기서 RTE, RTS, PSA라고 하는 신호는 내부의 전환 제어 신호로, OPTION
레지스터로 지정합니다. 한 번 지정하면 그대로 전원이 끊어진다
까지, 즉 RESET가 걸릴 때까지는 보관 유지됩니다.
여기서 각각의 의미를 설명합니다.
·RTS:입력 전환
카운터에의 입력 신호를 내장 시계로 하는지, 외부 신호로 할까
의 지정으로, 카운터로서 사용할 때에는 외부로 합니다.
·RTE:엣지 전환
입력 신호의 립 오름이나 립 내려감 어느 쪽의 엣지에서 카운트업을
하는지를 지정합니다. 신호가 들어갔을 때에 카운트업하므로
상승 모서리로 해둡니다.
·PSA:프리스케이라 전환
프리스케이라카운타를 사용하는지 사용하지 않는지를 지정합니다. 프리스케이
라는 카운터 TMR0의 전단을 뒤따르는 카운터로, 고속으로 동작하는 것이
할 수 있습니다. 그 대신해, 프리스케이라는 프로그램으로 읽어내는 것
하지만 할 수 없기 때문에 1개씩의 카운트 표시는 할 수 없게 됩니다.
즉, 프리스케이라를 8 카운트 동작과 지정하면(자), 8 카운트 단위
그리고 밖에 표현할 수 없게 됩니다. 프리스케이라는 8비트 카운터
되고 있으므로, 최대 256 카운트의 프리스케이르를 할 수 있습니다.
프리스케이르의 동작 지정은 OPTIN 레지스터의 PS0, 1,2의 3비트로 행
있습니다. 2,4,8,16,32,64,128,256의 8방법의 프리스케이르치가 지정으로
옵니다.
·TMR0:카운터 본체
내부 카운터 본체로, 8비트의 카운터입니다. 따라서 이만큼이라면
256 카운트가 최대치라는 것이 됩니다.
프리스케이라의 최대와 배합해 16비트 즉 65,535 카운트가 최대
값이 됩니다.
카운터에의 조건 설정등 했을 때에는 항상 TMR0는 제로 클리어 되고
. 또 카운터가 오버플로우 했을 때에는 오버플로우 훌라
그로서 INTCON 레지스터내의 T0IF 비트가"1"됩니다.
또 새치기를 허가하고 있으면 이 시점에서 새치기가 발생합니다.
이 T0IF 비트는 프로그램으로 CLEAR 할 때까지 1인 채를 보관 유지합니다.
따라서, 오버플로우 처리로 이것을 0 CLEAR 하지 않으면 다음의 오버
플로우를 모르게 됩니다.
【카운터의 성능】
PIC의 내부 카운터 동작이 얼마나 고속으로 동작할까는, 규격표로부터
아래와 같은님이 됩니다. 전제는 클락은 10 MHz로 합니다.
결론으로부터 하면(자), 프리스케이라 없음때는, 최대 2. 3MHz 프리스케이라
부착때는, 최대 18 MHz가 됩니다.
TMR0 카운터 본체 : 최소 펄스폭=(클락 사이클)+20nsec =420 nsec 주기=2. 38MHz
프리스케이라 본체 : 최소 펄스폭=50 nsec(전원 5 V)
=20 MHz
프리스케이라와 TMR0의 편성때
: 최소 펄스폭=((클락 사이클)+40nsec)/(프리스케이라치)
프리스케이라치 마다 계산하면(자)
=440/2=220 nsec=4. 54MHz
=440/4=110 nsec=9. 09MHz
=440/8= 55 nsec=18. 1 MHz(최대 동작치)
=440/16=27. 5 nsec=36.3MHZ>20MHz
【사상 카운터로 한다】
우선 카운터의 동작 모드를 설정하기 위한 초기설정으로부터 시작합니다.
【초기설정 루틴】
BSF STATUS, RP0 ;Set page 1
MOVLW 068H ;set to no prescale
MOVWF OPTION_REG ;OPTION register set
BCF STATUS, RP0 ;Set Page 0
CLRF TMR0 ;Clear TMR0
[OPTION 레지스터의 설정]
RBPU 0 :PORTB의 PullUp =없음
INTEDGE 1 :INT 새치기 신호의 엣지 =첫 시작
RTS 0 :입력의 선택 =RA4 핀 지정
RTE 0 :TMR0의 카운트 엣지 =첫 시작
PSA 1 :프리스케이라 유무 =없음
PS1~3 0 :프리스케이라치 =무지정
다음에 카운터 결과를 독 붐비는 방법입니다.
TMR0만이라면 8비트 카운터이므로 256 카운트가 최대 카운트수
입니다. 그러나, 오버플로우 플래그가 있으므로, 이것을 사용하면 프로그라
무로 오버플로우 플래그를 항상 감시하는 것으로 카운터의 아르바이트수
(을)를 임의에 확장할 수가 있습니다.
아래와 같은예는 BYTE0, 1의 2바이트의 카운터가 됩니다.
【오버플로우 플래그의 감시 루틴】
LOOP BTFSS INTCON, T0IF ;get overflow flag
GOTO SKIP ;goto not overflow
BCF INTCON, T0IF ;reset T0IF
MOVLW 1 ;count up data
GOTO NEXT
SKIP NOP ;dumy NOP
NOP
MOVLW 0 ;not count up data
NEXT ADDWF BYTE1, F ;BYTE1+T0IF
MOVF TMR0, W ;get TMR0
MOVWF BYTE0 ;set to BYTE0
GOTO LOOP
【주파수 카운터로 한다】
「일정시간(예를 들면 100 msec)만 외부 신호의 카운트를 한다.」라고 한다
일을 할 수 있으면, 주파수 카운터가 됩니다. 따라서, 외부에 게이트 회로
(을)를 마련해 일정시간을 PIC의 소프트웨어로 만들어 이 게이트의 여닫기를 제어
합니다.
그러나, 어려운 것은, 이 일정시간을 만들고 있는 동안에서도, 주파수 카운트는
함께 간단 없게 계속하고 있도록(듯이), 소프트웨어를 움직이지 않으면차라
안 되는 곳입니다.
【카운터 동작 루틴】
카운트 결과를 BYTE1~2의 3바이트에 격납한다. 프리스케이라 없음의
설정으로 전항의 초기설정과 같은 설정으로 한다. 100 msec의 일정시간만
카운트 하기 위한(해) 게이트가 비어 있는 시간을 프로그램 스텝수로
제어한다. 외부 게이트의 제어는 PORTB의 RB0로 가고 있다.
MESURE CLRF TMR0 ;counter reset
BSF PORTB, 0 ;open GATE
CLRF OVRFLW ;reset overflow flag
CALL LOOP ;(249996+2steps)
NOP ;dumy NOP (249999steps)
BCF PORTB, 0 ;close GATE(250000steps)
MOVF TMR0, W ;get TMR0
MOVWF BYTE0 ;set to BYTE0
RETURN
;오버플로우 감시, 카운트업
;일정시간의 확보(100 msec)
LOOP MOVLW 08DH ;loop counter 141
MOVWF LPCNT1
MESLP1 MOVLW 088H ;set counter 136
MOVWF LPCNT2 ;set counter
MESLP2 BTFSS INTCON, T0IF ;13 steps loop
GOTO DUMY1
BCF INTCON, T0IF ;reset T0IF
MOVLW 1 ;카운트업
GOTO NEXT
DUMY1 NOP ;dumy NOP
NOP ;같은 스텝수로 하기 (위해)때문에
MOVLW 0 ;카운트업 없음
NEXT ADDWF BYTE1, F ;BYTE1+T0IF
RLF BYTE1, W ;carry to d0
ANDLW 1 ;mask
ADDWF BYTE2, F ;BYTE2+Carry
DECFSZ LPCNT2, F ;check loop end
GOTO MESLP2 ;loop
NOP
MESLP3 DECFSZ LPCNT1, F ;(13*LPCNT2+5) *LPCNT1
GOTO MESLP1 ;(13*136+5)*141=249993-1
RETURN ;+2=249994
그런데 다음는 액정 표시기와의 접속과 그 제어 소프트에 대해입니다.