마이크로 컨트롤러 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이되어야합니다.
문제의 원인과 매분마다 문제를 해결하는 방법을 알려주십시오. 감사합니다
멋져요 도움이 될 수있는, 아래 링크에서 설명했다. while 루프에서 하나를 제거하고 개선되면 알려주실 수 있습니까? – hackela
@hackela 너무 느린 동안 Cnt를 제거하면 값을 변경하는 데 10 초 이상 걸릴 수 있습니다. – user8768142
카운터를 두 번 증가시킬 수 없습니다. 올바른 방법은 while 루프 (주)에서 TOIF 플래그를 확인하고 타이머가 튀어 나오면 (타이머 인터럽트 기능에서는 더 이상 타이머를 다시 시작하지 않아야 함) 카운터를 증가시키는 것입니다. 또한 귀하의 계산에 동의하지만이 테스트를 위해 어떤 시계를 선택 했습니까? – hackela