Pages: [1]   Go Down
Print
Author Topic: ขอคำแนะนำการใช้ function rand() ภาษา C โดยใช้ CCS Compiler หน่อยค$  (Read 16467 times)
0 Members and 5 Guests are viewing this topic.
We go
มาใหม่
*
Offline Offline

Posts: 7


« on: April 05, 2013, 05:03:58 PM »

งานของผมใช้โปรแกรม MPLAB ในการเขียน และใช้ CCS เป็น Compiler ครับ

การทำงานของโปรแกรมคือ ผมต้องการให้ PIC18F887 ทำการ Random output ใน portD

ซึ่งรูปแบบ Output ที่ผมต้องการมีอยู่ 8 รูปแบบคือ {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}

ผมต้องการให้ PIC ทำการ Random output ใน portD แค่ 8 รูปแบบนี้ ผมสามารถใช้ฟังก์ชั่น rand() ในการ Random รูปแบบได้ไหมครับ

แล้วผมต้องใช้ฟังก์ชั่นอะไรเพิ่มหรือเปล่าครับ

ขอบคุณครับ
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #1 on: April 05, 2013, 07:10:17 PM »

ใช้ฟังก์ชัน rand() กับ srand() ได้ครับ ดูคำสั่งใน Help ของ CCS
สร้างค่า {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80} เป็น array 0-7
โดยตั้งค่า Ran_MAX=7 แล้วนำค่าที่ได้ไปชี้มันออกมาก
Logged
Hanajiji
Jr. Member
**
Offline Offline

Posts: 19


Email
« Reply #2 on: April 06, 2013, 03:19:43 AM »

2ยกกำลัง(Rand()%8) แบบนี้ได้ป่าวคับ  Grin
Logged
We go
มาใหม่
*
Offline Offline

Posts: 7


« Reply #3 on: April 06, 2013, 07:49:14 AM »

ขอบคุณสำหรับคำแนะนำนะครับ พอดีตอนนี้อยู่ต่างจังหวัด

เดี๋ยวกลับไปผมจะลองทำดู แล้วจะมารายงานผลนะครับ Grin
Logged
We go
มาใหม่
*
Offline Offline

Posts: 7


« Reply #4 on: April 08, 2013, 12:11:13 AM »

ผมลองเขียนโค้ดแล้วครับเป็นประมาณนี้

#include <16F887.h>   
#include <STDLIB.H>
#fuses INTRC_IO,NOWDT,NOPROTECT,MCLR,NOBROWNOUT,XT
#use delay(clock=4000000)    //Set your clock speed

void main(){
   while(true){
   unsigned int i[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
         srand(10);
         i=rand();
         output_d(i);
         delay_ms(100);
   }
}

แต่ผลที่ได้มันเป็นไฟค้างที่ PORTD1,2,5 แบบในรูปด้านล่างครับ มันไม่ Random ผมต้องแก้ตรงไหนหรือเพิ่มส่วนไหนหรอครับ



ขอบคุณครับ
Logged
Hanajiji
Jr. Member
**
Offline Offline

Posts: 19


Email
« Reply #5 on: April 08, 2013, 12:46:18 PM »

ลองแบบของผมๆๆ
Logged
We go
มาใหม่
*
Offline Offline

Posts: 7


« Reply #6 on: April 08, 2013, 05:30:27 PM »

ลองแบบของผมๆๆ

ผมลองใส่ในบรรทัดนี้ ถูกรึเปล่าครับ เพราะผมลองไว้ที่อื่นมัน Build Fail หมดเลยอ่ะครับ

#include <16F887.h>   
#include <STDLIB.H>
#fuses INTRC_IO,NOWDT,NOPROTECT,MCLR,NOBROWNOUT,XT
#use delay(clock=4000000)    //Set your clock speed


void main(){
   while(true){
   unsigned int i[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
         srand(10);
         i=(rand()%8);
         output_d(i);
         delay_ms(100);
   }
}

แล้วผลที่ได้เป็นไฟค้างแบบรูปด้านบนเลย แหะๆ  Cry ผมควรทำไงดีครับ
Logged
Hanajiji
Jr. Member
**
Offline Offline

Posts: 19


Email
« Reply #7 on: April 08, 2013, 11:41:50 PM »

ของผม Xtal 20MHz นะครับ ถ้าเป็น 4 MHz ก็ลองปรับๆโค้ดดู โค้ดนี้ผมลองซิมแล้วได้ผล
Code:
#include <16F887.H> 
#include <MATH.H>
#include <STDLIB.H>
#fuses HS, NOWDT, BROWNOUT, NOPUT , NOLVP
#use delay(clock=20000000)  
#use fast_io(D)
void main()
{
   int i=0;  
   setup_adc(adc_off);
   set_tris_d(0x00);
   output_d(0x00);
   while(TRUE)
  {
      i = pow(2,rand()%8);
      output_d(i);
      delay_ms(1000);  
  }  
}
« Last Edit: April 08, 2013, 11:43:44 PM by Hanajiji » Logged
We go
มาใหม่
*
Offline Offline

Posts: 7


« Reply #8 on: April 09, 2013, 01:03:10 PM »

#include <16F887.H>
#include <MATH.H>
#include <STDLIB.H>
#fuses HS, NOWDT, BROWNOUT, NOPUT , NOLVP
#use delay(clock=20000000) 
#use fast_io(D)
void main()
{
   int i=0; 
   setup_adc(adc_off);
   set_tris_d(0x00);
   output_d(0x00);
   while(TRUE)
  {
      i = pow(2,rand()%8);
      output_d(i);
      delay_ms(1000);   
  } 
}

ทำได้แล้วครับ  Shocked ขอบคุณมากครับ

แต่ผมยังไม่ค่อยเข้าใจหลักการณ์ทำงานของโค้ดเลยครับ ผมจะศึกษาดูนะครับ  Grin
Logged
Hanajiji
Jr. Member
**
Offline Offline

Posts: 19


Email
« Reply #9 on: April 09, 2013, 01:30:09 PM »

ไม่มีไรมากคับค่าที่แรนด้อมอะไรมาได้ก้อตาม จะเอามาหารด้วยแปดแล้วหาเศษ เศษที่ได้จากการหารจะเป็น 0-7 แบบแรนด้อมโดยอัตโนมัติ

ลองเอา 2 ยกกำลัง 0 มาแปลงเปนฐาน 16 จะได้ 0x01
2 ยกกำลัง 1 ได้ 0x02
ถึง 2 ยกกำลัง 7 ได้ 0x80

ส่งออกพอรตจะได้ค่าอย่างที่ต้องการ จบแล่ว ห้าๆๆ สั้นมั้ย
Logged
We go
มาใหม่
*
Offline Offline

Posts: 7


« Reply #10 on: April 09, 2013, 08:13:03 PM »

อ่อ เป็นอย่างนี้นี่เอง คือเรา random ที่เลขยกกำลัง

แล้วแปลงจากที่ 2 ยกกำลังให้เป็นฐาน 16

เข้าใจแล้วครับ ผมคิดเท่าไหร่ก็คิดไม่ออก

จนมาตอนนี้เพิ่งกระจ่างครับ ตอนแรกผมคิดว่าต้องใส่โค้ดเยอะมาก

แต่ก็ทำออกมาไม่ได้ซักที ผมอยากคิดได้เร็วเหมือนคุณบ้างเลย

พอมีเทคนิคทำไงให้คิดได้ออกมาง่ายบ้างครับ Shocked
แล้วก็ขอบคุณทุกคำตอบครับ ช่วยผมได้เยอะมาก

ต่างจากเดิมที่ผมแทบไม่รู้เรื่องเลยครับ  Grin
Logged
Hanajiji
Jr. Member
**
Offline Offline

Posts: 19


Email
« Reply #11 on: April 11, 2013, 12:17:10 PM »

พื้นฐาน math ม.4 ลำดับและอนุกรม  Grin
Logged
Pages: [1]   Go Up
Print
 
Jump to: