ขอความกรุณาด้วยนะคับ มือใหม่อยากทำ ไฟวิ่งควบคุมความเร็วแบบปรับระดับได้ โดยใช้สวิชต์ 2 ตัว = ="

Started by gajidirdz, May 28, 2013, 10:31:00 PM

Previous topic - Next topic

gajidirdz

#include<16F877.H>
#FUSES NOWDT,NOPROTECT,NOLVP,HS
#USE delay(clock=10000000)
#USE fast_io(b)
#USE fast_io(a)
void main()
{
int i;
int t=1000;
   int led[4]={0x01,0x02,0x04,0x08};
set_tris_b(0X00);
set_tris_a(0xFF);

while(1)

{
   for(i=0;i<4;i++)
   {
if(input(PIN_A0)==1&&input(PIN_A1)==0)
{
               {
                  output_B(led);
                  delay_ms(t=t-100);
               }
}
if(input(PIN_A0)==0&&input(PIN_A1)==1)
{
      for(i=0;i<4;i++)
               {
                  output_B(led);
                  delay_ms(t=t+100);
               }
}
if(input(PIN_A0)==0&&input(PIN_A1)==0)
{

      for(i=0;i<4;i++)
               {
                  output_B(led);
                  delay_ms(t=t);
               }

}

}

}
}

ทำไม่ได้อะคับ ผู้รู้ช่วยชี้แนะที

RoLRoR

เริ่มแรก ตัวแปร t ประกาศเป็น int ใน ccs น่าจะเป็น int8 (8bit)
เก็บค่าสูงสุด ได้แค่ 255 ต้องประกาศเป็น int16 t=1000;
(ถ้าจำผิดต้องขออภัย)

ในเงื่อนไข if ใส่วงเล็บแยกแยกไว้ ดีกว่าครับ อย่างน้อยก็อ่านง่ายดี

ไม่แน่ใจว่าเพราะไม่ได้ใช้ tag code หรือเปล่า เลยไม่แสดง array i
output_b(led[i]);

ส่วนส่งค่าให้ฟังก์ชั่นหน่วงเวลา ใช้ "t=x" ในส่วนส่งค่าด้วยเลย ไม่น่าจะถูกครับ
ตัวแปรมีค่า 1000 อยู่แล้ว ใช้ + หรือ - กับ ค่าอื่นได้เลย
delay_ms(t-100);
delay_ms(t-100);
delay_ms(t+100);
delay_ms(t);


ปรับแก้ดูนะครับ โค้ดเดิมก็น่าจะทำงานได้แล้ว
ผมลองลดรูปดู เขียนแบบนี้ก็ได้นะ สั้นดี อันนี้ทำให้เผื่อไว้ดูน่ะครับ
#include<16F877.H>
#FUSES NOWDT,NOPROTECT,NOLVP,HS
#USE delay(clock=10000000)
#USE fast_io(b)
#USE fast_io(a)

void main()
{ int8 i;
int16 t=1000;
int8 led[4]={0x01,0x02,0x04,0x08};

set_tris_b(0x00);
set_tris_a(0xFF);

while(1)
{ for(i=0;i<4;i++)
{ output_b(led[i]);
if((input(PIN_A0)==1) && (input(PIN_A1)==0)) delay_ms(t-100);
else if((input(PIN_A0)==0) && (input(PIN_A1)==1)) delay_ms(t+100);
else if((input(PIN_A0)==0) && (input(PIN_A1)==0)) delay_ms(t);

}
}
}

gajidirdz

ยังทำไม่ได้เลยอ่าคับ กดสวิตช์แล้วไม่มีการเปลี่ยนแปลง

:'( :'( :'( :'(


RoLRoR

#include <16F877.h>
#FUSES NOWDT, HS, NOBROWNOUT, NOLVP
#use delay(clock=10000000,RESTART_WDT)
#USE fast_io(b)
#USE fast_io(a)

const unsigned char led[4]={0x11,0x22,0x44,0x88};

void main(void)
{ unsigned char i;
unsigned int16 t;

set_tris_b(0x00);
set_tris_a(0xFF);

while(1)
{ for(i=0;i<4;i++)
{ if((input(PIN_A0)==0) && (input(PIN_A1)==0)) t = 100;
else if((input(PIN_A0)==0) && (input(PIN_A1)==1)) t = 500;
else if((input(PIN_A0)==1) && (input(PIN_A1)==0)) t = 1000;
else t = 2000;

output_b(led[i]);
delay_ms(t);
}
}
}


ลองดูใหม่นะครับ ให้เวลาที่หน่วง แตกต่างกันมากๆ หน่อย
และ เพราะเขียนโปรแกรมแบบนี้ ตอนที่โปรแกรมทำงานวนลูปและหน่วงเวลา จะต้องกดสวิตช์ค้างไว้ตลอด ด้วยครับ

gajidirdz

Quote from: RoLRoR on May 29, 2013, 12:54:12 PM
#include <16F877.h>
#FUSES NOWDT, HS, NOBROWNOUT, NOLVP
#use delay(clock=10000000,RESTART_WDT)
#USE fast_io(b)
#USE fast_io(a)

const unsigned char led[4]={0x11,0x22,0x44,0x88};

void main(void)
{ unsigned char i;
unsigned int16 t;

set_tris_b(0X00);
set_tris_a(0xFF);

while(1)
{ for(i=0;i<4;i++)
{ if((input(PIN_A0)==0) && (input(PIN_A1)==0)) t = 100;
else if((input(PIN_A0)==0) && (input(PIN_A1)==1)) t = 500;
else if((input(PIN_A0)==1) && (input(PIN_A1)==0)) t = 1000;
else t = 2000;

output_b(led[i]);
delay_ms(t);
}
}
}


ลองดูใหม่นะครับ ให้เวลาที่หน่วง แตกต่างกันมากๆ หน่อย
และ เพราะเขียนโปรแกรมแบบนี้ ตอนที่โปรแกรมทำงานวนลูปและหน่วงเวลา จะต้องกดสวิตช์ค้างไว้ตลอด ด้วยครับ

แล้วถ้าอยากให้กดหนึ่งครั้งเพิ่มความเร็ว 1 ระดับ ผมต้องแก้ตรงไหนบ้างอะคับ

JENG

สามารถติดตาม electoday ได้ที่

Facebook
www.facebook.com/groups/coopmicro

Google+
https://plus.google.com/communities/103482067769375459277

☺☺☺ความรู้ และความฉลาด ไม่ใช่สิ่งเดียวกัน จะมีประโยชน์อะไร ถ้าฉลาดแต่อยู่ในกะลา☺☺☺

RoLRoR

Quote from: JENG on May 29, 2013, 01:44:27 PM
http://www.youtube.com/watch?v=BJ32zNHbRzw

source code
;D ไฟกระพริบเทพฯ  มัลติทาสเลยครับ 0;D
จะพยายามศึกษาโค้ดจากที่คุณ JENG ทำเหมือนกัน

#include <16F877.h>
#FUSES NOWDT, HS, NOBROWNOUT, NOLVP
#use delay(clock=10000000,RESTART_WDT)
#USE fast_io(b)
#USE fast_io(a)

const unsigned char led[4]={0x11,0x22,0x44,0x88};

void main(void)
{ unsigned char i;
unsigned int16 t_cnt, t=2000;

set_tris_b(0x00);
set_tris_a(0xFF);

while(1)
{ if(!input(PIN_A0)) // SW Chk
{ delay_ms(100); // SW Bounce Push
if(!input(PIN_A0)) // SW Double Chk
{ if(t > 1000) t = 1000;
else if(t > 500) t = 500;
else if(t > 100) t = 100;
else t = 2000;
}
while(!input(PIN_A0)); // SW Wait Pull
delay_ms(200); // SW Bounce Pull
}

if(--t_cnt == 0) // Counter Decrement
{ t_cnt = t; // Counter Reload
output_b(led[i]); // Output Data
if(++i > 3) i = 0; // Next Data
}

delay_ms(1); // Delay Period
}
}



::: เพิ่มเติม :::  ครับ ไม่ใช่ คับ (คับ = แน่นอก)  ;)
ที่ PIN_A0,A1 รับค่ากด SW ต่อ R-Pullup ไว้แล้วใช่ไหมครับ
ส่วนจะเพิ่มสวิตช์อีกตัว แยกเป็นเพิ่มค่าและลดค่า ก็น่าจะเพิ่มเองได้แล้วนะครับ