พิมพ์หน้านี้ - ช่วยแก้โปรแกรม ให้หน่อยครับ

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

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



หัวข้อ: ช่วยแก้โปรแกรม ให้หน่อยครับ
เริ่มหัวข้อโดย: 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) ครับ