พิมพ์หน้านี้ - ช่วยหน่อย timer0 ของ 16f877

LSVคลังสมองออนไลน์ "ปีที่14"

► อิเล็กทรอนิกส์ ► => ใช้งานPICด้วยภาษาASM => ข้อความที่เริ่มโดย: Dumrong007 ที่ กันยายน 25, 2011, 01:04:45 am



หัวข้อ: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 25, 2011, 01:04:45 am
 คือว่าผมอยากเขียนโปรแกรม CountDown Timer แสดงผล 7segment 4 หลัก
ผมไม่รู้ว่าจะกำหนดค่าเริ่มต้นการนับ ของ timer0 ยังไง มันต้องดูตรงไหน ในdata sheet ก็ดูไม่เป็น

ขอตัวอย่างโปรแกรมพร้อมคำอธิบายหน่อยครับ ของ 16f877 นะครับ พอดีแถวบ้านมีขายแต่เบอร์นี้ อีกอย่าง ขอที่กำหนดเวลาการนับได้ด้วยนะครับ 

ขอบพระคุณล่วงหน้าครับ thank2


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 25, 2011, 01:08:38 am
อีกอย่าง ขอเป็นภาษาซี นะครับ


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: kiano♥ ที่ กันยายน 25, 2011, 06:27:20 am
ดาต้าชีท http://www.es.co.th/Schemetic/PDF/PIC16F87X.PDF
อ่านหน้า 49 หมวดหัวข้อ TIMER0 MODULE

การใช้งาน TMR0 ต้องกำหนด register ดังนี้

- OPTION_REG REGISTER เพื่อกำหนดคุณสมบัติของ TMR0
- INTCON เพื่อกำหนด Interrupt จาก TMR0

แค่นี้มันก็จะทำงานนับเวลาแล้ว พอมันเกิดการ Overflow ก็จะมีการสั่งงานไปที่ Fanction Interrupt จากนั้นท่านต้องการให้มันทำอะไรก็กำหนดในฟังก์ชั่นนี้ เช่น เพิ่มค่าวินาทีขึ้น 1 ค่าเมื่อเกิดการ Interrupt

การศึกษาโปรแกรม Count Down ต้องเริ่มจากต่อไปนี้
- ตัวแปรแบบ Aray เพื่อเก็บข้อมูลการแสดงผลของจอ 7-Segment
- การต่อและการเขียนโปรแกรมควบคุม 7-segment แบบมัลติเพล็กซ์
- การใช้งาน Timer0 Module
- การเขียนโปรแกรมแบบ Interrupt Fanction

ถ้ายังเริ่มต้นไม่ถูกจริงๆ ขอแนะนำหนังสือ PIC Works Example and C Source Code
http://www.thaieasyelec.com/Education/Books/PIC-Works-Examples-and-C-Source-Code-Book.html


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 25, 2011, 12:01:26 pm
ขอบคุณครับ พี่


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 25, 2011, 03:09:05 pm
ไปไม่ถูกจริงๆ รบกวนพี่ช่วยเขียนโปรแกรมให้หน่อยครับ

ตามวงจรเลยครับ ใช้ 16f877 Crystal 10MHz
ใช้ Switch 3 ตัว
s1_start ต่อกับ portRD5
s2_+1 ต่อกับ portRD6
s3_-1 ต่อกับ portRD7

(http://www.uppices.com/images/23938786209204790169.jpg)

ไฟล์ทั้งหมด
http://www.tempf.com/getfile.php?id=1054573&key=4e7ee02ef2b19 (http://www.tempf.com/getfile.php?id=1054573&key=4e7ee02ef2b19)


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: kiano♥ ที่ กันยายน 25, 2011, 05:58:47 pm
จากพื้นฐานการต่อวงจรแล้ว ยังต้องศึกษาอีกเยอะ
ไฟล์ที่แนบมาประกอบด้วย

- ไฟล์โปรเจคทั้งหมดที่เขียนด้วย MikroC Pro
- ไฟล์วงจร เขียนด้วย Proteus (ตัว PIC ผมเซตไว้ที่ 1Mhz เพื่อคอมพิวเตอร์จะซิมการทำงานได้)

การทำงานของโค๊ดโปรแกรมคือ
แสดงตัวเลขขึ้นทีละ 1 ค่าต่อ 1 วินาที จาก 0000 ถึง 1000 โดยการนับด้วย TMR0 ลองโหลดไปศึกษาดู

http://www.4shared.com/file/x5vQY-9G/counter4digit.html


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 25, 2011, 07:37:53 pm
ขอบพระคุณเป็นอย่างสูงครับพี่


ขออีกหน่อยครับ

void show_display(void){   // scan display 4 digit
   char col1, col2, col3, col4;
   col1=count/1000;
   col2=(count/100)%10;
   col3=(count/10)%10;
   col4=count%10;

ไม่เข้าใจตรงนี้ครับ

เข้าใจว่า / หมายถึงหาร แต่ว่าทำไมต้องหาร 1000,100,10
แล้ว % หมายถึงอะไรครับ

ชี้แนะหน่อย


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: kiano♥ ที่ กันยายน 25, 2011, 09:39:17 pm
ตัวแปร count ถูกกำหนดเป็นแบบ 16 บิต มีค่าตั้งแต่ 0 ~ 65535 แต่ให้มันนับเลขแค่ 0 ~ 1000 นั่นก็คือ 4 หลัก
ตัวแปร col1 col2 col3 col4 คือตัวแปรของค่าที่จะแสดงผลแต่ละหลัก

ถ้าให้ตัวแปร count มีค่า 0962
col1 คือค่าของหลักพัน col1=count/1000;         ตัวแปร col1 จะมีค่าเท่ากับ 0962/1000=0
col2 คือค่าของหลักร้อย col2=(count/100)%10; ตัวแปร col2 จะมีค่าเท่ากับ 0962/100=09    09%10=9
col3 คือค่าของหลักสิบ col3=(count/10)%10;    ตัวแปร col3 จะมีค่าเท่ากับ 0962/10=096   096%10=6
col4 คือค่าของหลักหน่วย col4=count%10;        ตัวแปร col4 จะมีค่าเท่ากับ 0962%10=2

% คือตัวดำเนินการทางคณิตศาสตร์ ของพื้นฐานของภาษาซี หมายถึงการหารเอาเศษ


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 12:16:25 am
แจ่ม
ขอคุณครับพี่ thank2


หัวข้อ: Re: ช่วยหน่อย timer0 ของ 16f877
เริ่มหัวข้อโดย: yanyongs ที่ มกราคม 31, 2012, 12:47:25 pm
วิธีการต่อ sw น้า ใช้ไม่ได้ครับ
เวลา กด ตัวหนึง มันจะเป็นกด ทั้ง 3 ไม่แตกต่างครับ  ping!
ผมจะใส่ตัวอย่าง แต่ลงรูปไม่เป็น  sleep!!