Title: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe 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);} } } Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: x-robot 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 ดีครบหรือเปล่า Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe on February 14, 2013, 11:33:47 AM ผมลองใส่คำสั่งนี้ดูแล้วอะคับ แต่ยังไม่ได้อะคับ
set_tris_b(0B00000000); //RB is Output Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe on February 15, 2013, 04:47:47 PM อีกอย่างนึงคับ
คือผมอยากให้มันทำงานพร้อมกันอะคับ ในโค๊ดข้างบน ผมลองเอาไปใช้งาน พอมันรับอินพุตเข้ามา แล้วเอาต์พุตทำงาน แต่ว่าถ้ามีเซนต์เซอร์ 2 ตัว มันต้องรอให้อีกตัวทำงานเสร็จก่อน อะคับ เอาพุตอีกตัวถึงจะทำงาน แต่ว่าผมอยากให้รับอินพุตมาพร้อมกัน แล้วสามารถทำงานได้พร้อมอะคับ ไม่ทราบว่า ผมต้องเขียน CODE ยังไงเหรอคับ Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: MicroX on February 15, 2013, 10:37:04 PM ยังไม่เจออีกหรือครับ แล้วคุณไปเอาโค๊ดจากไหนมาครับ (หรือเขียนเอง)
เบอร์เดียวกันหรีอเปล่า Xtal เท่ากันหรือเปล่า เดี๋ยวต้องลองหามาทดสอบก่อน มองโค๊ดดูdatasheet ก็ดูไม่ออกครับ Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe on February 16, 2013, 01:56:10 AM เจอแล้วคับ พอดีมีจัมเปอร์บนบอร์ด ทำให้ไม่สามารถใช้งานพอร์ตได้
Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: MicroX on February 16, 2013, 07:24:14 AM ;D ;D ;D
Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe 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 ไม่เป็นอะคับ Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: MicroX 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 แต่ละตัวในการควบคุมเอาต์พุต Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe on February 17, 2013, 03:53:59 PM ผมใช้บอร์ดของ ETT
ตัวนี้คับ http://www.etteam.com/prod2010/PIC/PIC-et-base-pic16f628-v1.html และใช้ PIC16f88 คับ Title: Re: มีเรื่องให้ช่วยหน่อยคับผม T_T Post by: pomcoe 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 ทำงานเสร็จก่อน |