ช่วยแก้โปรแกรม ให้หน่อยครับ
LSVคลังสมองออนไลน์ "ปีที่21"
มีนาคม 29, 2024, 03:26:22 AM *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
 
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ช่วยแก้โปรแกรม ให้หน่อยครับ  (อ่าน 7395 ครั้ง)
Dumrong007
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 87


อีเมล์
« เมื่อ: กันยายน 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 ดูแล้ว มันก็ไม่ได้อ่ะ มันต้องใช้คำสั่งไหนและต้องพิมพ์ที่บรรทัดไหนของโปรแกรมครับ

รบกวนหน่อยนะครับ




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

JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #1 เมื่อ: กันยายน 26, 2011, 01:03:18 AM »

ทำไมพวง common อย่างนั้นล่ะครับ....
บันทึกการเข้า
Dumrong007
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 87


อีเมล์
« ตอบ #2 เมื่อ: กันยายน 26, 2011, 01:28:30 AM »

ตามหนังสือครับ แต่ว่ามันก็ซิมได้ นะครับ ต่อผิดหรอครับ Angry
บันทึกการเข้า
Dumrong007
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 87


อีเมล์
« ตอบ #3 เมื่อ: กันยายน 26, 2011, 10:59:21 AM »

อีกอย่าง ผมใช้โปรแกรม mikroC PRO เขียนโปรแกรมนี้ครับ  คำนวณค่า timer1 ให้หน่อยนะครับ เอาหน่วงเวลา 1sec

หาดูตามเว็บแล้ว ดูไม่รู้เรื่องเลยไม่รู้นำค่าอะไรมาหาบ้าง

และขอถามอีกอย่าง ผมเข้าใจว่า TMR1H:TMR1L คือการโหลดค่าเริ่มต้นการนับให้กับรีจิสเตอร์  มันจะต้องเปลี่ยน 2 ค่านี้ใช้ไหมครับถึงจะให้มันหน่วงเวลา 1 sec ตามที่เราต้องการ 

ช่วยชี้แนะหน่อยครับ
บันทึกการเข้า
JUB
Full Member
member
**

คะแนน81
ออฟไลน์ ออฟไลน์

กระทู้: 1157



« ตอบ #4 เมื่อ: กันยายน 26, 2011, 11:19:46 AM »

มันเป็นไปไม่ได้หรอก 10mhz สเกล 1:8 สูงสุดได้แค่ 200 msec กว่าๆ....
บันทึกการเข้า
Dumrong007
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 87


อีเมล์
« ตอบ #5 เมื่อ: กันยายน 26, 2011, 01:27:02 PM »

งั้นต้องเอา เท่าไหร่ครับ
บันทึกการเข้า
kiano♥
kiano555@gmail.com
กลุ่มสนับสนุนLSV+มีน้ำใจ
member
****

คะแนน337
ออฟไลน์ ออฟไลน์

กระทู้: 570


การให้น่าภูมิใจกว่าได้รับ Line ID : Tech64

kiano555@windowslive.com kiano555@yahoo.com
เว็บไซต์ อีเมล์
« ตอบ #6 เมื่อ: กันยายน 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
บันทึกการเข้า
Dumrong007
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 87


อีเมล์
« ตอบ #7 เมื่อ: กันยายน 26, 2011, 06:48:36 PM »

ขอบคุณครับ
บันทึกการเข้า
Dumrong007
member
*

คะแนน0
ออฟไลน์ ออฟไลน์

กระทู้: 87


อีเมล์
« ตอบ #8 เมื่อ: กันยายน 26, 2011, 09:20:33 PM »

นี้ที่ผมเขียนครับ

http://youtu.be/MuNZcmIlIr0


เวลาต่อวงจรจริง มันจะกระพริบแบบนี้หรือเปล่าครับ  ผมหน่วงเวลาได้แค่นี้ครับ ใส่ค่าTMR1H=0:TMR1L=0  1:8
เอาจากเว็บ http://eng-serve.com/pic/pic_timer.html ครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

Powered by MySQL Powered by PHP Powered by SMF 1.1 RC2 | SMF © 2001-2006, Lewis Media

lsv2555Please follow the new website at https://www.pohchae.com

Valid CSS!