16F628A จะเช็คความกว้างของพัลส์ มีแนวทางอย่างไรครับ

Started by jingjoks, January 26, 2015, 11:43:25 AM

Previous topic - Next topic

jingjoks

16F628A (Internal = 4MHz) จะเช็คความกว้างของพัลส์ มีแนวทางอย่างไรครับ คือ



     1.ถ้าพัลส์กว้าง 1 ms. แสดงเลข 1
     2.ถ้าพัลส์กว้าง 1.5 ms. แสดงเลข 2
     3.ถ้าพัลส์กว้าง 1.5 ms. แสดงเลข 3

ปล.ขอบคุณครับ

JENG

input capture ไม่ก็ interrupt คับ ของ pic มันตั้งขอบสัญญาณ trigger ได้ แต่ run 4mhz ไม่แน่ใจว่าเร็วพอกับงานนี้หรือป่าวนะ
สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

crywolf

ประมาณนี้แหละ

unsigned int capture_hi, pulse_hi;
bit start_capture;

void interrupt()
{
if(PIR1.CCP1IF)
{
PIR1.CCP1IF = 0;

switch(start_capture)
{
case 0: //if 1st rising edge reset TIMER1 to 0
TMR1L = 0;
TMR1H = 0;
CCP1CON = 0b0100; // Capture falling edge
start_capture = 1;
break;

case 1: //if 2nd falling edge calculate time
capture_hi = (CCPR1H << 8) + CCPR1L;
CCP1CON = 0b0101; // Capture rising edge
start_capture = 0;
break;
}
}
}

void main(void)
{
TRISB = 0X08; // Pin B3 set as CCP1 input   
CCP1CON = 0b0101; // Capture rising edge
T1CON = 0x01; // Timer1 (Prescale = 0)
PIE1.CCP1IE = 1; // enable interrupt capture
PIR1.CCP1IF = 0; // clear CCP flag
INTCON.PEIE = 1; // Enables all low-priority peripheral interrupts
INTCON.GIE = 1; // global interrupts

while(1)
{
pulse_hi = (capture_hi / 4); // Pulse Hi ( micro second )
}
}


jingjoks

ขอบคุณพี่ๆ มากๆ ครับ ขาสัญญาณเข้า ต่อกับขาไหนก้อได้ใช่มั้ยครับ

ขอบคุณครับ

jingjoks

ขอบคุณ พี่ crywolf มากครับ เห็นละครับ ว่าต่อขา B3 เดี่ยวลองก่อนนะครับพี่ ขอบคุณครับ

jingjoks

    พี่ crywolf  ผมใช้ ccs c ครับ ดูแล้วก้อไม่เข้าใจโปรแกรม  รบกวนพี่ช่วยอธิบายโค้ดแต่ละบรรทัด มันทำงานยังงัยจะได้มั้ยครับพี่   ขอบคุณครับ


unsigned int capture_hi, pulse_hi;
bit start_capture;

void interrupt()
{
if(PIR1.CCP1IF)
{
PIR1.CCP1IF = 0;

switch(start_capture)
{
case 0: //if 1st rising edge reset TIMER1 to 0
TMR1L = 0;
TMR1H = 0;
CCP1CON = 0b0100; // Capture falling edge
start_capture = 1;
break;

case 1: //if 2nd falling edge calculate time
capture_hi = (CCPR1H << 8) + CCPR1L;
CCP1CON = 0b0101; // Capture rising edge
start_capture = 0;
break;
}
}
}

void main(void)
{
TRISB = 0X08; // Pin B3 set as CCP1 input   
CCP1CON = 0b0101; // Capture rising edge
T1CON = 0x01; // Timer1 (Prescale = 0)
PIE1.CCP1IE = 1; // enable interrupt capture
PIR1.CCP1IF = 0; // clear CCP flag
INTCON.PEIE = 1; // Enables all low-priority peripheral interrupts
INTCON.GIE = 1; // global interrupts

while(1)
{
pulse_hi = (capture_hi / 4); // Pulse Hi ( micro second )
}
}

mcusysdev

Quote from: jingjoks on January 27, 2015, 04:53:21 PM
    พี่ crywolf  ผมใช้ ccs c ครับ ดูแล้วก้อไม่เข้าใจโปรแกรม  รบกวนพี่ช่วยอธิบายโค้ดแต่ละบรรทัด มันทำงานยังงัยจะได้มั้ยครับพี่   ขอบคุณครับ


unsigned int capture_hi, pulse_hi;
bit start_capture;

void interrupt()
{
if(PIR1.CCP1IF)
{
PIR1.CCP1IF = 0;

switch(start_capture)
{
case 0: //if 1st rising edge reset TIMER1 to 0
TMR1L = 0;
TMR1H = 0;
CCP1CON = 0b0100; // Capture falling edge
start_capture = 1;
break;

case 1: //if 2nd falling edge calculate time
capture_hi = (CCPR1H << 8) + CCPR1L;
CCP1CON = 0b0101; // Capture rising edge
start_capture = 0;
break;
}
}
}

void main(void)
{
TRISB = 0X08; // Pin B3 set as CCP1 input   
CCP1CON = 0b0101; // Capture rising edge
T1CON = 0x01; // Timer1 (Prescale = 0)
PIE1.CCP1IE = 1; // enable interrupt capture
PIR1.CCP1IF = 0; // clear CCP flag
INTCON.PEIE = 1; // Enables all low-priority peripheral interrupts
INTCON.GIE = 1; // global interrupts

while(1)
{
pulse_hi = (capture_hi / 4); // Pulse Hi ( micro second )
}
}


ชัดเจนแล้วครับในคำตอบที่ท่าน crywolf  ได้ตอบไว้....
ถ้าจะให้อธิบาย code ท่าน jingjoks ต้องไปอ่านไวยกรณ์ของและการเขียนโปรแกรมด้วยภาษา C นะครับ
แล้วสิ่งที่ต้องทำต่อไปคือศึกษา datasheet ของ Microcontroller นะครับ.....
การเขียนโปรแกรมอยากเก่ง code ต้องเริ่มต้นด้วยพื้นฐานและทำความเข้าใจกับภาษาที่เขียนก่อนนะครับ


po2indynakub

ผมขอความรู้เพิ่มเติมด้วยครับ พอดีผมเป็นมือใหม่หัดทำ ใช้เป็นแต่ CCS C อ่ะครับ อยากรู้วิธีเขียนคำสั่งของมันอ่ะครับ :) :) :)