Thai microtron community

Electronic Knowledge Base => Microcontoller & Electronics => Topic started by: maxmkung on January 14, 2013, 04:22:00 PM



Title: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: 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 (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]

ขอบคุณครับ


Title: Re: มีเรื่องใช้ช่วยครับ PIC16F628A กับ rs232
Post by: gundam on January 14, 2013, 06:08:49 PM
ผลออกมาไม่ตรงแสดงว่า ออกเป็นขยะใช่ไหมครับ
น่าจะเป็นที่ baudrate ที่ Hyperterminal ให้เซ็ทเป็น 9600
ส่วนที่บอร์ด ET- base pic16f628 ลองดูที่ Jumper RB1,RB2 ว่าต่อถูกหรือเปล่า


Title: Re: มีเรื่องใช้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung 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 จะเป็นอย่างไร หรือพี่ๆมีแนวทางอื่นแนะนำ ช่วยชี้แนะด้วยครับ ขอบุณครับ


Title: Re: มีเรื่องใช้ช่วยครับ PIC16F628A กับ rs232
Post by: gundam on January 15, 2013, 01:00:26 AM
เรื่องนี้มันยาว ขอหารูปประกอบก่อนนะครับ



Title: Re: มีเรื่องใช้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung on January 15, 2013, 11:09:23 AM
เรื่องนี้มันยาว ขอหารูปประกอบก่อนนะครับ


ครับ ขอบคุณครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: MicroX on January 18, 2013, 06:34:59 PM
พี่ Gundam ฝากบอกมาว่าช่วงนี้ติดงานจะกลับมาช่วงวันจันทร์ครับ

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

ส่วน rs 485 ลองดูตัวอย่าง และโค๊ด
http://www.thaimicrotron.com/Project/BIG7SEG1/BIG7SEG.htm


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung 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 มันก็ราคาสูงไป เลยลองหาวงจรแปลงง่ายๆดูครับ ตอนนี้ก็ลองไปเรื่อยๆ มีอะไรคืบหน้าจะมาบอกอีกทีครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 18, 2013, 10:22:58 PM
สวัสดีครับ K.maxmkung

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


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung 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);
}



Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 18, 2013, 11:19:28 PM
K. maxmkung 
code นี้ สามารถใช้กับ PIC (Master) ส่งให้ PIC1 (Slave) และ PIC2 (Slave) ได้ ด้วยใช้หรือไม่ครับ
ผมเห็นมี คำสั่ง Printf อยู่ครับ ซึ่งเป็นการส่งค่าออก monitor


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung on January 19, 2013, 12:13:52 AM
K. maxmkung 
code นี้ สามารถใช้กับ PIC (Master) ส่งให้ PIC1 (Slave) และ PIC2 (Slave) ได้ ด้วยใช้หรือไม่ครับ
ผมเห็นมี คำสั่ง Printf อยู่ครับ ซึ่งเป็นการส่งค่าออก monitor
ใช่ครับ ของผมใช้แก้ ไอดีตรง slave โค้ดเอา


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai 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 ใช่หรือไม่ครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung 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 ของแต่ละตัว  น่าจะความหมายเดียวกันรึเปล่านะครับ เหอะๆ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 20, 2013, 12:09:05 AM
จาก code
พอเรากดแป้นพิมพ์ 1 ครั้ง จะทำให้ ทั้ง master และ slave เข้าสู่ interrupt
สำหรับ slave นั้น จะได้ค่า อักขระ มา 1 ค่า และจะรอรับค่าต่อไป ก็ต่อเมื่อเราต้องกด แป้นพิมพ์ อีก ครั้ง ใช่หรือไม่ครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: maxmkung 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);     


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 21, 2013, 12:33:39 AM

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);     
[/quote]

ขอโทษนะครับ ผมขอถามนิดนึงครับ

ผมดู code ในส่วนของ Slave ที่เป็นเงื่อนไขในส่วนของ case ครับ
ผมยังไม่พบว่า มันจะเข้าสู่เงื่อนไขใน case '2' เลยครับ มันจะเข้า case '1' อย่างเดียว เนื่องจากว่า ข้อมูลที่อยู่ใน dat[1] จะเป็น 1 อย่างเดียว
ซึ่งเมื่อดูจาก master ที่ส่งมาให้นั้น ของ slave 1 จะมี 111 และ 110 ซึ่ง dat[0] = 1 , dat[1] = 1 และ dat[2] จะมีได้ 2 ค่า คือ 1 และ 0 ขึ้นอยู่กับการ
อ่านค่าเข้ามา จะเห็นว่า dat[1] จะมีค่า 1 อย่างเดียว ดังนั้น มันก็เลยไม่เข้า เงื่อนไข ของ case '2' เลยครับ
ในทำนองเดียวกัน slave 2 ก็เช่นเดียวกันครับ

ในส่วนนี้ ผมเข้าใจถูกต้องหรือไม่ครับ
 



Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 21, 2013, 01:01:18 PM
อีกข้อนะครับ

code ในส่วนของ master ถ้าเรากด key ใด ๆ แล้วหลังจากนั้น จะวิ่งเข้าสู่การทำงาน ของ interrupt จากนั้นจะไม่กลับมาทำงานที่ main ต่อ อะ ครับ
การทำงานจะหยุดไปเลย ครับ เข้าใจว่า จะวน loop อยู่ใน interrupt ตลอดเวลา (เพราะได้รับค่า key ไปแล้ว 1 ครั้ง จึงเกิดการ intterupt อยู่ตลอดเวลา)

ขอบคุณครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: Wiz on January 22, 2013, 10:04:01 AM
เพิ่มบรรทัดนี้

Code:
clear_interrupt(int_RDA);

ลงไปในส่วนท้ายของฟังก์ชั่น slave_isr() ครับ ที่ค้างเพราะมันไม่ได้เคลียร์ flag ครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 22, 2013, 10:34:10 AM
เพิ่มบรรทัดนี้

Code:
clear_interrupt(int_RDA);

ลงไปในส่วนท้ายของฟังก์ชั่น slave_isr() ครับ ที่ค้างเพราะมันไม่ได้เคลียร์ flag ครับ

ต้องเพิ่มใน master_isr() ใช่หรือไม่ครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: Wiz on January 22, 2013, 06:10:32 PM
จริง ๆ ควรจะเพิ่มโค้ดนี้ลงทั้ง master_isr() และ slave_isr() ครับ เพราะตัวโค้ดจะเป็นการ clear interrupt flag ปกติต้องเคลียร์อยู่แล้วครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 23, 2013, 02:35:42 AM
จริง ๆ ควรจะเพิ่มโค้ดนี้ลงทั้ง master_isr() และ slave_isr() ครับ เพราะตัวโค้ดจะเป็นการ clear interrupt flag ปกติต้องเคลียร์อยู่แล้วครับ

คุณ WIZ ครับ
code interrupt ในส่วนของ master_isr() ผมได้ใส่ clear_interrupt (int_RDA) ตามคำแนะนำ แล้ว  แต่ไม่สามารถ พอเรา กด key  ใด ๆ แล้วทำไมมันค้าง
คือมันไม่กลับมา run ใน คำสั่ง main ต่อ ผมได้ลอง ใส่ clear_interrupt (int_RDA) กับไม่ใส่ ก็ยังคงค้าง ไม่กลับมา run ใน คำสั้ง main ต่อเช่นเดิม ครับ
พอจะทราบสาเหตุหรือไม่ครับ 


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: Wiz on January 23, 2013, 07:56:02 AM
คุณ WIZ ครับ
code interrupt ในส่วนของ master_isr() ผมได้ใส่ clear_interrupt (int_RDA) ตามคำแนะนำ แล้ว  แต่ไม่สามารถ พอเรา กด key  ใด ๆ แล้วทำไมมันค้าง
คือมันไม่กลับมา run ใน คำสั่ง main ต่อ ผมได้ลอง ใส่ clear_interrupt (int_RDA) กับไม่ใส่ ก็ยังคงค้าง ไม่กลับมา run ใน คำสั้ง main ต่อเช่นเดิม ครับ
พอจะทราบสาเหตุหรือไม่ครับ 

ลองใส่ getch(); ไว้ที่ master_isr() อีกบรรทัดครับ อาจต้องเคลียร์ buffer ด้วยถึงจะ clear flag หมด

แต่ถ้ายังไม่ได้อาจต้องรบกวนให้ลงโค้ดปัจจุบันครับ เพราะตอนนี้ผมอ้างอิงจากโค้ดของท่าน maxmkung อาจมีบางส่วนที่แก้ไขไปแล้วไม่ตรงกันครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 23, 2013, 12:44:35 PM

ลองใส่ getch(); ไว้ที่ master_isr() อีกบรรทัดครับ อาจต้องเคลียร์ buffer ด้วยถึงจะ clear flag หมด

แต่ถ้ายังไม่ได้อาจต้องรบกวนให้ลงโค้ดปัจจุบันครับ เพราะตอนนี้ผมอ้างอิงจากโค้ดของท่าน maxmkung อาจมีบางส่วนที่แก้ไขไปแล้วไม่ตรงกันครับ

ผมได้ลอง getchar() แล้ว หลุดออกจาก master_isr() ได้ครับ
ขอบคุณครับ 
สำหรับการ clear_interrupt flag ถ้าใช้ CCS เราสามารถ ตรวจสอบได้หรือไม่ว่า มีการ clear หรือไม่ หรือว่า เราต้องใช้ MPLAB ตรวจสอบดูครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: Wiz on January 23, 2013, 04:01:52 PM
ผมได้ลอง getchar() แล้ว หลุดออกจาก master_isr() ได้ครับ
ขอบคุณครับ 
สำหรับการ clear_interrupt flag ถ้าใช้ CCS เราสามารถ ตรวจสอบได้หรือไม่ว่า มีการ clear หรือไม่ หรือว่า เราต้องใช้ MPLAB ตรวจสอบดูครับ

interrupt flag ตรวจสอบด้วย ccs ได้ครับ แต่ผมไม่เคยใช้ฟังก์ชั่นสำเร็จรูปของ ccs เลยไม่รู้ว่ามีฟังก์ชั่นที่ทำหน้าที่แบบนี้หรือเปล่า
เคยแต่ declare #byte ให้ตรงกับ register แล้วเช็คเอาโดยตรงครับ อาจดูถึก ๆ หน่อย แต่ผมว่าโค้ดที่ได้มันตรงประเด็นดีครับ

Code:
#byte PIR1 = 0x0C		// //Register PIR1 ดูจากดาต้าชีท
#bit RCIF = PIR1.5 // Bit 5 ของ PIR1 คือ RCIF : UART received interrupt flag

// เวลาใช้ก็
if (RCIF)
{
RCIF = 0; // Clear flag
}


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 26, 2013, 05:05:18 PM


interrupt flag ตรวจสอบด้วย ccs ได้ครับ แต่ผมไม่เคยใช้ฟังก์ชั่นสำเร็จรูปของ ccs เลยไม่รู้ว่ามีฟังก์ชั่นที่ทำหน้าที่แบบนี้หรือเปล่า
เคยแต่ declare #byte ให้ตรงกับ register แล้วเช็คเอาโดยตรงครับ อาจดูถึก ๆ หน่อย แต่ผมว่าโค้ดที่ได้มันตรงประเด็นดีครับ

Code:
#byte PIR1 = 0x0C		// //Register PIR1 ดูจากดาต้าชีท
#bit RCIF = PIR1.5 // Bit 5 ของ PIR1 คือ RCIF : UART received interrupt flag

// เวลาใช้ก็
if (RCIF)
{
RCIF = 0; // Clear flag
}
[/quote]

ผมว่า ดีนะครับ ไม่ถึกหรอก เข้าใจดีครับ

การที่เราจะกำหนด ค่าลงไปถึงระดับ register เราก็ต้อง เข้าใจ register ของ MCU นั้น ๆ  แต่เสียดายนะครับ
หนังสือบ้านเราไม่ค่อยมีใคร เขียนออกมาให้ละเอียด ได้ถึงขนาดนั้นครับ ต้องอ่านจาก TEXT เอา ซึ่งแปลผิดบ้างถูกบ้างตามประสา

ขอบคุณครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: Wiz on January 27, 2013, 11:04:12 AM

ผมว่า ดีนะครับ ไม่ถึกหรอก เข้าใจดีครับ

การที่เราจะกำหนด ค่าลงไปถึงระดับ register เราก็ต้อง เข้าใจ register ของ MCU นั้น ๆ  แต่เสียดายนะครับ
หนังสือบ้านเราไม่ค่อยมีใคร เขียนออกมาให้ละเอียด ได้ถึงขนาดนั้นครับ ต้องอ่านจาก TEXT เอา ซึ่งแปลผิดบ้างถูกบ้างตามประสา

ขอบคุณครับ


ที่น่าเสียดายคือตัว ccs ไม่สนใจตรงนี้ครับ เค้าเน้นให้ใช้ integrated function ของเค้า ซึ่งแน่นอนว่าหลังคอมไพล์จะมี code ขยะเพียบ
ล่าสุดเขียนโปรแกรมทดสอบ concept ที่แรกก็เขียนให้เห็นผลของ algorithm ครับ แต่บังเอิญต้องการความแม่นของเวลามาก ๆ ผลที่ได้ไม่ตรงกับคอนเซปต์เลยสักนิด
พอเปลี่ยนมา declare register เองบางส่วนถึงพอใช้ได้ ..พอได้ concept แล้วเปลี่ยน compiler ทันที 555


การ declare register ต้องมาทำเองทั้งหมด ถ้าใช้เบอร์ใหม่นี่ก็ต้องไล่เปิดดาต้าชีทเช็ค address เอง

ทุกวันนี้ก็เลี่ยง ๆ ใช้ครับ หนีมาใช้ hitech c16 แทน
ที่ต้องใช้ ccs เพราะเมื่อก่อน pic16 มีแค่ ccs กับอีกเจ้ามั้งครับที่ทำภาษาซี เลยจำใจต้องใช้

ตอนนี้ microchip มี hitech c เป็น official compiler แล้วแนะนำให้เปลี่ยนมาตัวนี้ดีกว่าครับ โครงสร้างภาษาได้มาตรฐานกว่า ต่อไปทำงานจะได้ติดเป็นนิสัยครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 27, 2013, 04:21:17 PM

ที่น่าเสียดายคือตัว ccs ไม่สนใจตรงนี้ครับ เค้าเน้นให้ใช้ integrated function ของเค้า ซึ่งแน่นอนว่าหลังคอมไพล์จะมี code ขยะเพียบ
ล่าสุดเขียนโปรแกรมทดสอบ concept ที่แรกก็เขียนให้เห็นผลของ algorithm ครับ แต่บังเอิญต้องการความแม่นของเวลามาก ๆ ผลที่ได้ไม่ตรงกับคอนเซปต์เลยสักนิด
พอเปลี่ยนมา declare register เองบางส่วนถึงพอใช้ได้ ..พอได้ concept แล้วเปลี่ยน compiler ทันที 555


การ declare register ต้องมาทำเองทั้งหมด ถ้าใช้เบอร์ใหม่นี่ก็ต้องไล่เปิดดาต้าชีทเช็ค address เอง

ทุกวันนี้ก็เลี่ยง ๆ ใช้ครับ หนีมาใช้ hitech c16 แทน
ที่ต้องใช้ ccs เพราะเมื่อก่อน pic16 มีแค่ ccs กับอีกเจ้ามั้งครับที่ทำภาษาซี เลยจำใจต้องใช้

ตอนนี้ microchip มี hitech c เป็น official compiler แล้วแนะนำให้เปลี่ยนมาตัวนี้ดีกว่าครับ โครงสร้างภาษาได้มาตรฐานกว่า ต่อไปทำงานจะได้ติดเป็นนิสัยครับ


อ้าว.... หรอ ครับ
ผมเล่น CCS มาสักระยะนึงแล้ว และก็เริ่มคุ้น ๆ กับ complier ตัวนี้    ถ้าสมมุติ ว่า ถ้าผมเปลี่ยนมาใช้ Hitech C ผมต้อง เรียนรู้คำสั่งอะไรใหม่ ๆ หรือว่ารูปแบบคำสั่งจะเปลี่ยนไปมากมั๊ยครับ  หรือว่าจะเข้าใจได้ง่าย กว่า CCS  ครับ
ผมเห็น ตามท้องตลาด เขาขายหนังสือ CCS กัน ก็เลยเริ่มที่ CCS ครับ   แต่ไม่ค่อยเห็น Hitech C เลยครับ พอจะหาอ่านได้ที่ไหนบ้างครับ

แล้วตัว Hitech C มี Module มาฐานให้ หรือเปล่าครับ เช่น LCD หรือ I2C เป็นต้น เพื่อให้เราศึกษาและนำไปใช้ครับ

ขอบคุณครับ แนะนำด้วยครับ




Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: Wiz on January 29, 2013, 12:28:02 PM
ถ้าเป็น library ของ compiler ตัวอื่นจะมีเป็นลักษณะของ module สำหรับตั้งค่า internal hardware module น่ะครับ ไม่มีเป็น library สำหรับ software i2c หรือ lcd อะไรพวกนี้

นี่คือข้อแตกต่างชัด ๆ ของ ccs กับคอมไพเลอร์อื่น ๆ เลยครับ

ccs เริ่มง่าย มีโมดูลฟังก์ชั่นให้ แต่พอใช้ไป advance ขึ้นจะไม่ตอบสนองด้านความแม่นยำ
ส่วนตัว hitech จะเริ่มยากครับ จะต้องหา download ไลบรารี่มาแปลงเอง เริ่มเองทั้งหมด ตั้งค่ารีจิสเตอร์ hardware module เอง สั่งงาน lcd เอง แต่ทุกอย่างจะควบคุมได้เองทั้งหมดครับ


Title: Re: มีเรื่องให้ช่วยครับ PIC16F628A กับ rs232
Post by: akekachai on January 29, 2013, 11:54:14 PM
ถ้าเป็น library ของ compiler ตัวอื่นจะมีเป็นลักษณะของ module สำหรับตั้งค่า internal hardware module น่ะครับ ไม่มีเป็น library สำหรับ software i2c หรือ lcd อะไรพวกนี้

นี่คือข้อแตกต่างชัด ๆ ของ ccs กับคอมไพเลอร์อื่น ๆ เลยครับ

ccs เริ่มง่าย มีโมดูลฟังก์ชั่นให้ แต่พอใช้ไป advance ขึ้นจะไม่ตอบสนองด้านความแม่นยำ
ส่วนตัว hitech จะเริ่มยากครับ จะต้องหา download ไลบรารี่มาแปลงเอง เริ่มเองทั้งหมด ตั้งค่ารีจิสเตอร์ hardware module เอง สั่งงาน lcd เอง แต่ทุกอย่างจะควบคุมได้เองทั้งหมดครับ


เข้าใจครับ 
ถ้างั้นผมคงเล่น CCS ไปสักพักก่อน แล้วค่อย ลงลึกเรื่อง Hardware แล้วค่อย มาเล่น Hitech แทน น่าจะดี นะครับ
ให้รู้ภาพกว้าง ๆ ก่อน อะ ครับ

ขอบคุณครับ
ที่แนะนำ