Pages: [1]   Go Down
Print
Author Topic: มีเรื่องให้ช่วยหน่อยคับผม T_T  (Read 13067 times)
0 Members and 2 Guests are viewing this topic.
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« on: February 12, 2013, 11:37:14 AM »

ช่วยดูให้ทีนะคับ
ว่าทำไมพอต่อใช้งานจริงแล้วมันสามารถ อินพุต portA ใช้ได้แค่ pinA0,A1,A2,A3  และทำไม Output แสดงผล ออกได้แค่ pin B0 ,Pin B3 อะคับ
ผมลองย้ายไป Pin B2,B4,B5,B6,B7,B8 ดูแล้ว แต่ output ไม่ออกอะคับ

ช่วยแนะนำทีคับ
ผมใช้ PIC เบอร์ 16f88 คับ

นี่เป็นโค็ดนะคับ


#include <16F88.h>         // Standard Header file for the PIC16F877A
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP   

#use delay(clock=10000000)   
#define vbe 0.0048875855327468230694037145650049 // Vref/1023 ;Vref = 5 volt
float ldr1,ldr2,ldr3,ldr4,vldr1,vldr2,vldr3,vldr4;

void main(void)
{
    setup_adc_ports(all_analog);
    setup_adc(adc_clock_internal);
 
    while(TRUE)
 {
    set_adc_channel(0);
    delay_us(10);
    ldr1 = read_adc();
    vldr1 = vbe * (float)ldr1;
    if(vldr1>2)
      {
      output_high(PIN_B0);
      }else{output_low(PIN_B0);}
    //_______________________________________________________________

    set_adc_channel(1);
    delay_us(10);
    ldr2 = read_adc();
    vldr2 = vbe * (float)ldr2;
    if(vldr2>2)
    {
    output_high(PIN_B1);
    }else{output_low(PIN_B1);}
   
    //______________________________________________________________
   
    set_adc_channel(2);
    delay_us(10);
    ldr3 = read_adc();
    vldr3 = vbe * (float)ldr3;
    if(vldr3>2)
      {
      output_high(PIN_B2);
      }else{output_low(PIN_B2);}
   //_______________________________________________________________

    set_adc_channel(3);
    delay_us(10);
    ldr4 = read_adc();
    vldr4 = vbe * (float)ldr4;
    if(vldr4>2)
    {
    output_high(PIN_B3);
    }else{output_low(PIN_B3);}
 }
}
Logged
x-robot
Jr. Member
**
Offline Offline

Posts: 18


Email
« Reply #1 on: February 12, 2013, 01:21:32 PM »

ปกติแล้ว CCS จะกำหนด I/O ให้อัตโนมัติเมื่อมีการเรียกใช้งาน input/output
แต่บางครั้งคุณสมบัติพิเศษ กลับไปทับซ้อนกันทำให้ใช้งานไม่ได้
คือลองกำหนด set_tris_b(0B00000000);     //RB is Output

หรือคุณลองทดสอบ การใช้งาน PORTB
http://www.thaimicrotron.com/CCS-628/EXAM/PORTB.htm
ว้า port ดีครบหรือเปล่า

Logged
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« Reply #2 on: February 14, 2013, 11:33:47 AM »

ผมลองใส่คำสั่งนี้ดูแล้วอะคับ แต่ยังไม่ได้อะคับ

set_tris_b(0B00000000);     //RB is Output
Logged
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« Reply #3 on: February 15, 2013, 04:47:47 PM »

อีกอย่างนึงคับ

คือผมอยากให้มันทำงานพร้อมกันอะคับ
  ในโค๊ดข้างบน ผมลองเอาไปใช้งาน  พอมันรับอินพุตเข้ามา แล้วเอาต์พุตทำงาน แต่ว่าถ้ามีเซนต์เซอร์ 2 ตัว มันต้องรอให้อีกตัวทำงานเสร็จก่อน
อะคับ เอาพุตอีกตัวถึงจะทำงาน

  แต่ว่าผมอยากให้รับอินพุตมาพร้อมกัน แล้วสามารถทำงานได้พร้อมอะคับ
ไม่ทราบว่า ผมต้องเขียน CODE ยังไงเหรอคับ
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #4 on: February 15, 2013, 10:37:04 PM »

ยังไม่เจออีกหรือครับ แล้วคุณไปเอาโค๊ดจากไหนมาครับ (หรือเขียนเอง)
เบอร์เดียวกันหรีอเปล่า Xtal เท่ากันหรือเปล่า
เดี๋ยวต้องลองหามาทดสอบก่อน มองโค๊ดดูdatasheet ก็ดูไม่ออกครับ
Logged
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« Reply #5 on: February 16, 2013, 01:56:10 AM »

เจอแล้วคับ พอดีมีจัมเปอร์บนบอร์ด ทำให้ไม่สามารถใช้งานพอร์ตได้
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #6 on: February 16, 2013, 07:24:14 AM »

 Grin Grin Grin
Logged
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« Reply #7 on: February 17, 2013, 10:35:40 AM »



#include <16F88.h>         // Standard Header file for the PIC16F877A
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP   
#use delay(clock=10000000)   
#define vbe 0.0048875855327468230694037145650049 // Vref/1023 ;Vref = 5 volt
float infa1,vinfa1,infa2,vinfa2,infa3,vinfa3;

void main(void)
{
    setup_adc_ports(all_analog);
    setup_adc(adc_clock_internal);
 
    while(TRUE)
 {
 //NUM 1
    set_adc_channel(0);
    delay_us(10);
    infa1 = read_adc();
    vinfa1 = vbe * (float)infa1;
   
    if (vinfa1<1){
      delay_ms(1000);
      output_low(PIN_B1);}
      else if((vinfa1>=1.2)&&(vinfa1<=2 ))
      {
      output_high(PIN_B0);
      delay_ms(4000);
      output_low(PIN_B0);}
      else{output_low(PIN_B0);}
  // ------------------------------------------------------------------------   
 //NUM2           
    set_adc_channel(1);
    delay_us(10);
    infa2 = read_adc();
    vinfa2 = vbe * (float)infa2;
   
    if (vinfa2<1){
      delay_ms(1000);
      output_low(PIN_B1);}
      else if((vinfa2>=1.2)&&(vinfa2<=2 ))
      {
      output_high(PIN_B1);
      delay_ms(4000);
      output_low(PIN_B1);}
      else{output_low(PIN_B1);}

จาก CODE นี้นะคับ
คือว่าพอจะมีวิธีให้มันทำงานพร้อมกันมั้ยคับ

คือตอนนี้เนี่ยพอรับ Input เข้ามาทั้ง 2 อินพุต Output ที่ B0 ก็ทำงาน
แต่ว่า Outputที่ B1 ยังไม่ทำงานอะคับ มันต้องรอให้ Delay ที่ Output B0 ทำงานเร็จก่อน
Outputที่ B1 ถึงจะทำงานอะคับ

 ผมต้องใช้interupt มั้ยคับ
 แต่ว่าผม interupt ไม่เป็นอะคับ
Logged
MicroX
Global Moderator
Full Member
*****
Offline Offline

Posts: 103


Senior


Email
« Reply #8 on: February 17, 2013, 03:42:26 PM »

ผมไม่รู้ว่าคุณต้องการจะทำอะไรครับ เพราะให้รายละเอียดมาน้อย
ตอนนี้ลองเอาหลักการไปคิดดูก่อนนะครับ เพราะผมยังไม่มีของอยู่ในมือ

การที่ต้องการให้เอาต์พุตหน่วงเวลานานๆ ต่างกันออกไป คงต้องใช้ timer ช่วย
http://www.thaimicrotron.com/CCS-628/Timer/TimerCounter.htm
http://www.thaimicrotron.com/CCS-628/Timer/Timer1_EX1.htm

แล้วใช้เงื่อนไข switch-case ตรวจสอบตัวแปร flag แต่ละตัวในการควบคุมเอาต์พุต

Logged
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« Reply #9 on: February 17, 2013, 03:53:59 PM »

ผมใช้บอร์ดของ ETT
ตัวนี้คับ
http://www.etteam.com/prod2010/PIC/PIC-et-base-pic16f628-v1.html

และใช้ PIC16f88 คับ
Logged
pomcoe
Jr. Member
**
Offline Offline

Posts: 29


Email
« Reply #10 on: March 04, 2013, 12:55:42 PM »

ผมไม่รู้ว่าคุณต้องการจะทำอะไรครับ เพราะให้รายละเอียดมาน้อย
ตอนนี้ลองเอาหลักการไปคิดดูก่อนนะครับ เพราะผมยังไม่มีของอยู่ในมือ

การที่ต้องการให้เอาต์พุตหน่วงเวลานานๆ ต่างกันออกไป คงต้องใช้ timer ช่วย
http://www.thaimicrotron.com/CCS-628/Timer/TimerCounter.htm
http://www.thaimicrotron.com/CCS-628/Timer/Timer1_EX1.htm

แล้วใช้เงื่อนไข switch-case ตรวจสอบตัวแปร flag แต่ละตัวในการควบคุมเอาต์พุต




ก็คือว่า
รับอินพุตเข้ามา 2 ตัว พร้อมกันแล้วให้ Output ทำงานพร้อมกันอะคับ

 //NUM 1
    set_adc_channel(0);
    delay_us(10);
    infa1 = read_adc();
    vinfa1 = vbe * (float)infa1;
   
    if (vinfa1<1){
      delay_ms(1000);
      output_low(PIN_B1);}
      else if((vinfa1>=1.2)&&(vinfa1<=2 ))
      {
      output_high(PIN_B0);
      delay_ms(4000);
      output_low(PIN_B0);}
      else{output_low(PIN_B0);}
  // ------------------------------------------------------------------------   
 //NUM2           
    set_adc_channel(1);
    delay_us(10);
    infa2 = read_adc();
    vinfa2 = vbe * (float)infa2;
   
    if (vinfa2<1){
      delay_ms(1000);
      output_low(PIN_B1);}
      else if((vinfa2>=1.2)&&(vinfa2<=2 ))
      {
      output_high(PIN_B1);
      delay_ms(4000);
      output_low(PIN_B1);}
      else{output_low(PIN_B1);}

  จาก CODE คือว่า
คือผมจะเอาไปใช้ที่โถปัสสาวะชายอะคับ ให้น้ำราดเอง
คือเมื่อคนเข้ามา ระบบก็ยังไม่ทำงานก่อน
รอจนกว่าคนจะออกไปแล้วค่อยทำงาน แล้วหน่วงเวลาไว้ 4 วิ อะคับ

//NUM1
เมื่อรับ Input จากเซนเซอร์ทางขา A0 ถ้าน้อยกว่าระยะของเซนเซอร์น้อยกว่า 1 ก็หน่วงเวลา 1 วิ   //คือตรงนี้เมื่อมีคนเดินเข้ามามันก็จะช่วยให้ระบบยังไม่ทำงาน
และเมื่อรับ Input จากเซนเซอร์ทางขา A0 ถ้าอยู่ในช่วง 1.2 -2 ก็ให้มันทำงาน และหน่วงเวลาไว้ 4 วิ //คือตรงนี้ในกรณีที่คนเดินออกไป แล้วราดน้ำอะคับ

ตอนนี้อะมันทำงานได้อะคับ
ในกรณีที่เข้ามาพร้อมกัน  Output ตัวที่ 2 จะทำงานได้ก็ต้องให้ Output ตัวที่ 1 ทำงานเสร็จก่อน
Logged
Pages: [1]   Go Up
Print
 
Jump to: