2017-04-23 1 views
0

브레드 보드에 간단한 PIC16F18877 회로가 설치되어 있으며 루프가 무한 루프 인 while 번에서 성공적으로 깜박입니다. 루프를 실행하는 루프가 같은 코드를 넣으려고 시도했지만 LED가 계속 깜박입니다.마이크로 컨트롤러 프로그래밍 - 루프를 종료하지 않는 프로그램

내 코드 (XC8 컴파일러와 MPLAB는) :

#include <xc.h> 

#define _XTAL_FREQ 8000000 

int main() 
{ 
    TRISD1 = 0; 

    for (int i = 0; i < 5; i++) 
    { 
     RD1 = 1; 
     __delay_ms(500); 
     RD1 = 0; 
     __delay_ms(500); 
    } 

    return 0; 
} 

답변

5

은 어디 CPU가 main에서 반환에 뛰어 기대합니까? 또는 오히려, 당신이 무엇을 해야할지 말하지 않을 때 무엇을 기대합니까? 데스크톱 컴퓨터에서 프로그램은 일반적으로 OS로 돌아갑니다. - 임베디드 시스템에서는 아무 것도 없습니다.

아마도 대부분의 경우 main의 결과는 시작 코드로 돌아가고 결과적으로 처음부터 프로그램을 시작하는 재설정 벡터로 (우연히 또는 의도적으로) 다시 설정됩니다.

MCU를 실제로 "중지"하려면 "아무 것도하지 말 것"을 return 대신 무한 루프에 적용해야합니다. 그러나 이것은 MCU에 대한 일반적인 접근법이 아닙니다.

+1

하지 아마도, 확실히 "실행) (주의 끝에 도달하면, 컴파일러에 의해 추가 된 코드는 다시 점프 그런 다음 장치는 런타임 시작 코드와 main() 함수를 다시 실행합니다. " - 출처 : http://ww1.microchip.com/downloads/en/DeviceDoc/50002173A.pdf. – Unimportant

+0

@ 요즘 정말 확실한 무엇이 중요한가? – tofro

+0

죽음과 세금, 항상 그렇듯이. – Unimportant

0

여기에 운영체제가 없으므로 main에 대한 호출과 반환 대상을 표시하기 위해 디스 어셈블리를 표시 할 수 있습니까? 아니면 주 끝나기 전에 무한 루프를 걸면 ((1) 계속하는 동안) 5 번 깜박 거니?

1

while 루프를 추가 한 후 for 루프와 이상한 상황이 발생했습니다. for 및 while 루프를 동시에 실행하는 것으로 보입니다. 표시등이 정상적으로 깜박이며 깜박이고 깜박 거림이 거의 깜박입니다. 깜박임을 멈추지 않았습니다.

워치 독 타이머를 확인하십시오. 그것이 설정되어 있으면, mcu는 정해진 클럭 사이클 후에 재설정을하고 코드를 반복해서 실행합니다. CLRWDT()를 사용하여 워치 독 타이머를 리셋하거나 WDT를 끌 수 있습니다.

  1. 확인 PIC 구성 비트, 제대로 설정은 다음과 같습니다 은 내가보기 엔 예상대로 MCU가 수행되었는지 확인하기 위해 다음 단계를 통해 이동하는 것이 좋습니다? 마이크로 칩 프로그램 폴더/docs/chips의 설명서를 참조하십시오.
  2. 오실레이터가 올바르게 설정되었는지 확인하십시오.
  3. 데이터 시트를 읽고 포트가 올바르게 설정되었는지, 특히 아날로그 선택 레지스터를 사용하는 아날로그 포트가 올바르게 설정되었는지 확인하십시오.

는 (내 명성 미안, 언급 할만큼 높지 않다.)

관련 문제