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

Posts: 22


« Reply #15 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 ก็เช่นเดียวกันครับ

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

Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #16 on: January 21, 2013, 01:01:18 PM »

อีกข้อนะครับ

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

ขอบคุณครับ
Logged
Wiz
Guest
« Reply #17 on: January 22, 2013, 10:04:01 AM »

เพิ่มบรรทัดนี้

Code:
clear_interrupt(int_RDA);

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

Posts: 22


« Reply #18 on: January 22, 2013, 10:34:10 AM »

เพิ่มบรรทัดนี้

Code:
clear_interrupt(int_RDA);

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

ต้องเพิ่มใน master_isr() ใช่หรือไม่ครับ
Logged
Wiz
Guest
« Reply #19 on: January 22, 2013, 06:10:32 PM »

จริง ๆ ควรจะเพิ่มโค้ดนี้ลงทั้ง master_isr() และ slave_isr() ครับ เพราะตัวโค้ดจะเป็นการ clear interrupt flag ปกติต้องเคลียร์อยู่แล้วครับ
Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #20 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 ต่อเช่นเดิม ครับ
พอจะทราบสาเหตุหรือไม่ครับ 
Logged
Wiz
Guest
« Reply #21 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 อาจมีบางส่วนที่แก้ไขไปแล้วไม่ตรงกันครับ
« Last Edit: January 23, 2013, 08:05:11 AM by Wiz » Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #22 on: January 23, 2013, 12:44:35 PM »


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

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

ผมได้ลอง getchar() แล้ว หลุดออกจาก master_isr() ได้ครับ
ขอบคุณครับ 
สำหรับการ clear_interrupt flag ถ้าใช้ CCS เราสามารถ ตรวจสอบได้หรือไม่ว่า มีการ clear หรือไม่ หรือว่า เราต้องใช้ MPLAB ตรวจสอบดูครับ
« Last Edit: January 23, 2013, 12:45:29 PM by akekachai » Logged
Wiz
Guest
« Reply #23 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
}
Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #24 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 เอา ซึ่งแปลผิดบ้างถูกบ้างตามประสา

ขอบคุณครับ
Logged
Wiz
Guest
« Reply #25 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 แล้วแนะนำให้เปลี่ยนมาตัวนี้ดีกว่าครับ โครงสร้างภาษาได้มาตรฐานกว่า ต่อไปทำงานจะได้ติดเป็นนิสัยครับ
Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #26 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 เป็นต้น เพื่อให้เราศึกษาและนำไปใช้ครับ

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


Logged
Wiz
Guest
« Reply #27 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 เอง แต่ทุกอย่างจะควบคุมได้เองทั้งหมดครับ
Logged
akekachai
Jr. Member
**
Offline Offline

Posts: 22


« Reply #28 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 แทน น่าจะดี นะครับ
ให้รู้ภาพกว้าง ๆ ก่อน อะ ครับ

ขอบคุณครับ
ที่แนะนำ
Logged
Pages: 1 [2]   Go Up
Print
 
Jump to: