Pages: [1] 2   Go Down
Print
Author Topic: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232  (Read 31599 times)
0 Members and 3 Guests are viewing this topic.
maxmkung
มาใหม่
*
Offline Offline

Posts: 9


Email
« 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
Code:
[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
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #1 on: January 14, 2013, 06:08:49 PM »

ผลออกมาไม่ตรงแสดงว่า ออกเป็นขยะใช่ไหมครับ
น่าจะเป็นที่ baudrate ที่ Hyperterminal ให้เซ็ทเป็น 9600
ส่วนที่บอร์ด ET- base pic16f628 ลองดูที่ Jumper RB1,RB2 ว่าต่อถูกหรือเปล่า
Logged
maxmkung
มาใหม่
*
Offline Offline

Posts: 9


Email
« 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
Global Moderator
Hero Member
*****
Offline Offline

Posts: 292



« Reply #3 on: January 15, 2013, 01:00:26 AM »

เรื่องนี้มันยาว ขอหารูปประกอบก่อนนะครับ

Logged
maxmkung
มาใหม่
*
Offline Offline

Posts: 9


Email
« Reply #4 on: January 15, 2013, 11:09:23 AM »

เรื่องนี้มันยาว ขอหารูปประกอบก่อนนะครับ


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

Posts: 103


Senior


Email
« 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
มาใหม่
*
Offline Offline

Posts: 9


Email
« Reply #6 on: January 18, 2013, 10:09:23 PM »

พี่ Gundam ฝากบอกมาว่าช่วงนี้ติดงานจะกลับมาช่วงวันจันทร์ครับ

rs 232 ต่อเป็น bus สามารถทำได้ครับ แต่ต้องดัดแปลง TX ไม่ให้ชนกัน
ซึ่งใช้ติดต่อระหว่างโมดูล แล้วผมจะมาช่วยอีกแรง

ส่วน rs 485 ลองดูตัวอย่าง และโค๊ด
http://www.thaimicrotron.com/Project/BIG7SEG1/BIG7SEG.htm
ขอบคุณครับ จะลองศึกษาดู ตอนนี้ผมใช้บอร์ด  ET- base pic16f628 แล้วมันมี rs 232 อยู่แล้ว ดังนั้นเลยอยากจะหาวิธีเปลี่ยนสัญญาณจาก rs232 เป็น rs485 นะครับ
ถ้าจะใช้โมดูลแปลงสัญญาณของ ETT มันก็ราคาสูงไป เลยลองหาวงจรแปลงง่ายๆดูครับ ตอนนี้ก็ลองไปเรื่อยๆ มีอะไรคืบหน้าจะมาบอกอีกทีครับ
Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #7 on: January 18, 2013, 10:22:58 PM »

สวัสดีครับ K.maxmkung

ขอสอบถามว่า เมื่อตัว master จะติดต่อกับ slave เราจะส่ง address โดยใช้คำสั่งอย่างไรครับ  ทั้งตัวส่ง (master) และตัวรับ (slave) ครับ ขอบคุณครับ
Logged
maxmkung
มาใหม่
*
Offline Offline

Posts: 9


Email
« Reply #8 on: January 18, 2013, 10:44:28 PM »

สวัสดีครับ K.maxmkung

ขอสอบถามว่า เมื่อตัว master จะติดต่อกับ slave เราจะส่ง address โดยใช้คำสั่งอย่างไรครับ  ทั้งตัวส่ง (master) และตัวรับ (slave) ครับ ขอบคุณครับ

ที่ทดสอบให้ Master ส่งข้อมูลแล้วให้ Slave ตอบสนองก็โค้ดตามนี้นะครับ

Master
Code:
#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
Code:
#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 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
มาใหม่
*
Offline Offline

Posts: 9


Email
« 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 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
มาใหม่
*
Offline Offline

Posts: 9


Email
« 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 Offline

Posts: 22


« Reply #13 on: January 20, 2013, 12:09:05 AM »

จาก code
พอเรากดแป้นพิมพ์ 1 ครั้ง จะทำให้ ทั้ง master และ slave เข้าสู่ interrupt
สำหรับ slave นั้น จะได้ค่า อักขระ มา 1 ค่า และจะรอรับค่าต่อไป ก็ต่อเมื่อเราต้องกด แป้นพิมพ์ อีก ครั้ง ใช่หรือไม่ครับ
Logged
maxmkung
มาใหม่
*
Offline Offline

Posts: 9


Email
« 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
Pages: [1] 2   Go Up
Print
 
Jump to: