temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« เมื่อ: พฤษภาคม 27, 2011, 12:59:53 pm » |
|
ผมทำโปรเจค "สวิทต์สั่งงานด้วยโทรศัพท์มือถือแบบมีเสียงพูดตอบรับ" วงจรทุกอย่างทำเสร็จแล้วครับได้แก่ 1.ชุดถอดรหัสสาญญาณDTMF(MT8870) 2.ชุดบันทึกเสียง (ISD25120) 3.ชุดควบคุมรีเลย์ (TIP31C) 4.ชุดประมวลผล (PIC16F877) การทำงาน 1.เมื่อมีการโทรเข้าจะมีการรับสายและให้ใส่รหัสผ่าน 2.เลือกรายการที่ต้องการทำ "กด1 เปิดสวิท,กด2ปิดสวิท,กด3เปลี่ยนรหัสผ่าน" แต่ปัญหาติดตรงเขียนโคดให้ PIC16F877 รับสัญญาณดิจิตอลขนาด 4 บิต จากชุดถอดรหัสสัญญาณครับ เลยอยากขอคำปรึกษาครับว่าจะต้องใช้คำสั่งอะไร
|
|
|
บันทึกการเข้า
|
|
|
|
JUB
Full Member
member
คะแนน 81
ออฟไลน์
กระทู้: 1157
|
|
« ตอบ #1 เมื่อ: พฤษภาคม 27, 2011, 06:17:27 pm » |
|
โปรเจคระดับชาติเลยนะเนี๊ย..... ถ้าใช้ pic ทำแค่รับข้อมูล 4 bit มา toggle port ก็ไม่ยาก แต่ถ้ามีระบบตอบรับด้วยล่ะก็งานใหญ่.... ผมมีคำถามที่อยากรู้ 1.ตอนโทรเข้าเราจะรับสายยังไงมีสัญญานเป็นยังไงใช้วงจรแบบไหน 2.ISD25120 ใช้อะไรควบคุมให้เล่นและหยุด.....
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #2 เมื่อ: พฤษภาคม 27, 2011, 09:03:18 pm » |
|
-ขณะโทรเข้า ที่สายไมโคโฟนของโทรศัพท์จะมีไฟประมาณ2โวลท์ และเมื่อกดปุ่มรับก็จะเท่ากับว่าเอาไฟ2โวลท์นี้ลงกราวน์ โทรศัพท์ก็จะรับสายทันที ผมจึงเอาสายนี้ต่อเข้าที่ PIC16f877 แล้วสั่งให้ไมโครคอนโทลเลอร์ไปติกรีเลย์เพื่อรับสาย -การควบคุมISD25120 ในการบันทึกเสียงผมบันทึกไว้เป็นแท็กพอเล่นจบก็จะหยุดเองในแท็กนั้น การเลื่อกเล่นเล่นสียงที่บันทึกจะใช้2ปุ่ม ผมจะใช้รีเลย์แทนปุ่มกด โดยมีไมโครคอนโทลเลอร์ควบคุม ครับ แต่ตอนนี้ผมยังคิดไม่ออกว่าจะเขียนโคดยังไงให้รับค่าจากวงจรถอดรหัสได้ ถ้าเป็นคีย์แพดก็พอเดาทางออกครับ ขอคำแนะนำด้วยครับ
|
|
|
บันทึกการเข้า
|
|
|
|
JUB
Full Member
member
คะแนน 81
ออฟไลน์
กระทู้: 1157
|
|
« ตอบ #3 เมื่อ: พฤษภาคม 27, 2011, 10:55:51 pm » |
|
งั้น input ก็ไม่ได้มีแค่ DTMF ซิครับ...... ลอง flow chart มาซิครับเผื่อจะช่วยเขียนช่วยบอกให้.....
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #4 เมื่อ: พฤษภาคม 28, 2011, 12:58:02 am » |
|
ผังการเขียนโปรแกรม
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #5 เมื่อ: พฤษภาคม 28, 2011, 01:11:36 am » |
|
ผมได้กำหนดพอร์ทไว้ดังนี้ครับ #define sw1 PORTB.F7 //ควบคุมรีเลย์ตัวที่1 #define sw2 PORTB.F6 //ควบคุมรีเลย์ตัวที่2 #define sw3 PORTB.F5 //ควบคุมรีเลย์ตัวที่3 #define sw4 PORTB.F4 //ควบคุมรีเลย์ตัวที่4 #define tel PORTB.F3 //ควบคุมรีเลย์รับโทรศัพท์ #define play PORTB.F2 //ควบคุมรีเลย์เล่นเสียง #define sel PORTB.F1 //ควบคุมรีเลย์เลือกแทร็กที่จะเล่น พอร์ท A0-A3 รับค่าเลขฐาน2จากชุดถอดรหัสสัญญาณDTMF พอร์ท A5 กำหนดไว้ให้ตรวจเช็คการโทรเข้า สภาวะปกติมีลอจิกเป็น 0 ท่านอาจารย์ช่วยแนะนำด้วยนะครับ
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #6 เมื่อ: พฤษภาคม 28, 2011, 08:11:27 am » |
|
http://www.datasheetcatalog.org/datasheets/228/268107_DS.pdfกำหนดให้ PORT-A ต่อกับขา Q1~Q4 แล้วรับสัญญาณตามตารางที่แนบมาด้วย เช่น... กด 1 PORT-A จะมีค่าเป็น 0X01 กด * PORT-A จะมีค่าเป็น 0X0B แล้วค่อยเอาค่าตัวเลขที่รับได้จาก PORT-A มาสั่งงาน ก็ไม่ได้หรือครับ? หรือว่าลองแล้วแต่ติดปัญหาอย่างอื่น? ส่วนขา A-5 ที่เอาไว้ตรวจสอบการโทรเข้าก็ให้ใช้พอตอื่นแทน
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #7 เมื่อ: พฤษภาคม 28, 2011, 09:51:24 am » |
|
TRISB=0; //กำหนดให้portbเป็นเอาท์พุต TRISA.=0xFF; //กำหนดให้portaเป็นอินพุต ถ้าผมกำหนดให้ พอร์ทA เป็นอินพุทตามโค๊ดข้างบนแล้ว ผมจะเขียนโค๊ดยังไงให้พอร์ทA เชื่อมต่อกับQ1-Q4ครับ
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #8 เมื่อ: พฤษภาคม 28, 2011, 11:09:28 am » |
|
อาจารย์ทุกท่านช่วยดูโค๊ดตัวนี้ให้หน่อยครับถูกต้องหรือเปล่า
#define sw1 PORTB.F7 //ควบคุมรีเลย์ตัวที่1 #define sw2 PORTB.F6 //ควบคุมรีเลย์ตัวที่2 #define sw3 PORTB.F5 //ควบคุมรีเลย์ตัวที่3 #define sw4 PORTB.F4 //ควบคุมรีเลย์ตัวที่4 #define tel PORTB.F3 //ควบคุมรีเลย์รับโทรศัพท์ #define play PORTB.F2 //ควบคุมรีเลย์เล่นเสียง #define sel PORTB.F1 //ควบคุมรีเลย์เลือกแทร็กที่จะเล่น #define sen PORTD.F0 //senแทนPORTD.1 ทำหน้าที่คอยเช็คการโทรเข้า void main() { unsigned char password[]={1,2,3,4}; //ตั้งค่ารหัสผ่านเก็บไว้ในตัวแปร password unsigned char input[4]; //สร้างตัวแปลเก็บค่ารหัสผ่าน unsigned int kp,i; //สร้างตัวแปร index TRISB=0; //กำหนดให้portbเป็นเอาท์พุต TRISA=0xFF; //กำหนดให้portaเป็นอินพุต TRISD=0xFF; //กำหนดให้portdเป็นอินพุต play=0; //เคลียสถานะการเล่นเสียง sel=0; //เคลียสถานะการเลือกช่องเสียง if(sen==0) //ถ้าsenมีลอจิกเป็น0 { Play=1; //ให้playมีลอจิกเป็น1 delay_ms(50); //หน่วงเวลา50ms play=0; //ให้ยสฟัมีลอจิกเป็น0 } for(i=0;i<4;i++) //ให้มีการวนลูปนี้4รอบ { while(!PORTA_scan()); //วนลูปรอการกดปุ่ม kp=PORTA_scan(); //สแกนค่าที่ได้จากการกด input=PORTA[kp]; //แปลงค่าที่ได้จากPORTAเก็บไว้ที่ตัวแปรindex while(key_scan()); //วนลูปรอการปล่อยปุ่ม } if(input[0]==password[0]&&input[1]==password[1] //ถ้าค่าตัวเลขรหัสผ่านในตัวแปร input &&input[2]==password[2]&&input[3]==password[3]) //และpasswordตรงกัน(รหัสผ่านถูกต้อง)
|
|
|
บันทึกการเข้า
|
|
|
|
JUB
Full Member
member
คะแนน 81
ออฟไลน์
กระทู้: 1157
|
|
« ตอบ #9 เมื่อ: พฤษภาคม 28, 2011, 12:10:19 pm » |
|
ตอนเล่นเสียงระบบตอบรับจะรู้ได้อย่างไรว่าเล่น track ไหนถูกต้องหรือไม่..... ถ้าเกิดกรณีที่ต้องเล่นซ้ำเล่นวนเล่นแบบเลือก track ทดสอบแล้วหรือยัง... ถ้ามีการกด key สวนไปในขณะที่ระบบตอบรับทำงานอยู่ จะเกิดข้อผิดพลาดหรือไม่ ที่สำคัญคือต้องแม่นในเรื่อง algorithm เป็นอย่างมาก flow chart ที่เขียนมา ไม่สามารถแก้ไขข้อผิดพลาดดังกล่าวได้ แต่ทำงานได้หากเงื่อนไขเป็นตามที่กล่าวมา แบ่งงานครับแยกออกมาทีละส่วนอย่ามองโดยรวม ไม่งั้นงงตาย.... เริ่มจากรับสายแล้วกด password สั่ง relay ให้ได้ก่อน.... ระบบตอบรับไว้ใส่ทีหลัง.... ...
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #10 เมื่อ: พฤษภาคม 28, 2011, 12:44:34 pm » |
|
ครับผมจะทำตามที่ท่านแนะนำก่อนครับ ขอบคุณครับ
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #11 เมื่อ: พฤษภาคม 28, 2011, 02:53:35 pm » |
|
ตอนนี้ยังเขียนโค๊ดให้PORTA รับค่าจากชุดถอดรหัสไม่ถูกครับช่วยแนะนำทีครับ คอมพลายไม่ผ่านครับ ในการอ่านค่าจาก PORTA ใช้จะใช้คำสั่งไหนครับ
|
|
|
บันทึกการเข้า
|
|
|
|
JUB
Full Member
member
คะแนน 81
ออฟไลน์
กระทู้: 1157
|
|
« ตอบ #12 เมื่อ: พฤษภาคม 28, 2011, 04:40:27 pm » |
|
ผมไม่ได้ดูถูกนะ ถ้าแค่นี้ยังทำไม่ได้ step ต่อไปลำบากกว่านี้เยอะครับ.... คงต้องลองไปศึกษาภาษา C ใหม่ล่ะครับ งานนี้..... ยังไงก็สู้ๆนะ มันไม่เหนือความพยายามเราหรอก....
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #13 เมื่อ: พฤษภาคม 28, 2011, 06:01:25 pm » |
|
ขอบคุณครับ ผมไม่รู้จะใช้คำสั่งตัวไหนจริงๆครับ เคยทำแต่อ่านค่าจาก keypad ครับ ท่านสนใจรับเขียนโค๊ดโปรเจคนี้ไหมครับ หรือว่ามีใครรับเขียนบ้างครับ เพราะมันเป็นงานด่วนครับใกล้กำหนดส่งแล้ว
|
|
|
บันทึกการเข้า
|
|
|
|
nantawut
Full Member
member
คะแนน 36
ออฟไลน์
กระทู้: 508
|
|
« ตอบ #14 เมื่อ: พฤษภาคม 28, 2011, 07:12:42 pm » |
|
ลองไปหาห้องอื่นที่มีคนเล่นเยอะๆสิ อาจช่วยได้ ทำเองเถอะ จ้างทำไม่ได้ความรู้ ไม่ภูมิใจด้วย
|
|
|
บันทึกการเข้า
|
|
|
|
JUB
Full Member
member
คะแนน 81
ออฟไลน์
กระทู้: 1157
|
|
« ตอบ #15 เมื่อ: พฤษภาคม 28, 2011, 08:22:52 pm » |
|
ผมไม่ได้รับครับ แต่ที่นี่รับ ******************************************************** รับทำโปรเจค นักศึกษา ปริญญาตรี, ปวช., ปวส. ไฟฟ้า คอนโทรล อิเล็กทรอนิกส์ สื่อสาร - รับเขียนโปรแกรม ควบคุม คอนโทรลเลอร์ PIC, MCS, AVR, Zigbee, etc. เช่น ควบคุมมอเตอร์, เชื่อมต่อ และ ควมคุมเอลซีดี(LCD), คีย์บอร์ด, GSM module - สอนเขียนโปรแกรม ภาษาซี (C programming), Visual Basic, C++ - รับออกแบบวงจร ออกแบบแผ่นปริ้น(PCB) อิเล็กทรอนิกส์ - รับปรึกษาโปรเจค นักศึกษา ปริญญาตรี, ปวช., ปวส. ติดต่อได้ที่ สมชาย เทพแพง 087-785-1077 e-mail address : detecter_chy@yahoo.comหรือ somch_th@hotmail.com *********************************************************** หรือที่นี่.... http://www.allelecpro.com/product.detail_453703_th_2118556
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #16 เมื่อ: พฤษภาคม 29, 2011, 11:36:30 am » |
|
ผมไม่ถอยอยู่แล้วครับต้องทำให้ได้ แต่ใกล้ถึงกำหนดส่งงานแล้วครับมีเวลาคิดไม่นานด้วยครับ โค๊ดทั้งหมดผมติดอยู่ที่จุดเดียวครับคือกำหนดให้มีการอ่านค่าจากPORTAที่เชื่อมต่ออยู่กับวงจรถอดรหัสซึ่งส่งข้อมูลออกมานี่หละครับ
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #17 เมื่อ: มิถุนายน 02, 2011, 12:06:11 am » |
|
กลับมาขอคำแนะนำอีกครับ ผมพยายามเขียนโค๊ดออกมาแล้วรับค่าพอเข้าโหมด sw_on: กด1 sw1ทำงาน แต่พอกด2 sw2ทำงาน sw1หยุดทำงานทันทีครับ แต่สิ่งที่ผมต้องการคือถ้ากดเลขใดให้swตำแหน่งนั้นทำงานส่วนตำแหน่งอื่นยังคงสถานะเดิมครับ โค๊ดที่ผมทดลองตอนนี้ครับ sw_on: { while(!portb==1); //วนลูปรอการกด(ให้portbคอยเช็คการกดปุ่ม) if(portd==0x1)sw1=1; //ถ้ากด1sw1ทำงาน if(portd==0x2)sw2=1; if(portd==0x3)sw3=1; if(portd==0x4)sw4=1; if(portd==0x0b)goto RETURN; goto sw_on; } จะต้องแก้ไขจุดไหนบ้างครับ
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #18 เมื่อ: มิถุนายน 02, 2011, 04:47:45 am » |
|
ตอนนี้ทุกอย่างไปได้ดีแต่ยังติดตรงที่ตอนโทรเข้าครับ กระโดดไปรับไม่ได้ติดที่คำสั่งให้วนลูปรอการกดปุ่ม
|
|
|
บันทึกการเข้า
|
|
|
|
kiano♥
|
|
« ตอบ #19 เมื่อ: มิถุนายน 02, 2011, 10:05:18 am » |
|
ถ้าผมแก้ปัญหาผมจะทำดังนี้
1. กดสวิทช์อื่น แต่สถานะสวิทช์เดิมยังคงค้าสถานะไว้ ต้องกำหนดตัวแปรมาเพื่อเก็บค่าของสวิทช์นั้นๆ 2. ออกจาก LOOP ผมใช้คำสั่ง goto ถ้าคำสั่ง goto ไม่มีในภาษาซี ก็ให้แทรกเป็น ASM เลย ง่ายดี อยากให้โดดไปไหนก็สั่งมันได้เลย
|
|
|
บันทึกการเข้า
|
|
|
|
JUB
Full Member
member
คะแนน 81
ออฟไลน์
กระทู้: 1157
|
|
« ตอบ #20 เมื่อ: มิถุนายน 02, 2011, 10:58:15 pm » |
|
ตอนนี้ทุกอย่างไปได้ดีแต่ยังติดตรงที่ตอนโทรเข้าครับ กระโดดไปรับไม่ได้ติดที่คำสั่งให้วนลูปรอการกดปุ่ม ต้องแม่นในเรื่อง algorithm ครับ... มองงานให้ขาดและแบ่งเป็น step
|
|
|
บันทึกการเข้า
|
|
|
|
temfun
member
คะแนน 5
ออฟไลน์
กระทู้: 226
|
|
« ตอบ #21 เมื่อ: มิถุนายน 03, 2011, 05:24:02 pm » |
|
pic16f877 สามารถโปรแกรมได้กี่ครั้งครับ หลังจากทำเสร็จแล้วทดลองหลายรอบไม่มีปัญหาพอมาแก้โค๊ดเปลี่ยนรหัสใหม่ นำไปลงบอร์ดกลับแสดงสถานะว่ารหัสไม่ถูกต้อง นำโค๊ดมาจำลองการทำงานในโปรแกรมก็ไม่มีปัญหาอะไร เป็นไปได้ไหมครับว่าpic16f877โปรแกรมหลายครั้งแล้วมีปัญญหาครับ
|
|
|
บันทึกการเข้า
|
|
|
|
|