maxmkung
|
|
« on: January 14, 2013, 04:22:00 PM » |
|
สวัสดครับตอนนี้ผมทดลอง เชื่อมต่อ คอมพิวเตอร์ กับ ไม่โครคอนโทรลเลอร์ โดยใช้บอร์ด ET- base pic16f628 ของ ETT ส่งข้อมูลผ่าน RS232 โดยจะเรียกดูข้อมูลด้วย HYPER TERMINAL เมื่อลองทดสอบกับกัน โปรแกรม proteus ก็ขึ้นผลลัพธ์ตรงตามโค้ด ปกตินะครับ แต่พอลองเบิร์นลงบอร์ด ผลที่ออก Hyperterminal กลับไม่ตรงครับ โค้ดโปรแกรมผมก็ลองตามตัวอย่างลิ้งค์นี้เลยครับ>>> http://www.thaimicrotron.com/CCS-628/EXAM/RS232.htm[size=16pt] #include <16F628A.h> #use delay(clock=10000000) #fuses XT,PUT,BROWNOUT,MCLR,NOWDT,NOPROTECT,NOLVP #use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
void main() { int c; printf("Hello World\r\n");
while(1) { if(kbhit()) //Check data Receive { c=getc(); //Get data printf("%c",c); //Echo } } } [/size] ขอบคุณครับ
|
|
« Last Edit: January 15, 2013, 11:08:47 AM by maxmkung »
|
Logged
|
|
|
|
gundam
|
|
« Reply #1 on: January 14, 2013, 06:08:49 PM » |
|
ผลออกมาไม่ตรงแสดงว่า ออกเป็นขยะใช่ไหมครับ น่าจะเป็นที่ baudrate ที่ Hyperterminal ให้เซ็ทเป็น 9600 ส่วนที่บอร์ด ET- base pic16f628 ลองดูที่ Jumper RB1,RB2 ว่าต่อถูกหรือเปล่า
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #2 on: January 14, 2013, 06:31:09 PM » |
|
ขอบคุณคุณ gundam ครับ Hyper terminal เซตเป็น 9600 แล้วนะครับ ที่บอร์ดก็จัมเปอร์ต่อไปทาง RX กับ TX แล้วครับ ตอนนี้ลองโปรแกรมอีกตัวหนึ่งดู ปรากฎมารันได้ครับ สื่อสารกันได้แล้วก็เลยลองทำให้ บอร์ดที่ 1 เป็น Master แล้วให้บอร์ด 2 และ 3 เป็น SLAVE ในส่วนของ MASTER ส่งข้อมูลไปให้ SLAVE ทั้งสอง โดยถ้าส่งข้อมูลไปตรงกับ ID ตัวไหน SLAVE ตัวนั้นก็จะส่งเอาท์พุตให้ LED ติด ตรงนี้ผ่านนะครับ ติดดับถูกต้อง แต่ผมต้องการให้ SLAVE ส่งค่ากลับไปยัง MASTER นะครับ พอให้ SLAVE 1 และ 2 ต่อร่วมกัน มันไม่ส่งข้อมูลกลับมาครับ
คือ การทำงานของวงจรของผมคือ 1. ให้ Master ซึ่งอาจเป็น PC หรือ Micro controller ส่งคำสั่งไปให้ Slave แต่ละตัว ผ่าน rs232 << ตรงนี้ได้แล้วครับ 2. ให้ Slave ตอบสนองต่อคำสั่งถ้า ID ตรง แล้วไปเช็คค่า อุณหภูมิ จากเซนเซอร์ ds1820 << ตอนนี้ที่ได้คือ ถ้า ID ตรง Slave ก็ จะสั่งให้ LED ติด 3. ให้ Slave ส่งค่าอุณหภูมิกลับไปยัง Master ผ่านทาง rs232 << ตอนนี้ถ้าตัวต่อตัวส่งกลับได้ครับ
ผมไม่แน่ใจว่า rs232 นี่ต่อร่วมกันหลายตัวได้หรือป่าวครับ แล้วถ้าใช้ rs485 จะเป็นอย่างไร หรือพี่ๆมีแนวทางอื่นแนะนำ ช่วยชี้แนะด้วยครับ ขอบุณครับ
|
|
|
Logged
|
|
|
|
gundam
|
|
« Reply #3 on: January 15, 2013, 01:00:26 AM » |
|
เรื่องนี้มันยาว ขอหารูปประกอบก่อนนะครับ
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #4 on: January 15, 2013, 11:09:23 AM » |
|
เรื่องนี้มันยาว ขอหารูปประกอบก่อนนะครับ
ครับ ขอบคุณครับ
|
|
|
Logged
|
|
|
|
MicroX
|
|
« Reply #5 on: January 18, 2013, 06:34:59 PM » |
|
พี่ Gundam ฝากบอกมาว่าช่วงนี้ติดงานจะกลับมาช่วงวันจันทร์ครับ rs 232 ต่อเป็น bus สามารถทำได้ครับ แต่ต้องดัดแปลง TX ไม่ให้ชนกัน ซึ่งใช้ติดต่อระหว่างโมดูล แล้วผมจะมาช่วยอีกแรง ส่วน rs 485 ลองดูตัวอย่าง และโค๊ด http://www.thaimicrotron.com/Project/BIG7SEG1/BIG7SEG.htm
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #6 on: January 18, 2013, 10:09:23 PM » |
|
ขอบคุณครับ จะลองศึกษาดู ตอนนี้ผมใช้บอร์ด ET- base pic16f628 แล้วมันมี rs 232 อยู่แล้ว ดังนั้นเลยอยากจะหาวิธีเปลี่ยนสัญญาณจาก rs232 เป็น rs485 นะครับ ถ้าจะใช้โมดูลแปลงสัญญาณของ ETT มันก็ราคาสูงไป เลยลองหาวงจรแปลงง่ายๆดูครับ ตอนนี้ก็ลองไปเรื่อยๆ มีอะไรคืบหน้าจะมาบอกอีกทีครับ
|
|
|
Logged
|
|
|
|
akekachai
Jr. Member
Offline
Posts: 22
|
|
« Reply #7 on: January 18, 2013, 10:22:58 PM » |
|
สวัสดีครับ K.maxmkung
ขอสอบถามว่า เมื่อตัว master จะติดต่อกับ slave เราจะส่ง address โดยใช้คำสั่งอย่างไรครับ ทั้งตัวส่ง (master) และตัวรับ (slave) ครับ ขอบคุณครับ
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #8 on: January 18, 2013, 10:44:28 PM » |
|
สวัสดีครับ K.maxmkung
ขอสอบถามว่า เมื่อตัว master จะติดต่อกับ slave เราจะส่ง address โดยใช้คำสั่งอย่างไรครับ ทั้งตัวส่ง (master) และตัวรับ (slave) ครับ ขอบคุณครับ
ที่ทดสอบให้ Master ส่งข้อมูลแล้วให้ Slave ตอบสนองก็โค้ดตามนี้นะครับ Master#include <16F628A.h> #FUSES HS,NOPROTECT,NOLVP,NOWDT,PUT,NOBROWNOUT
#define OSC_CLK 10000000 #USE delay(clock=OSC_CLK)
#USE rs232(BAUD=9600,xmit=PIN_B2,rcv=PIN_B1,BITS=8,PARITY=N,STOP=1)
#int_RDA void master_isr(){
}
void main(void){ enable_interrupts(GLOBAL); enable_interrupts(INT_RDA); while(TRUE){ printf("%c%c%c",0x31,0x31,0x31); //DEVICE ID 1 delay_ms(2000); printf("%c%c%c",0x32,0x31,0x31); //DEVICE ID 2 delay_ms(2000); printf("%c%c%c",0x31,0x31,0x30); //DEVICE ID 1 delay_ms(2000); printf("%c%c%c",0x32,0x31,0x30); //DEVICE ID 2 delay_ms(2000); } }
Slave#include <16F628A.h> #FUSES HS,NOPROTECT,NOLVP,NOWDT,PUT,NOBROWNOUT
#define OSC_CLK 10000000 #USE delay(clock=OSC_CLK)
#USE rs232(BAUD=9600,xmit=PIN_B2,rcv=PIN_B1,BITS=8,PARITY=N,STOP=1)
#define DEVICEID '1'
unsigned char dat[3]; int8 i=0;
#int_RDA void slave_isr(){ dat[i]=getch(); i++; if(i>2){ i=0; if(DEVICEID==dat[0]){ switch(dat[1]){ //Device ID of Slave 1 case '1': if(dat[2]=='1') { output_HIGH(PIN_B0); delay_ms(1000); printf("ID1"); } else output_LOW(PIN_B0); break; case '2': if(dat[2]=='1') output_HIGH(PIN_B1); else output_LOW(PIN_B1); break; } } } }
void main(void){ enable_interrupts(GLOBAL); enable_interrupts(INT_RDA); while(TRUE); }
|
|
|
Logged
|
|
|
|
akekachai
Jr. Member
Offline
Posts: 22
|
|
« Reply #9 on: January 18, 2013, 11:19:28 PM » |
|
K. maxmkung code นี้ สามารถใช้กับ PIC (Master) ส่งให้ PIC1 (Slave) และ PIC2 (Slave) ได้ ด้วยใช้หรือไม่ครับ ผมเห็นมี คำสั่ง Printf อยู่ครับ ซึ่งเป็นการส่งค่าออก monitor
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #10 on: January 19, 2013, 12:13:52 AM » |
|
K. maxmkung code นี้ สามารถใช้กับ PIC (Master) ส่งให้ PIC1 (Slave) และ PIC2 (Slave) ได้ ด้วยใช้หรือไม่ครับ ผมเห็นมี คำสั่ง Printf อยู่ครับ ซึ่งเป็นการส่งค่าออก monitor
ใช่ครับ ของผมใช้แก้ ไอดีตรง slave โค้ดเอา
|
|
|
Logged
|
|
|
|
akekachai
Jr. Member
Offline
Posts: 22
|
|
« Reply #11 on: January 19, 2013, 12:23:03 AM » |
|
K. maxmkung code นี้ สามารถใช้กับ PIC (Master) ส่งให้ PIC1 (Slave) และ PIC2 (Slave) ได้ ด้วยใช้หรือไม่ครับ ผมเห็นมี คำสั่ง Printf อยู่ครับ ซึ่งเป็นการส่งค่าออก monitor
ใช่ครับ ของผมใช้แก้ ไอดีตรง slave โค้ดเอา ในการต่อ hardware ก็นำ Pic (Master) กับ Pic (Slave) ต่อกันผ่าน TX,RX แล้วก็ต่อเข้า Port RS232 TX,RX ต่อร่วมกันเลย โดยจะต้องต่อ อุปกรณ์ ปรับแรงดันก่อนเข้า com เช่น Max232 ใช่หรือไม่ครับ
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #12 on: January 19, 2013, 04:29:37 PM » |
|
ในการต่อ hardware ก็นำ Pic (Master) กับ Pic (Slave) ต่อกันผ่าน TX,RX แล้วก็ต่อเข้า Port RS232 TX,RX ต่อร่วมกันเลย โดยจะต้องต่อ อุปกรณ์ ปรับแรงดันก่อนเข้า com เช่น Max232 ใช่หรือไม่ครับ
Pic slave และ Master ต่อกันผ่าน rs232 ที่ขาt out แล r in ของแต่ละตัว น่าจะความหมายเดียวกันรึเปล่านะครับ เหอะๆ
|
|
« Last Edit: January 19, 2013, 04:37:32 PM by maxmkung »
|
Logged
|
|
|
|
akekachai
Jr. Member
Offline
Posts: 22
|
|
« Reply #13 on: January 20, 2013, 12:09:05 AM » |
|
จาก code พอเรากดแป้นพิมพ์ 1 ครั้ง จะทำให้ ทั้ง master และ slave เข้าสู่ interrupt สำหรับ slave นั้น จะได้ค่า อักขระ มา 1 ค่า และจะรอรับค่าต่อไป ก็ต่อเมื่อเราต้องกด แป้นพิมพ์ อีก ครั้ง ใช่หรือไม่ครับ
|
|
|
Logged
|
|
|
|
maxmkung
|
|
« Reply #14 on: January 20, 2013, 12:18:47 PM » |
|
จาก code พอเรากดแป้นพิมพ์ 1 ครั้ง จะทำให้ ทั้ง master และ slave เข้าสู่ interrupt สำหรับ slave นั้น จะได้ค่า อักขระ มา 1 ค่า และจะรอรับค่าต่อไป ก็ต่อเมื่อเราต้องกด แป้นพิมพ์ อีก ครั้ง ใช่หรือไม่ครับ
Master จะส่งข้อมูลออกมาเรื่อยๆครับ ตรงนี้ printf("%c%c%c",0x31,0x31,0x31); //DEVICE ID 1 ส่งค่า 111 << Slave 1 สั่ง led ติด delay_ms(2000); printf("%c%c%c",0x32,0x31,0x31); //DEVICE ID 2 ส่งค่า 211 << Slave 2 สั่ง led ติด delay_ms(2000); printf("%c%c%c",0x31,0x31,0x30); //DEVICE ID 1 ส่งค่า 110 << Slave 1 สั่ง led ดับ delay_ms(2000); printf("%c%c%c",0x32,0x31,0x30); //DEVICE ID 2 ส่งค่า 210 << Slave 2 สั่ง led ดับ delay_ms(2000);
|
|
|
Logged
|
|
|
|
|