2014-07-06 4 views
2

을 이해하지 마십시오 내가 가지고있는 다음 프로그램 ...는 ATmega32 타이머 지연 프로그램

"지속적으로 일부 지연 PORTB의 모든 비트를 전환하는 프로그램을 작성. 사용 타이머 0, 일반 모드,없이 프리스케일러 옵션을 선택합니다. " 은 "TODelay()"기능에

#include…. 
    void T0Delay() 
    int main() 
    DDRB= 0xFF; 
    while (1) { 
     PORTB=0x55; 
     T0Delay(); 
     PORTB=0xAA; 
     T0Delay(); 
    } 

void T0Delay() 
    { 
     TCNT0=0x20; 
     TCCR0=0x01; 
     while ((TIFR&01)==0); 
     TCCR0=0; 
     TIFR=0x01; 
    } 

"동안 ((TIFR & 01) == 0)"한 Statment의 기능은 무엇인가? 그리고 왜이 루프 설정은 TCCR0 = 0이고 TIFR = 0x01입니까? 누구나이 코드를 설명 할 수 있습니까?

답변

6

명세서 while ((TIFR&01)==0);은 전체 루프입니다. 뒤 따르는 두 명령문은이 루프의 일부가 아니며 루프가 완료된 후에 실행됩니다.

이 루프의 목적은 TIFR의 최하위 비트가 설정 될 때까지 대기하는 것입니다. 아마도 이것은 어딘가에서 휘발성 정수로 선언되고 제어 입력 포트의 주소에 매핑됩니다 (그렇지 않으면이 루프가 종료되지 않습니다).

+0

올바른 반환합니다. 각 플래그는 타이머가 만료되면 1로 설정됩니다. AVR 인터럽트 플래그는 레지스터에 1을 기록하여 클리어 (0으로 설정)됩니다. Thts는'TIFR = 0x01'을위한 것입니다. –

0

루프로 전체 라인을 확인하십시오. 세미콜론으로 끝나지 않습니까? 즉, 루프 본문은 빈 문이고 루프에 대한 내용입니다.

할당은 루프의 일부가 아닙니다.

2

while ((TIFR&01)==0);은 통화 대기 루프입니다. 타이머가 만료됨을 나타내는 플래그가 1로 변경 될 때까지 루프를 계속합니다. 그 다음에 만 플로우가 루프를 종료합니다.

TIFR=0x01;은 특별한 지침입니다. 실제로 플래그를 지 웁니다. 즉, 예상대로 플래그를 0이 아닌 1으로 설정합니다.

지연 기능은 타이머 카운트를 설정하고 타이머를 시작한 다음 타이머가 끝날 때까지 루프에서 대기합니다. 그런 다음 타이머 플래그를 지우고 타이머를 다시 사용할 수있게합니다. while 루프가 확인하고 타이머가 오버 플로우를 기다리는 유지

0

는, 타이머 오버 플로우되면, TIFR은 "타이머 인터럽트 플래그가 등록"입니다, 다시 타이머를 설정하고,