กันยายน 20, 2018, 06:37:55 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: การคำนวณ Timer ของตระกูล MCS-51 เพื่อสั่งให้ Interrupt----1  (อ่าน 17864 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
MANOP_L
บุคคลทั่วไป
| |
« เมื่อ: มีนาคม 04, 2010, 11:27:29 am »

     สำหรับผู้ที่เริ่มเขียนโปรแกรมส่วนใหญ่ก็จะเขียนโปรแกรมเป็น Input แล้วก็สั่งออกเป็น Output แล้วก็ผ่านวงจร Drive ต่างๆ   แต่สิ่งที่จำเป็นอีกอย่างก็คือ เมื่อสั่งให้ทำงานแล้วเราจะสั่งให้มันหยุดเมื่อไหร่ เป็นเวลาเท่าไหร่ หรือว่าเอาไปจับสัญญาณว่ามีความกว้างเท่าไหร่ก็ได้
ดังนั้นการคำนวณเวลาเพื่อจะได้รู้ว่าเป็นเวลาเท่าไหร่จึงเป็นสิ่งสำคัญ
       
            เกริ่นมาพอสมควรแล้วก็เริ่มคำนวณกันเลยดีกว่า
- เราต้องรู้ก่อนว่า MCS-51 ของเรา  ใช้ machine cycle เท่าไหร่  ยกตัวอย่าง 12 machine cycleนะครับ(โดยปกติ mcs-51 ใช้ 12  machine cycle ต่อ 1 คำสั่ง อยู่แล้ว หมายถึง ใช้สัญญาณความถี่นาฬิกาจาก crystal หรือจากวงจรผลิตความถี่อะไรก็แล้วแต่ ได้ 12 ลูกคลื่น mcs-51 ถึงทำงาน 1 คำสั่ง)
- เราต้องรู้ว่า crystal หรือวงจรผลิตความถี่ ที่เราใช้ มีความถี่เท่าไหร่  ยกตัวอย่าง  29.4912 MHz ( เราต้องดู data sheet ของ mcs-51 แต่ละเบอร์ด้วยนะครับว่ารองรับความถี่ใช้งานได้เท่าไหร่ แล้วทำไมพวก crystal ถึงมีเศษ 0.4912 แบบนี้ด้วยมีคนถามเยอะครับ คำตอบก็คือเพื่อให้มัน set เป็น usart ที่ตรงกับความถี่ 9600,19200,115200 bit/s ได้ง่ายๆ )

วิธีคิด             f = 29.4912 MHz/12
                   = 2457600Hz

                t = 1/f
                  =  1/2457600
                  =  0.4069 uS

เมื่อเรารู้แล้วว่า mcs-51 ของเรามีความเร็วในการทำงานต่อ 1 คำสั่ง = 0.4069 uS

- เราก็มาคิดต่อว่า เราต้องการ 1 tick จะให้ทำงานเท่าไหร่ (ใช้ timer 2  16 bit auto reload นะ)

ยกตัวอย่าง  ต้องการ  10  ms

                          10mS /0.4069uS = 24576
                         65536-24576= 40960----> แปลงเป็นเลขฐาน 16 จะได้ A000 ( 65536 มาจากฐาน16ของ 0xFFFF)

ตัวอย่างการเขียนโปรแกรมด้วยภาษาซี
                         void Timer2Initial(void)
                                {
                            TH2=0xa0;
                          TL2=0x00;
                            RCAP2H=TH2;
                            RCAP2L=TL2;
                            ET2=1;
                            TR2=1;
                                }


บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #1 เมื่อ: มีนาคม 04, 2010, 12:08:03 pm »

เขียนได้ดีครับ  
ผมเปลียน user permission ให้เป็น Global Moderator ให้แล้วนะครับ ตอนเขียนบทความจะได้ง่ายขึ้น
หลังจากผมจัดการระบบเรียบร้อยแล้ว จะเปิด sub-domain ให้นะครับ จะได้สะดวกมากยิ่งขึ้น

ขอเสนอทางเลือกสำหรับการแสดง code ครับ ให้คลิกปุ่มที่มีเครื่องหมาย # code จะเป็นระเปียบขึ้นครับ เช่น


Code:
int main(void)
{
   return 0;
}

รอติดตามตอนต่อไปอยู่ครับ
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
taro
บุคคลทั่วไป
| |
« ตอบ #2 เมื่อ: มีนาคม 01, 2011, 09:34:46 am »

เข้ามารออ่าน ด้วยคนครับ  ;D ;D
บันทึกการเข้า
oanzaa111
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #3 เมื่อ: พฤษภาคม 18, 2011, 12:59:26 pm »

ถ้า หน่วงเวลา โดยใช้ timer/counter เป็นเวลา 1 นาที จะทำอย่างไรครับ ภาษา C นะครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #4 เมื่อ: พฤษภาคม 18, 2011, 01:27:16 pm »

อ้างถึง
ถ้า หน่วงเวลา โดยใช้ timer/counter เป็นเวลา 1 นาที จะทำอย่างไรครับ ภาษา C นะครับ
สมมุติว่ากำหนดการทำงานของ Timer/Counter ไว้ให้ Overflow ทุกๆ 1mS
การ Overflow นี้จะต้องเกิดขึ้น 1,000 ครั้ง ถึงจะได้ 1 วินาที (1,000mS = 1S)
จะต้องเขียนโปรแกรมประมาณนี้:

Code: (c)
unsigned short cnt = 1000;
TRx = 1;
while(cnt--){
    TFx = 0;
    while(!TFx);
    // Reload ค่าของ Timer ถ้าไม่ได้กำหนดเป็น auto-reload
}
TRx = 0;

ในทางปฏิบัต เวลาที่ได้จะมากกว่า 1 วินาทีเล็กน้อย (เศษเสี้ยว) หากต้องการความเที่ยงตรงสูงต้องทำการชดเชย
โดยการคำนวณเชิงลึก หรือไม่ก็ใช้ Simulator เข้ามาช่วยครับ



บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
oanzaa111
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #5 เมื่อ: พฤษภาคม 26, 2011, 11:46:40 am »

ขอบคุณมากครับ พอดีไม่ได้เข้ามานาน เพราะไปศึกษาอยู่ครับ
บันทึกการเข้า
x-glove
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #6 เมื่อ: ตุลาคม 29, 2013, 06:34:19 pm »

" ในทางปฏิบัต เวลาที่ได้จะมากกว่า 1 วินาทีเล็กน้อย (เศษเสี้ยว) หากต้องการความเที่ยงตรงสูงต้องทำการชดเชย
โดยการคำนวณเชิงลึก หรือไม่ก็ใช้ Simulator เข้ามาช่วยครับ "

อันนี้ต้องคำนวนยังไงครับ   รบกวนขอคำแนะนำหน่อยนะครับ Simulator ตัวที่ว่านี้คือโปรแกรมอะไรครับ   หรือว่าต้องเขียนเป็น assembly เลยมันถึงจะเที่ยงตรง   แล้วถ้าจะแทรก assembly ลงใน C ต้องเขียนยังไงครับ Compile มันถึงจะรู้ครับ   ผมใช้ keil uvision 4 ใช้ MCU P89C51RD2   XTAL = 18.432 MHZ ครับ

***ถ้าถามผิดหรืออ่านคำถามแล้วงงยังไงต้องขอโทษด้วยนะครับ   ความรู้ทางด้านไมโครผมค่อนข้างน้อยยังไงคงต้องขอรบกวนด้วยนะครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #7 เมื่อ: พฤศจิกายน 01, 2013, 12:08:58 pm »

อ้างถึง
อันนี้ต้องคำนวนยังไงครับ
 
พิจารณาในระดับ Instruction code ครับ

อ้างถึง
รบกวนขอคำแนะนำหน่อยนะครับ Simulator ตัวที่ว่านี้คือโปรแกรมอะไรครับ
ตัวไหนก็ได้ครับ ขึ้นกับ Development Tool และ MCU ที่ใช้

อ้างถึง
หรือว่าต้องเขียนเป็น assembly เลยมันถึงจะเที่ยงตรง

ไม่มีความจำเป็นครับ ตอนเขียนเขียนด้วย C ได้ แต่ตอนวิเคราะห์จริงจัง ต้องพิจารณาจาก ASM ที่ C-Compiler สร้างขึ้นมา

อ้างถึง
แล้วถ้าจะแทรก assembly ลงใน C ต้องเขียนยังไงครับ Compile มันถึงจะรู้ครับ
Development Tool ทุกตัวในโลกของ Embedded Systems สามารถแทรก ASM ลงใน C ได้ครับ ทำอย่างไร ต้องอ่านจากคู่มือของ Tool ตัวนั้นๆ
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
x-glove
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #8 เมื่อ: พฤศจิกายน 01, 2013, 02:32:24 pm »

พอจะอธิบายหรือยกตัวอย่างการวิเคราะห์หรือการคำนวนให้ดูได้ไหมครับ   จริงๆแล้วผมก็อยากทำให้มันตรงที่สุดด้วย   แต่ยังไงก็ขอบคุณมากนะครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #9 เมื่อ: พฤศจิกายน 02, 2013, 06:01:48 pm »

ตัวอย่างดูได้จาก ASM ที่คุณมีอยู่ แล้วตั้งคำถามเพื่อหาคำตอบว่า แต่ละคำสั่งเหล่านั้นใช้เวลานานเท่าไหร่
เช่น code นี้เป็นต้น

Code:
PUSH    PSW
MOV     PSW,#08H
PUSH    ACC
MOV     R1,data_variable
MOV     DPTR,#xdata_variable
MOVX    A,@DPTR
ADD     A,R1
MOV     data_variable1,A
CLR     A
ADD     A,#0
MOV     data_variable1+1,A
POP     ACC
POP     PSW
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
x-glove
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 6


| |
« ตอบ #10 เมื่อ: พฤศจิกายน 02, 2013, 08:05:07 pm »

เดี๋ยวจะลองไปอ่านๆมาซักหน่อยนะครับ
บันทึกการเข้า
domer2530
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #11 เมื่อ: กรกฎาคม 16, 2015, 09:05:04 am »

ขอบคุณครับ บทความนี้มีประโยชน์มาก

เพราะปกติผมจะใช้ for วนลูปเพื่อหน่วงเวลา แต่ไม่สามารถกำหนดเวลาที่แน่นอนได้
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: