2012-04-23 1 views
1

기본적으로 pic16f84a 마이크로 컨트롤러의 그림 외부 인터럽트에 대해 배우고 있습니다. 기본적으로 핀 B0 (RB0/T0CKI)에 부착 된 버튼을 누를 때마다 카운트하고 7 세그먼트 디스플레이의 결과를 표시하려고합니다. 나는 hitech c 컴파일러를 사용하고있다. 내가 테우스 VSM이 코드를 시뮬레이션 할 때 그림 16f84a 타이머/카운팅 코드가 예상대로 작동하지 않습니다.

#include<htc.h> 
__CONFIG(WDTE_OFF& PWRTE_OFF & CP_OFF); 
char get7SegmentCode(char value) 
{ 
    switch(value) 
    { 
     case 0b00000000: 
      return (char)0b00111111 ; //0 code 
     case 0b00000001: 
      return (char)0b00110000 ; //1 code 
     case 0b00000010: 
      return (char)0b01011011 ; //2 code 
     case 0b00000011: 
      return (char)0b010011111 ; //3 code 
     default: 
      return (char)0b00000000 ; //all code 
    } 
} 
void main() 
{ 
    //declare portb for output and porta upper 4 pins for output and lower 4 for input 
    TRISA=0b00001111; 
    TRISB=0b00000000; 
    CLRWDT();//clear watchdog timer 
    TMR0=0; 
    OPTION_REG = 0b00111000;//RBPU:PORTB pull-ups are disabled, 
    //INTEDG:Interrupt on falling edge of RB0/INT pin 
    //T0CS:Transition on RA4/T0CKI pin 
    //T0SE:Increment on high-to-low transition on RA4/T0CKI pin 
    //PSA:Prescaler assigned to the WDT 
    while(1) 
    { 
     char timerval= TMR0;//read tmr0 into variable 
     char restrictedtimerval= timerval & 0x0f;//force upper 4bits to zero to restrict value to 0 - f 
     PORTB= get7SegmentCode(restrictedtimerval); 
    } 
} 

는 불행하게도, 7 개 세그먼트 디스플레이는 상관없이 내가 스위치를 눌러 얼마나 많은 시간을 '0'을 보여줍니다. 왜 이런 일이 일어나는 걸까요? 추신 : 이것은 내 회로입니다. circuit

답변

1

RA4/T0CKI 포트 A. 의 다섯 번째 비트라는 이름의 RA4 그래서 당신의 개시 코드 대신

TRISA=0b00011111; 

TRISA=0b00001111; 
이어야합니다