2012-04-12 6 views
2

HiTech ANSI C 컴파일러 및 MPLAB v8.43과 함께 PIC18F14K50을 사용하고 있습니다. 지연 기능을 제외한 내 PIC 코드가 마침내 실행되고 작동합니다. 이것은 내 응용 프로그램에있어 중요합니다. 특정 주에서 지정된 밀리 초, 초 또는 분이 필요합니다.Delay on PIC18F

저는 약 2 주 동안이 문제에 대한 해결책을 찾으려고했지만 지금까지 실패했습니다. 내가 포기하고 루프 내에서 asm("nop");으로 지연 기능을 썼다. 그러나 이것은 예측할 수없는 결과를 가져온다. 반 초나 5 초 정도 기다리라고하면 충분히 정확하게 작동합니다. 그러나 내가 10 분 동안 기다리는 것과 같이 말하면, 지연은 약 10-20 초 동안 지속되고, 2 분 앤드 업은 500ms 지연보다 짧게 깜박입니다. 내가 말했듯이 내가 wait(30000)까지 wait(500)를 호출하는 경우 다음 내가 관심 해요 tolerence 내에서 30 초 지연 0.5 초 얻을 것이다,

#include <htc.h> 

__CONFIG(1, FOSC_IRC & FCMEN_OFF & IESO_OFF & XINST_OFF); 
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF); 
__CONFIG(3, MCLRE_OFF); 
__CONFIG(4, STVREN_ON & LVP_OFF & DEBUG_OFF); 
__CONFIG(5, 0xFFFF); 
__CONFIG(6, 0xFFFF); 
__CONFIG(7, 0xFFFF); 

void wait(int ms) 
{ 
    for (int i = 0; i < ms; i++) 
    for (int j = 0; j < 12; j++) 
     asm("nop"); 
} 

: 여기

내 설정 퓨즈 및 wait() 기능입니다 그러나 내가 wait(600000)라고 전화하면 내가 예상했던대로 10 분 지연을 얻지는 않지만 오히려 약 10-15 초이며 wait(120000)은 2 분 지연을주지 않고 오히려 빠른 깜박임을줍니다.

이상적으로는 __delay_ms() 함수가 작동하고 내 wait()에서 호출되고 싶습니다. 그러나이 작업을 성공적으로 수행하지 못했습니다. #include <delay.h>을 시도하면 MPLAB은 그런 파일이나 디렉토리가 없다고 불평합니다. delay.h를 내 HiTech 샘플에서 보면 DelayUs(unsigned char)이 정의되어 있고 extern void DelayMs(unsigned char)이 있는데,이 코드는 extern을 직접 내 C 코드에 넣으려고하면 링크 할 때 정의되지 않은 기호 오류가 발생합니다. .

짧은 지연에서 중간 지연 사이의 불일치와 긴 지연은 의미가 없습니다. 내가 가진 유일한 설명은 컴파일러가 NOP 등을 최적화했다는 것입니다.

내가 말했듯이, 위의 구성 퓨즈가있는 PIC18F14K50입니다. 필자는 PIC에 대한 많은 경험이 없지만이 설정을 고려할 때 4MHz로 실행되고 있다고 가정합니다.

도서관이나 매크로의 외부 기능이나 NOP가있는 손으로 직접 작성한 기능에 만족합니다. 내가 필요로하는 것은 1 분에 2 초 정도의 정확성 때문입니다.

답변

4

PIC는 16 비트 마이크로 컨트롤러입니까? 내 생각 엔 2^15 (32,767은 부호있는 16 비트 int의 최대 값) 이후에 오버플로되는 wait 값에 오버플로가 발생하는 것입니다.

+0

그럴듯한 소리입니다! 나는 코드를 업데이트하고 어떤 일이 일어나는지 살펴볼 것이다. – Ozzah

+0

감사합니다. 나는 그냥 기다리면서 wait (1000)를하는 wait_sec (int sec)를 썼다. 여러 번. :) – Ozzah

3

변수를 unsigned으로 변경하면 최대 65535ms까지 이동할 수 있습니다. 이보다 더 높은 값을 가지려면 매개 변수 유형으로 long을 사용해야하며 루프를보다 깊게 중첩시켜야합니다.

1

더 나은 장기적인 솔루션은 칩에 내장 된 하드웨어 타이머 중 하나를 사용하는 지연 기능을 작성하는 것입니다. 다른 인터럽트가 발생하고 일부 CPU 사이클을 사용하는 것과 같은 일이 있으면 오랜 기간 동안 NOP 지연이 정확하지 않습니다.