2017-12-05 5 views
0

마이크로 컨트롤러 PIC16F887과는 MicroC에 PORTB의 값을 반전하는 // 작업은 말한다 : PORTB를 반전하고 그것을 출력 포트를 만들 것입니다 모든에 SECOND이 역을 ON 할 것 쓰기 프로그램/일초 지연은 PIC16F887

unsigned cnt ; 

void interrupt(){ 
    if(TMR0IF_bit){ //if there is interrupt in timer0 
     cnt++;   //increase the counter 
     TMR0IF_bit=0; //reset the timer 
     TMR0 = 96;  //set the TMR0 to its default value 
    } 
} 

void main() { 
ANSEL = 0; 
ANSELH = 0; 
OPTION_REG = 0b00000100; //1:32 prescalar (last 3 bits are 100) 
INTCON = 0xA0;   //enable interrupt generated by TMR0 
TRISB = 0x00;   //make PORTB output port 
PORTB = 0xFF;   //set PORTB to 1s 
cnt =0;     //initialize counter 
TMR0 = 96;    //starting value of TMR0 

do{ 
if(cnt==391){   
PORTB = ~PORTB;  //invert PORTB 
cnt=0;    //reset the timer 
} 
cnt++;     //increase counter if its not 391 
}while(1); 
} 

중요 TMR0 = 96 시작 값과 256-96 = 160 옵션 : OFF를 주도 Diods

에 여기 내 코드 입니다 = 1시 32분 그래서 프리 스칼라 _REG 우리는 거의 1초 그들이 말하는로

2 000 000/32 (프리 스칼라) * 160 (256-96) = ~ 391 2M 원인 2M 지시에 가까운 값을해야 32 인 카운터가 391 에 도달하면 1 초 지연은 2M/32 * 160이되어야하지만, 8Mhz 시뮬레이션에서 1 초보다 훨씬 빠른 시간에 LED DIODS 역관을 시작하면 1 초 지연이 2M/32 * 160이되어야합니다.

문제의 원인과 매분마다 문제를 해결하는 방법을 알려주십시오. 감사합니다

+0

멋져요 도움이 될 수있는, 아래 링크에서 설명했다. while 루프에서 하나를 제거하고 개선되면 알려주실 수 있습니까? – hackela

+0

@hackela 너무 느린 동안 Cnt를 제거하면 값을 변경하는 데 10 초 이상 걸릴 수 있습니다. – user8768142

+0

카운터를 두 번 증가시킬 수 없습니다. 올바른 방법은 while 루프 (주)에서 TOIF 플래그를 확인하고 타이머가 튀어 나오면 (타이머 인터럽트 기능에서는 더 이상 타이머를 다시 시작하지 않아야 함) 카운터를 증가시키는 것입니다. 또한 귀하의 계산에 동의하지만이 테스트를 위해 어떤 시계를 선택 했습니까? – hackela

답변

0

PIC16F 시리즈의 데이터 시트를 살펴 보도록 제안합니다.

while 루프에서 cnt 증가분을 제거하면 10 초 이상 걸리며 클럭, TMR0 값을 분명하게 나타내며, 루프 값이 동기화되지 않았습니다. 간단한 타이머 구현을 위해

는 인터럽트와 while 루프에 두 번 카운터 CNT를 증가 당신

http://www.microcontrollerboard.com/pic-timer0-tutorial.html

에게 Sudhee

관련 문제