s_engine
|
|
« on: August 26, 2009, 10:28:31 AM » |
|
ท่าน smitdh ครับ พอจะมีข้อมูลให้ศึกษาเกี่ยวกับการสื่อสารแบบ usb ของ pic 18f4550 หรือแนวทางว่าจะต้องเริ่มต้นศึกษา ตรงส่วนไหน ก่อนดีครับ ขอบคุณครับ
|
|
|
Logged
|
|
|
|
|
s_engine
|
|
« Reply #2 on: August 31, 2009, 09:47:00 AM » |
|
ถ้างั้น ผมก็ต้อง เป็น ใน C# ด้วยนะสิครับ เหอะๆ เดี๋ยวจะหา C#มาลงก่อน แต่ โค้ด PIC ทำไม คอมไพล์ ไม่ผ่าน ผมอยากจะเบิร์นลง pic ของผม เพื่อดูผลการทำงาน เขาไม่ได้ให้ไฟล์ .hex มาด้วย ตอนนี้อยากได้แบบ ส่งคำสั่งไป on led สักดวง ผ่าน usb เพื่อเริ่มต้นทำความเข้าใจ แล้ว C# กับ VB ต่างกันไหมครับ คือถ้าจะให้ผมเล่น ผมอยากเล่น VBมากกว่า แต่ก็ไม่เคยเล่นทั้ง 2 ตัว คงมานั่งศึกษากันพอสมควร อีก ระยะทางอีกยาวไกล แต่ก็ต้องทำให้ได้ ถ้ามี ลิ้งค์ ดีๆ แนะนำบ้างนะครับ ขอบคุณ ครับ
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #3 on: September 01, 2009, 12:31:23 AM » |
|
ผมลองคอมไพล์ก็ผ่านนะครับ ทั้ง CCS เวอร์ชั่น 3.249, และ 4.074 ผมคอมไพล์เป็น HEX ไฟล์รวมไว้ให้แล้วลองโหลดดูใหม่ http://www.thaimicrotron.com/Referrence/Journals/Board4550.rar- สำหรับ C# ,VB ผมเองก็ดูๆ แบบผิวเผินครับ พออ่านออก ถอดความได้ - ภาษาที่น่าใช้ก็น่าจะเป็นภาษาซีครับ เพราะเป็นพื้นฐานของหลายๆ ภาษาไปแล้วเช่น Java,Python,php ทำให้พอศึกษาไปแล้ว จะได้โครงสร้างไปอีกหลายภาษา ตัวผมเองใช้ Borland C++ Builder อยู่เพราะง่ายในการพัฒนากับไมโครฯ - แล้วคอมไพล์เลอร์ในระดับไมโครส่วนใหญ่ก็มักจะมีภาษาซี ทำให้เราสามารถใช้รูทีนเดียวกันได้ คือว่าทำรูทีนไว้อันเดียวใช้ได้หมดเลย - บางครั้งในการศึกษาโครงสร้างข้อมูลขนาดใหญ่เช่น GPS จะเขียนลง CCS เลยที่เดียวก็ลำบากเพราะหน่วยความจำ RAM มีน้อย ผมก็นำมาเขียนบน C++ Builder ก่อน(เขียนแบบ ANSI C) เพราะสามารถตรวจสอบและ debug ได้ง่าย พอเสร็จแล้วค่อย copy code มาใส่ใน CCS ทำให้ไม่ต้องโปรแกรม MCU หลายๆ ครั้งเพราะจะทำให้ MCU อายุสั้นลงไปด้วย - ส่วน C# เองไมโครซอฟท์ ก็เอาหลักการมาจาก Java แต่มาทำทำเป็น dot net framework มันก็เลยไม่แตกต่างจาก Java+C มากนักทำให้เราศึกษาต่อไปได้ง่าย PICKit2 ก็ยังใช้ C# เลยแถมยังแจกโค็ดอีก - หนทางอีกยาวไกล แต่ที่สำคัญที่ก้าวแรกครับ
|
|
|
Logged
|
|
|
|
s_engine
|
|
« Reply #4 on: September 01, 2009, 11:00:54 AM » |
|
ขอคุณมากครับ ผมได้มาจาก hobby แล้ว ลองแล้ว ผลปรากฎว่า -led 4 ดวงไม่ทำงาน -อ่านอนาลอคไม่ทำงาน -สวิตช์ 2 ตัว ปล่อยพอร์ตว่าง มันกลับอ่านว่าถุกกดสลับไปๆ อยุ่นั่นตลอดเวลา พอต่อสวิตช์เข้าไป(โดยมี r pullup เรียบร้อย มันแจ้งไม่มีการกด แต่พอกด มันก็ไม่บอกว่าถูกกด ขณะที่มีการต่อสวิตช์ใช้จริง ค่าอนาลอค โชว์ทั้ง 2 ช่อง โชว์มาครึ่งหลอด ทั้งๆไม่ได้ต่อ -lcd แสดงผลได้ดี ส่งข้อความออกได้ แต่ได้แค่ 15 ตัวอักษร แต่เดียวจะลองของท่านพี่ อีกทีครับ
- ขอแถมอีกนิดครับ lcd ขอผมมันรวน ไม่เกี่ยวกับโครงงานนี้นะครับ แค่ทดสอบ lcd มันจะโชว์แค่บรรทัดเดียว ทั้งที่ส่งไป 2 กด รีเซต ก็ กลับมาทำงานปกติ แต่กดรีเซต ซ้ำๆ มันก็เป็นอีกหายไป 1 บรรทัด กดอีก ก็ปกติ เป็นแบบนี้ตลอด ส่วนพอร์ตทุกพอร์ตก่อนหน้านี้ได้ทดสอบโดย สั่ง led ติด ดับ ทีละพอร์ต ทำงานได้ปกติ รีเซตได้ ปกติ ผมลองสั่งled ติดดับพร้อมทั้งโชว์ lcd อีก lcd รวนเหมือนเดิม อีกทั้ง led ก็รวนไปด้วย เป็นเพราะ c รีเซต หรือปล่าว แม้แต่จ่ายไฟครั้งแรก ก็ทำงานได้มั่ง รวนมั่ง ยังไม่ได้เอาไปโรงงานที มันก็ปั่นป่วนซะละ
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #5 on: September 01, 2009, 12:41:23 PM » |
|
ที่ว่าไม่ทำงานหมายถึงในเซมิฯ ใช่ไหมครับ ผมทดสอบดูแล้วก็ใช้ได้ปกติครับ ลองดูวงจรอีกทีนะครับ อินพุตทุกตัวที่ไม่ได้ใช้จะปล่อยลอยไว้ไม่ได้นะครับ ทั้งอนาลอกและดิจิตอล จากวงจรให้ต่อ R pullupไว้ ทุกตัวครับ
|
|
|
Logged
|
|
|
|
s_engine
|
|
« Reply #6 on: September 01, 2009, 04:15:48 PM » |
|
ตอนนี้ ทำงานได้ ทุกอย่างแล้วครับ sd card ไม่ได้เทส มีปัญหาทางฮาร์ดแวร์นิดหน่อยในตอนแรก อันนี้ใช้โค้ดของพี่ และของ hobbypic ลองทั้ง 2 รอบ แล้วก็ที่ผมว่ามัน รวน มันยังเกิดอยู่นะครับ คือการกด รีเซตครับ ผมลองหลาย รอบแล้ว ประมาณนะครับ 1 ใน 5 pic จะไม่ทำงาน 1 ครั้ง ในการกดรีเซต แต่เมื่อทำงานได้ก็จะทำงานได้ปกติ 1. ปัญหาที่เจอ lcd แสดง 1 บรรทัดบนบัซเซอร์ ทำงาน ฟังก์ชั่นอื่นทำได้หมด แต่ การส่งเทค จำไม่ทำงาน ปัญหานี้จะเป็นบ่อยตอนเริ่มจ่ายไฟ ต้องกด รีเซตทุกครั้ง 2. ทุกอย่างหายหมดหรือ lcd แสดงค่าไม่ถูก ทำงานไม่ได้เลย อันนี้จะเกิดขึ้น น้อยหน่อย
ไม่รู้ว่าเป็นที่ pic หรือป่าว แต่ก็เริ่มทำงานได้แล้ว ผมอยากจะให้ท่านเอา โค้ด C# มาลงให้หน่อยครับ ขอบคุณมากครับ
|
|
|
Logged
|
|
|
|
|
s_engine
|
|
« Reply #8 on: September 03, 2009, 01:50:22 PM » |
|
ครับผม ได้แล้วครับ แต่ผมลอง คอมไพล์ มันฟ้อง แบบนี้อะครับ แล้วโค้ด C# นี่ คนละตัวกับ ซอฟแวร์ ที่เขาให้ลองเล่น ใช่ไหมครับ ผมนึกว่าโหลดมาผิด เห็นมี led 4 ดวง send text และ a to d อย่างอื่นไม่มี ที่มัน รวน เป็นเพระโค้ดนะครับผมว่า ผมลอง สั่ง LCD อักษรวิ่งไปมา กดรีเซต ไม่มีปัญหาเลย ก่อนหน้านี้ผมก็เลยลอง โปรแกรม LCD อักษรวิ่ง ผ่าน USB ทาง bootload มันก็เป็นเหมือนกัน อาการเหมือนกันเลย แต่ถ้าโปรแกรมผ่านเครื่องโปรแกรม ทำงานได้ปกติ ครับ ตอนนี้อยากเขียนโค้ด ด้วยตัวเอง ทั้ง pic และ C# เอาแค่กดปุ่มจาก C# แล้ว PIC ส่งไป LED 1 ดวงให้ได้ก่อน เพื่อดูลักษณะการรับส่ง มันมีโปรโตรคอลที่แน่นอนไหมครับ (ผมไม่รุ้เขาใช้คำนี้หรือป่าว ขอเรียกแบบนี้ละกัน ) ว่า 1ชุดที่ส่ง กับ 1ชุดที่รับ มีขนาดของข้อมูลที่แน่นอน มันส่งกันยังไง หรือสามารถกำหนด ขนาดที่จะส่งได้เหมือน การสื่อสารแบบ อนุกรม ในโค้ด pic ลองได้อ่านก็พอจะเข้าใจนิดๆ เหลือ แต่ไฟล์ที่ include เกี่ยวกับ usb ยังไม่ได้อ่าน คืนจะนั่งดูอีกที ขอบคุณครับ
|
|
|
Logged
|
|
|
|
s_engine
|
|
« Reply #9 on: September 08, 2009, 12:26:25 PM » |
|
หลังจาก ลองแล้วลองอีก มา 1 วัน หาส่วนที่ทำ pic ผมรวน ก็ได้เจอว่า การประกาศ #fuses HS // จะใช้งานได้ปกติ #fuses HSPLL // จะต้องรีเซตหลายครั้ง และ การจ่ายไฟครั้งแรกก็ทำงานไม่ได้ ไม่ทราบว่ามันต่างกันยังไงหรอครับ HSPLL เห็นกำหนด clock 48 M แต่ต่อจริงแค่20 ถ้ากำหนด clock 20 จะทำให้การทำงานเร็วกว่าเดิม ผมละงง แล้วก็กลัว หากงานต้องประกาศ HSPLL แล้ว งานผมคงใช้งานจริงไม่ได้แน่ๆ ไม่มีใครมานั่งกดรีเซต อยุ่เวลาก่อนใช้งาน แต่ถ้าเริ่มทำงานได้ก็จะไม่มีปัญหาเลย #include <18F4550.h> #fuses HS,USBDIV,PLL5,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG //#fuses HSpll,BROWNOUT,NOWDT,NOPROTECT,NOLVP,USBDIV,VREGEN,NODEBUG,CPUDIV1,PLL5 //#fuses HS,PUT,BROWNOUT,NOWDT,NOPROTECT,NOLVP
#define CLOCK_SP 20000000 #use delay (clock=CLOCK_SP)
#define use_portd_lcd // define for use portb lcd #include "lcd.c" // use module function #include <math.h>
#define STRING_SIZE 17 #define msg0 "LCD Module Show " #define msg1 " 16x2 character " #define msg2 "Test Running ..." #define msg3 " Left & Right " #define msg4 "Write Character " #define msg5 " on sequence " #define msg6 "Hello World AST."
//** LCD.C : Driver for common LCD modules ******************************* // As defined in the following structure the pin connection is as follows: // B0 = E(enable), B1 = RS, B2 = R/W // B4 = D4, B5 = D5, B6 = D6 // B7 = D7 // LCD pins D0-D3 are not used and PIC B3 is not used.
/*********************************************************************** * Functions prototypes ***********************************************************************/ void LCD_Command(int cm); void LCD_ShiftLeft(void); void LCD_ShiftRight(void); void LCD_MoveRight(char p); void LCD_MoveLeft(char p); void strcpy(char *s1, char *s2); void LCD_String(char *s, int dly); void LCD_Show(void);
/*********************************************************************** * FUNCTION: LCD_Command * DESCRIPTION: LCD Command * PARAMETERS: cm * RETURNED: nothing ***********************************************************************/ void LCD_Command(int cm) {
lcd_send_byte(0,cm); }
/*********************************************************************** * FUNCTION: LCD_ShiftLeft * DESCRIPTION: LCD ShiftLeft * PARAMETERS: nothing * RETURNED: nothing ***********************************************************************/ void LCD_ShiftLeft(void) {
lcd_send_byte(0,0x18); }
/*********************************************************************** * FUNCTION: LCD_ShiftRight * DESCRIPTION: LCD ShiftRight * PARAMETERS: nothing * RETURNED: nothing ***********************************************************************/ void LCD_ShiftRight(void) {
lcd_send_byte(0,0x1C); }
/*********************************************************************** * FUNCTION: LCD_MoveRight * DESCRIPTION: LCD MoveRight * PARAMETERS: p * RETURNED: nothing ***********************************************************************/ void LCD_MoveRight(char p) {
char i;
for(i=0; i<p; i++) { LCD_ShiftRight(); delay_ms(100); } }
/*********************************************************************** * FUNCTION: LCD_MoveLeft * DESCRIPTION: LCD MoveLeft * PARAMETERS: p * RETURNED: nothing ***********************************************************************/ void LCD_MoveLeft(char p) {
char i;
for(i=0; i<p; i++) { LCD_ShiftLeft(); delay_ms(100); } }
/*********************************************************************** * FUNCTION: strcpy * DESCRIPTION: string copy * PARAMETERS: *s1, *s2 * RETURNED: nothing ***********************************************************************/ void strcpy(char *s1, char *s2) {
while(*s1++ = *s2++); }
/*********************************************************************** * FUNCTION: LCD_String * DESCRIPTION: LCD String * PARAMETERS: *s, dly * RETURNED: nothing ***********************************************************************/ void LCD_String(char *s, int dly) {
while(*s!=0) { lcd_putc(*s++); delay_ms(dly); } }
/*********************************************************************** * FUNCTION: LCD_Show * DESCRIPTION: LCD Show * PARAMETERS: nothing * RETURNED: nothing ***********************************************************************/ void LCD_Show(void) {
int i; char str[17];
LCD_Command(0x80); // start 1st line strcpy(str, msg0); LCD_String(str,0); strcpy(str, msg1); LCD_String(str,0); LCD_Command(0xC0); // start 2nd line strcpy(str, msg2); LCD_String(str,0); strcpy(str, msg3); LCD_String(str,0);
delay_ms(1000);
for(i=0; i<16; i++) { LCD_ShiftLeft(); // LCD Shift Left delay_ms(400); }
delay_ms(500);
LCD_Command(0x80); // start 1st line strcpy(str, msg4); LCD_String(str,0); LCD_Command(0xC0); // start 2nd line strcpy(str, msg5); LCD_String(str,0);
for(i=0; i<16; i++) { LCD_ShiftRight(); // LCD Shift Right delay_ms(400); }
delay_ms(500); LCD_Command(0x01); // Clear LCD delay_ms(100); LCD_Command(0x02); // cursor to home LCD_Command(0x0F); // LCD On, & cursor blink delay_ms(200); strcpy(str, msg6); LCD_String(str,1000);
for(i=0; i<2; i++) { delay_ms(1000); LCD_Command(0x08); // LCD Off & cursor off delay_ms(1000); LCD_Command(0x0E); // LCD On, & cursor on }
delay_ms(500); LCD_Command(0x01); // Clear LCD
}
/*********************************************************************** * FUNCTION: Main * DESCRIPTION: This is the main entry point for the program. * PARAMETERS: nothing * RETURNED: nothing ***********************************************************************/ void main(void) {
lcd_init(); // LCD initialize
while(TRUE){ LCD_Show(); }; } โค้ดเป็นตัวอย่างจากหนังสือ inex ครับ แต่มา include 18f4550 มีใครเล่นเบอร์นี้แล้วเจอปัญหาแบบผมมั่ง
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #10 on: September 08, 2009, 05:57:32 PM » |
|
- หากการทดลองทั่วไปเราสามารถกำหนดฟิวส์เป็น #fuses XT <=4MHz #fuses HS > 4MHz
- แต่ในการสื่อสารข้อมูลแบบ USB High speed ของ PIC18Fx550 จะต้องใช้ clock ที่มีความถี่สูง ซึ่งวงจรภายในสามารถสร้างความถี่ Phase Lock Loop (PLL) จากฐานเวลา ที่ใช้คริสตอลปกติครับ โดยการกำนดฟิวส์ เป็นแบบ HSPLL รวมทั้งกำหนดพารามิเตอร์ด้วยเช่น
#fuses HSPLL,USBDIV,PLL5,CPUDIV1,VREGEN +ฟิวส์ตัวอื่นๆ
- ผมทดสอบโปรแกรมที่ใด้มาจากวารสารเซมิฯ แล้วปกติครับ ลองดูวงจรอีกทีครับ โดยเฉพาะที่ขา MCLR
- อีกอย่างหนึ่งครับ ฟังดูแล้วคล้ายๆกับอาการ ของภาคจ่ายไฟ กับ OSC ไม่ทราบว่าต่อวงจรที่ใช้ทดลองอย่างไร บนบอร์เอนกประสงค์ หรือว่าบนโปรโตบอร์ด - ทั้งสองกรณี จะต้องใส่ตัวเก็บประจุ 0.1U แบบมัลติเลเยอร์ หรือเซรามิค กับตัวเก็บประจุอิเล็คโตรไลท์ ประมาณ 4.7U ไว้ใกล้ๆ กับขา VDD ของ MCU ด้วย - สายที่ต่อจากภาคจ่ายไฟไม่ควรจะมีขนาดเล็กเกินไป ต่อตรงมาที่ MCU เลย - คริสตรัลไม่ควรต่อสายยาวเกินไปนัก ต่อไว้ให้ใกล้ MCU ที่สุด และควรต่อตัวเก็บประจุ 20-22PF ทั้งสองด้านลงกราวน์ อย่าคิดว่าแค่ลองเฉยๆ ไม่ต้องต่อ เพราะมันจะรวนมาก เมื่อใช้คริสตอล ที่ความถี่สูงๆ ยิ่งใช้ HSPLL ยิ่งแล้ว จะรวนมาก - การต่อบนโปรโตบอร์ด หากการทดลองขั้นแรก สำเร็จแล้ว ต้องการจะใช้ทดลองอย่างอื่นต่อไป ให้จัดอุปกรณ์บนเบอร์ดใหม่ และรื้อสายมาต่อใหม่ ให้กระชับตัดให้สั้นที่สุด ไม่ต้องเสียดายสาย อย่าปล่อยให้กระรุ่งกระริ้ง เดียวจะไม่คุมกับการเสียเวลา
|
|
|
Logged
|
|
|
|
s_engine
|
|
« Reply #11 on: September 09, 2009, 05:25:32 PM » |
|
เป็นบอร์ดสำเร็จ ที่ผมทำขึ้น ก่อนจะได้ศึกษา PIC ตัวนี้ สั่งทำ แล้วลงอุปกรณ์ ใช้คริสตัน 20 M ต่อกับ C 22pF ทุกขา vcc มี c 0.1u แบบเซรามิค รีเซตใช้ R 4.7k pullup กับ C 0.1 uF แบบเซรามิค ลงกราวด์ ถ้ากำหนดแบบนี้ LCD ของผม ทำงานไม่มีปัญหา อะไรเลย #fuses HS,PUT,BROWNOUT,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) แต่ถ้าแบบนี้จะมีปัญหาทันที HSpll,BROWNOUT,NOWDT,NOPROTECT,NOLVP,USBDIV,VREGEN,NODEBUG,CPUDIV1,PLL5 #use delay(clock=48000000) จากการสังเกตดูใหม่จากโค้ดด้านบน จะพบว่า LCD ที่รวน จะไปแสดง msg อื่น และวิ่งตามปกติ แต่แสดงแค่ บรรทัดเดียว และการโชหายไป 1 การทำงานแรก โดยรวมคือ ทำงานได้แต่ทำขาดไป ส่วนการสื่อสาร USB ก็มีปัญหาแบบเดียวกัน แต่เมื่อเริ่มทำงานได้ ก็จะไม่มีปัญหาหรือผิดพลาดให้เห็น
|
|
|
Logged
|
|
|
|
s_engine
|
|
« Reply #12 on: September 11, 2009, 10:30:13 PM » |
|
ตอนนี้ pic ใช้งานได้แล้วครับ กำลังดูการรับส่งอยู่ การส่งค่า จาก PC ไม่มีปัญหา แต่การ ให้ PC รับค่าจาก PIC นี่สิ คิดไม่ออกเลย การส่งเป็นลักษณะ packet สมาชิกของ data ตัวที่ 1 เป็นโหมด ตัวที่ 2 เป็น สวิตช์ กำลัง ทำ ดิปสวิคช์ 8 ตัว ให้ค่าไป โชว์ ที่ PC ทำ Lebel แสดงแทน LED ผมจะจัด packetที่ส่งจาก PIC ให้อยู่ ลักษณะ ไหนดี ครับ เพราะจะรับ ค่าจากสวิตช์ทั้ง 8 ตัว
|
|
|
Logged
|
|
|
|
|
s_engine
|
|
« Reply #14 on: September 20, 2009, 05:49:42 PM » |
|
ครับ c# ยกมาจากเซมิ ตอนนี้กำลังเล่นอยู่ ติดตรงโค้ด c#นิดหน่อย ไม่เคยเขียน ขอบคุณครับ
|
|
|
Logged
|
|
|
|
|