การตั้งค่า Delay ใน MPLAB C18 C Complier Libraries

วันที่โพสต์: Jan 27, 2012 5:57:0 PM

การตั้งค่า Delay ใน MPLAB C18 C Complier Libraries

ในการใช้งาน Library ของ MPLAB C18 C Complier ในส่วนของ delay function ซึ่งถูกประกาศไว้ในไฟล์ delay.h  มีการใช้งานดังนี้ 

อันดับแรก ทำการ #include <delays.h> เข้ามาไฟล์ของเรา เพื่อร่วมในการ complie ก่อน โดยทำการประกาศ directive ไว้

ที่หัวของไฟล์ ต่อจาก header ไฟล์ p18cxxx.h

#include <p18cxxx.h>

#include <delays.h>

ภายในไฟล์ delays.h ประกอบไปด้วย

การประกาศฟังก์ชั่น 

void Delay1TCY( void );

void Delay10TCYx( unsigned char unit );

void Delay100TCYx( unsigned char unit );

void Delay1KTCYx( unsigned char unit );

void Delay10KTCYx( unsigned char unit );

คำอธิบาย 

ตัวอักษร 'x' แทนความหมายการคูณ ด้วย parameter ที่เราใส่เข้าไปในแต่ละฟังก์ชั่น 

ตัวอักษร 'TCY' แทนความหมาย รอบคำสั่ง 'instruction cycle' 

ค่าของ unit คือค่าที่เราต้องการให้เกิดการหน่วงเวลา โดยค่า unit มีค่าอยู่ระหว่าง 1 ถึง 255 

ตัวอย่างการคำนวณ 

หากเราต้องการที่จะหน่วงเวลา 5 ms เราจะต้องหาค่า unit หรือค่าตัวคูณกับ TCYx ที่อยู่ระหว่าง 1 ถึง 255 เพื่อเป็น parameter ของฟังก์ชั่น delay แต่เนื่องจาก PIC ทำงาน 4 clock ต่อ 1 คำสั่ง เพราะฉะนั้น เราจะต้องหาว่า ต้องใช้กี่ Cycle ถึงจะทำให้ PIC ไปทำการเรียกใช้คำสั่ง NOP() (คือไม่ทำอะไร เรียกเฉยๆ) กี่ครั้ง ถึงจะได้ 5 ms 

มาถึงตรงนี้ อาจจะงงๆ สักหน่อย ยกสมการมาใช้เลยหล่ะกัน 

TCY = (TimeDelay * Fosc) / 4

TCY = (5ms * 20MHz) / 4

TCY = 25,000

แต่เนื่องจาก unit มีค่าได้ไม่เกิน 255 เพราะฉะนั้น เราต้องตัวคูณหน้าชื่อฟังก์ชั่น delay ที่ทำให้ TCY = 25,000 ในที่นี้ ผมเลือก 1K

จะได้ว่า 1K x 25 จะได้  25,000 เพราะฉะนั้น 

Delay1KTCYx(25); จึงมีค่าเท่ากับ หน่วงเวลา 5 ms 

แล้วถ้าผมต้องการ หน่วงเวลา 500ms หล่ะ จะได้เท่าไหร่ ???

คำตอบก็คือ Delay10KTCYx(250); ครับ 

พูดง่ายๆ ก็คือ เลือกฟังก์ชั่นที่ต้องการ เพื่อไม่ให้ unit มีค่าเกิน 255 เพื่อให้ได้ TCY ที่เราต้องการ 

หมายเหตุ หากเราใส่ค่า unit เท่ากับ 0 มิได้หมายความว่า จะหน่วงเวลาเท่ากับ 0 วินาที นะครับ ถ้าเราใส่ unit เท่ากับ 0 ที่ฟังก์ชั่น delay ใดๆ 

จะเท่ากับ unit = 256 คูณกับฟังก์ชั่น delay เช่น Delay1KTCYx(0) จะเท่ากับหน่วงเวลาไป 2,560 cycles

ฟังก์ชั่นอื่นๆ ที่เหลือ ก็คำนวณเหมือนๆ กัน 

ปล. อาจจะมีคำถามว่า 20MHz มาจากไหน อันนี้ ก็มาจากบอร์ดทดลองของเราเลย ว่าตอนนี้ ใส่ Crystal เข้าไปค่าเท่าไหร่ ทั้งนี้ ต้องไม่เกินค่าที่ระบุ

ไว้ใน ดาต้าชีทด้วยนะครับ 

ตัวอย่างโค๊ดไฟกระพริบ ติดดับสลับกัน 500ms หรือ ครึ่งวินาที ของ PIC18F458 

#include <p18cxxx.h>

#include <delays.h>

#pragma config WDT = OFF

#pragma config OSC = HS // High speed crystal  on board 20MHz

#pragma config PWRT = OFF

#pragma config BOR = OFF

#pragma config LVP = OFF

void main(void)

{

TRISB = 0x00;

PORTB = 0x00;


while(1)

{

PORTB = 0x01;

Delay10KTCYx(250);

PORTB = 0x00;

Delay10KTCYx(250);

}

}

แล้ว ถ้าเราต้องการเอามาเขียนเป็น function หล่ะ (เพื่อให้เกิดความยืดหยุ่นในการนำไปใช้งาน) ก็ไม่ยากครับ 

นี่เป็นฟังก์ชั่นหน่วงเวลา แบบ millisecond (หนึ่งในพันวินาที) 

void delay_ms(unsigned int ms)

{

    while(ms--)

    {

        Delay1KTCYx(5);    

    }    

}

หวังว่า คงไม่ งง นะครับ ว่า Delay1KTCYx(5);   มาจากไหน ^^