2014-01-11 3 views
1

멍청한 질문을 준비하십시오.내 PIC의 타이밍 지연

저는 방금 얻은이 새로운 PIC를위한 매우 간단한 코드를 작성하고 있습니다. 내가하려는 것은 LED를 깜박이는 것이다. 아래는 두 개의 코드 샘플입니다 - 첫 번째 작품은 두 번째 작품은 아니지만. 왜?? 나는 두 번째 문제를 볼 수 없다.

WORKS :

 while(1) 
{ 
    i=99999; 
    while(i--) { 
     LATAbits.LATA0 = 0; // set RA0 to logic 1 
    } 
    i=99999; 
    while(i--) { 
    LATAbits.LATA0 = 1; // set RA0 to logic 0 
    } 
}  

가 작동하지 않습니다 도움에 미리

 while(1) 
{ 
    LATAbits.LATA0 = 1; // set RA0 to logic 1 
    for(i=0;i<99999;i++) {} 
    LATAbits.LATA0 = 0; // set RA0 to logic 0 
    for(i=0;i<99999;i++) {} 
} 

감사합니다!

답변

0

이 시도 : 그들은 내부 실행 할 코드가 없기 때문에

while(1) 
{ 
    for(i=0;i<99999;i++) 
    { 
     LATAbits.LATA0 = 1; // set RA0 to logic 1 
    } 
    for(i=0;i<99999;i++) 
    { 
     LATAbits.LATA0 = 0; // set RA0 to logic 0 
    } 
} 

어쩌면 당신의 컴파일러가 최적화와 for 문을 무시한다. 내가 한 것은 이러한 문 안에 RA0 할당을 두어 컴파일러가 지연 루프를 유지하도록 강제하는 것입니다.

또한 컴파일러에 인수 -S을 전달하여 생성 된 어셈블리 코드를 확인하고 for 문이 제거되었는지 확인할 수 있습니다. -S 옵션은 ".S" 확장명을 가진 중간 파일을 생성합니다.

+0

네, 고마워요, 그 대답처럼 보입니다. 따라서 'for'루프에서 실행하기 위해 실제로 아무 것도하지 않는 코드가 필요하다면 asm ("NOP")과 같은 것을 사용할 수 있습니까? – edipo99

+0

필자는 어셈블리에서 직접 PIC 용 코드를 작성하므로이를 확인할 수 없습니다. 그것은 의미가 있지만, 아마 네, 예상대로 작동 할 것입니다. –

+0

어떤 컴파일러를 사용하고 있습니까? 아마도'__asm ​​__ ("NOP");'를 사용할 수는 있지만, 이것 모두에 대해서는 작동하지 않습니다. – DrRobotNinja

0
  1. i의 정의는 무엇입니까? char i? int i? long i?
  2. 어떤 PIC를 사용하고 있습니까?

int을 사용하는 경우 8 비트 PIC는 16 비트 int을 사용합니다.

그래서 무슨 일 :

// Try to stuff 99999 into 16-bits, but it becomes 34463 
i=99999; 

// Count-down from 34463 to zero 
while(i--) {} 

// Successfully exit delay 

반대로 :

// Count up from zero 
// Get to 65535 and then reset to zero 
// Never reach 99999 
for(i=0;i<99999;i++) {} 
// Never exit delay 

PICS는 32 비트하고 작동하기 시작하는지 경향이, 난에 대한 unsigned long int를 사용해보십시오.