타이머 0의 사용법(그 2)

【카운터로서 사용한다】

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


그런데 다음는 액정 표시기와의 접속과 그 제어 소프트에 대해입니다.


        목차 페이지로