PIC16F628A ต้องการเขียนคำสั่งนับเวลาถอยหลัง

Started by empire2008, February 16, 2014, 09:25:52 AM

Previous topic - Next topic

empire2008

Quote from: pa_ul on February 17, 2014, 01:32:01 AM
ตามโค้ดที่ให้มาก็ดูตรงไปตรงมา ไม่ซับซ้อน ซึ่งถ้าจับเวลาการติดดับของ LED ได้ประมาณติด 2 วินาทีดับ 2 วินาทีจริงๆ ก็ไม่น่ามีปัญหาในการจับเวลา 8 ชั่วโมง ซึ่งแน่นอนว่าอาจจะไม่ได้ 8 ชั่วโมงป๊ะๆ อาจจะผิดไปเล็กน้อยไม่กี่นาที แต่ไม่มีทางผิดไปมากจนเหลือแค่ 2 ชั่วโมงแน่ๆ ครับ ปัญหาน่าจะเป็นเรื่องอื่นมากกว่า เช่นเครื่องเกิดรีเซ็ทตัวเอง หรือ ฯลฯ

ผมก็งงเหมือนกันครับ แต่ตอนนี้ลองใส่คำสั่งลง PIC ใหม่ มันไม่จ่ายทุก 2ชั่วโมงแล้ว แต่กี่ชั่วโมงผมไม่แน่ใจ เพราะไม่อยู่ตอนรดน้ำซักกะที กลับมาอีกทีเมล็ดก็เปียกเรียบร้อยแล้ว

pvic


       เรียก Delay แบบมากๆๆๆ แบบนี้มันไม่ตรงอยู่แล้วครับ ( Compiler  ตัวไหน )
ลองไปหาดูจาก Key World เหล่านี้

-  Clock Microchip
-  Low Cost Clock Microchip
-  AN615




ozuke

ใช้พวก RTC ดีกว่าครับพวก DS1307 หน่ะครับ แล้วอ่านเทียบเวลาเอา
วันนี้ 8 ชม. อาจจะนับแม่น แต่อย่าลืมว่ามันทุกวันมันคลาดเคลื่อนได้ครับ
ถึงงานจะไม่จำเป็นขนาดนั้นแต่ผมว่า ทำแล้วได้ความรู้นะครับ โค้ดการใช้งาน PIC
ใน CCS ก็มีครับ ในเน็ตคนโพสไว้ก็มีครับลองหาดูครับ [PIC CCS DS1307]ลองใช้ key word พวกนี้หาดูนะครับ  ;D
โชคดีครับ


amaloma

8 ชั่วโมงเท่ากับ กี่ วินาที่ ต้องใช้ตัวแปรกี่ bit
led ติด 1 วิ ดับ 1 วิ กี่รอบ เท่ากับ 8 ชั่วโมง

รด1นาที หยุด1นาที
รด1นาที หยุด1นาที
รด1นาที หยุด1นาที
รด1นาที หยุด1นาที

แค่นี้ครับ
แล้วตอนทดลอง เอาแค่ 8 นาทีพอนะ
8 ชั่วโม รอกันเมื่อย

nightbird

ปรีสเกลเลอร์ทำฐานเวลา1วินาที เขียนโปรแกรมนาฬิกา8ชั่วโมง(ดัดแปลงจากนาฬิกา12/24ชั่วโมง)ไม่ต้องมีดีสเพลย์(หรือจะแสดงเป็นLEDแปดดวงๆละชั่วโมง) เริ่มวินาทีแรกเมื่อเสียบปลั๊กครบ8ชั่วโมงสั่ง รด1นาทีเว้น1นาที ทำแบบนี้4รอบ...วนกลับไปนับแปดชั่วโมงใหม่ ผมว่าความแม่นสูสีกับDS1307.......ตอนทดลองใส่ค่า10นาทีก็พอครับแทน8ชั่วโมงนานรอไม่ไหว^^

RoLRoR

void main(void)
{
unsigned char i;
unsigned char cnt_hour = 0;
unsigned char cnt_min = 0;
unsigned char cnt_sec = 0;

for(;;)
{ _tick_ms(1000);
output_toggle(PIN_B0);

if(++cnt_sec > 59)
{ cnt_sec = 0;
if(++cnt_min > 59)
{ cnt_min = 0;
if(++cnt_hour > 23)
{ cnt_hour = 0;
}
}
}

if((cnt_hour == 0)||(cnt_min == 0)||(cnt_sec == 0))
{ for(i=0; i<4; i++)
{ output_high(PIN_B1); delay_ms(60000);
output_low(PIN_B1); delay_ms(60000);
} cnt_min += 8;
}
else if((cnt_hour == 8)||(cnt_min == 0)||(cnt_sec == 0)
{ //...
}
else if((cnt_hour == 16)||(cnt_min == 0)||(cnt_sec == 0))
{ //...
}
else
{ if(input(PIN_B1))  output_low(PIN_B1);
}
}
}


แบบบ้านๆ พอเป็นตัวอย่างครับ :D
ลองไปเขียนเพิ่มแสดงเวลาและตั้งเวลาได้ จะได้รุู้ว่าเครื่องกำลังทำงานปกติอยู่
ช่วยตรวจสอบการทำงานได้ง่ายขึ้นครับ.

boe

ผมว่าใช้ timer interupt น่าจะดีกว่าน่ะ เพราะเราจะเสียเวลาตอน loop program ในกรณีไม่ใช้ ทำให้เกิดเวลาผิดพลาดสะสมได้ง่าย เคยทำรดน้ำต้นไม้เหมือนกัน interrupt ก็ค่อนข้างตรงกว่า แต่ห้ามไฟดับหรือต้องมีแบตเตอรี่สำรอง
ไม่มีความยากจน ในหมู่คนขยัน