หัวข้อ: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 12:35:00 am โปรแกรมนับ 4 หลัก ผมเอามาจากหนังสือ ดัดแปลงมานิดหน่อย
คือมันติดตรงที่ มันนับเร็วไปอ่ะครับ รบกวนพี่ช่วยคำนวณหาค่า Timer1 ให้หน่อยครับ i3,i4 คือหน่วยวินาที อยากให้มันนับเป็นวินาที และให้มันลดลงเรื่อยๆๆ PIC16f877 Crystal=10MHz #define digit1 portD.f0 #define digit2 portD.f1 unsigned char segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; int i1=5,i2=9,i3=2,i4=4; void interrupt() { i4--; if(i4<0) { i4=9; i3--; } if(i3<0) { i3=5; i2--; } if(i2<0) { i2=9; i1--; } if(i1<0)i1=0; TMR1H=0X0f; TMR1L=0x0e; PIR1.TMR1IF=0x0c; } void main() { trisB=0; trisC=0; trisD=0x00; trisE=1; T1CON=0x10; TMR1H=0x0f; TMR1L=0x0e; PIE1.TMR1IE=1; PIR1.TMR1IF=1; INTCON.PEIE=0x8b; INTCON.GIE=1; T1CON.TMR1ON=0; //if(portE.f2==1)i1++; while(1) { //if(portE.f2==0)i1++; digit1=0;digit2=1; portB=segment[i1]; portC=segment[i3]; delay_ms(50); digit1=1;digit2=0; portB=segment[i2]; portC=segment[i4]; delay_ms(50); } } อีกอย่างครับพี่ ผมอยากให้ portE รับค่าจากสวิตท์ แล้วเพิ่มค่าใน i2 ผมลองใช้คำสั่ง if ดูแล้ว มันก็ไม่ได้อ่ะ มันต้องใช้คำสั่งไหนและต้องพิมพ์ที่บรรทัดไหนของโปรแกรมครับ รบกวนหน่อยนะครับ (http://www.uppices.com/images/78855106433719438971.jpg) หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: JUB ที่ กันยายน 26, 2011, 01:03:18 am ทำไมพวง common อย่างนั้นล่ะครับ....
หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 01:28:30 am ตามหนังสือครับ แต่ว่ามันก็ซิมได้ นะครับ ต่อผิดหรอครับ >:(
หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 10:59:21 am อีกอย่าง ผมใช้โปรแกรม mikroC PRO เขียนโปรแกรมนี้ครับ คำนวณค่า timer1 ให้หน่อยนะครับ เอาหน่วงเวลา 1sec
หาดูตามเว็บแล้ว ดูไม่รู้เรื่องเลยไม่รู้นำค่าอะไรมาหาบ้าง และขอถามอีกอย่าง ผมเข้าใจว่า TMR1H:TMR1L คือการโหลดค่าเริ่มต้นการนับให้กับรีจิสเตอร์ มันจะต้องเปลี่ยน 2 ค่านี้ใช้ไหมครับถึงจะให้มันหน่วงเวลา 1 sec ตามที่เราต้องการ ช่วยชี้แนะหน่อยครับ หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: JUB ที่ กันยายน 26, 2011, 11:19:46 am มันเป็นไปไม่ได้หรอก 10mhz สเกล 1:8 สูงสุดได้แค่ 200 msec กว่าๆ....
หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 01:27:02 pm งั้นต้องเอา เท่าไหร่ครับ
หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: kiano♥ ที่ กันยายน 26, 2011, 02:50:07 pm ความถี่ 10Mhz แต่ละ Cycle มีคาบเวลา 100ns
PIC ทำงานที่ 4osc ต่อ 1 คำสั่ง ดังนั้น 1คำสั่งของ PIC จึงมีคาบเวลาเป็น 400ns TMR1 Module เป็นโมดูลขนาด 16 บิต มันจะนับไปเรื่อยๆ จนถึงค่า overflow ของมันคือ 65535 แล้วจึงกลับมาเริ่มนับ 0 ใหม่ ตอนที่มันเกิดการ overflow ถ้าเราตั้งการ interrupt ไว้มันก็จะกระโดดไปทำงานในฟังก์ชั่น interrupt ถ้าเราตั้ง Prescale value ของ TMR1 ไว้ที่ 1:1 นั่นคือ TMR1 นับเพิ่มขึ้น 1 ค่าจะใช้เวลา 400ns และ TMR1 overflow จะใช้เวลา 65535 x 400ns = 26,214,000ns หรือ 26,214us หรือ 26.214ms 1 วินาทีมี 1,000ms ดังนั้นใน 1 วินาที TMR1 จะต้องเกิดการ overflow ประมาณ 1,000/26.214 = 38 ครั้ง ต่อไปเราก็กำหนดตัวแปรในการเก็บค่า overflow ของ TMR1 เอาไว้ตัวอย่างเช่น temp ถ้าตัวแปร temp มีค่าเท่ากับ 38 นั่นก็คือ 1 วินาที เหมือนตัวอย่างที่ผมเขียนไว้ในหัวข้อ TMR0 แต่ในตัวอย่างนั้นผมกำหนดค่า Prescale value ของ TMR0 ไว้ที่ 1:256 หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 06:48:36 pm ขอบคุณครับ
หัวข้อ: Re: ช่วยแก้โปรแกรม ให้หน่อยครับ เริ่มหัวข้อโดย: Dumrong007 ที่ กันยายน 26, 2011, 09:20:33 pm นี้ที่ผมเขียนครับ
http://youtu.be/MuNZcmIlIr0 (http://youtu.be/MuNZcmIlIr0) เวลาต่อวงจรจริง มันจะกระพริบแบบนี้หรือเปล่าครับ ผมหน่วงเวลาได้แค่นี้ครับ ใส่ค่าTMR1H=0:TMR1L=0 1:8 เอาจากเว็บ http://eng-serve.com/pic/pic_timer.html (http://eng-serve.com/pic/pic_timer.html) ครับ |