Electoday 4.0

ไมโครคอนโทรลเลอร์ => Microchip PIC => Topic started by: TaoTao on May 12, 2013, 09:07:18 pm

Title: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on May 12, 2013, 09:07:18 pm
คือ กำลังจะรวบรวม โค้ด ที่เคยสร้างๆ ไว้
เป็น Library เพื่อ ง่ายในการอ่าน การเรียกใช้ และดูไม่รกตา

ใครพอจะ ไกด์ไลน์ ได้บ้างน่ะครับ

เพราะตอน Create มีมีอะไรให้เลือก มากมายไปหมด งงเจงๆ @_@!

เลยยังทำไม่สำเร็จครับ อ่านหนังสือ เห็นมันก็บอกง่ายๆ ว่า ทำนามสกุลเป็น
*.h และไม่ต้องมี main()

เวลาใช้ ก็ include เข้ามา
แต่ ลองแล้ว ก็ยังไม่สำเร็จ ไม่รู้จะ Link มันยังไง

อ้อ ผมใช้ MPLAB_X น่ะคร๊าบบบ

@_@! @_@! @_@!
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: p_chusak on May 12, 2013, 10:08:48 pm
เอาแบบผมใหม ผมใช้ตอนเขียนใหม่ๆ จนป่านนี้ก็ยังใช้รูปแบบเดิมคือ
   1.สร้างเฉพาะ file.c แล้วเขียน comment ไว้ว่าใน file นั้นมี function อะไรบ้าง และส่วนของการตั้งค่า hardware ก็ defineไว้ที่หัว file ตัวแปรที่ใช้งานสำคัญก็ประกาศเป็น global ในนั้นเลย
   2.include มาทั้ง file เลยโดยใช้การ include ผ่าน code ใน main ผมไม่นิยมการ add ผ่าน IDE เพราะว่าเราจะงงเอง IDE แต่ละตัวจัดการไม่เหมือน  การ include โดยใช้หลักการพื้นฐานของภาษา C ที่ว่า ทุก function ที่จะใช้จะต้องมีการประกาศก่อนใช้งาน เราจะใช้อะไร ก็แค่ จัดการ include อยู่บนหัวของตัวที่จะใช้
   3. เมื่อเรา include ใส่ไว้ใน code แล้ว เราก็เอาเข้ามาใน ide เพื่อทำการแก้ใขได้ ใน MPLABX นั้นเราไปตั้งค่าของ file ให้เป็น exclude from project เพื่อไม่ให้มันซ้ำซ้อนกับการ include ใน code เราครับ
     
     ผมทำแบบนี้ตลอด เพราะว่าขี้เกียจประกาศ .h อีกที เสียเวลา ตัว compiler เดี่ยวนี้มันฉลาด แม้เราจะ include แต่ถ้าไม่ใช้มันจะตัดทิ้งให้เอง ตอนทำงานจริงๆ มันจะมี file ใช้งานไม่มากหรอกครับ ซ้ำกันแทบทุก project
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: Chairat on May 12, 2013, 10:12:38 pm
ลอง Copy ไฟล์เฮดเดอร์ไปใส่ใน โฟลเตอร์ include ของ Compiler ท่านดูครับ
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: p_chusak on May 12, 2013, 10:25:47 pm
อันนี้เป็นรูปแบบที่ผมชอบใช้ อาจจะไม่ถูก หรือ ดีที่สุด แต่ผมชอบที่สุด
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: JENG on May 12, 2013, 10:52:39 pm
อันนี้เป็นรูปแบบที่ผมชอบใช้ อาจจะไม่ถูก หรือ ดีที่สุด แต่ผมชอบที่สุด

ใช้เหมือนกันเลยป๋าชู เคยทำ .h .c แยกแล้วให้ compile link ให้
พอเปลี่ยน compile บางทีใช้ไม่ได้เฉย แถมเวลาแก้มันจะงงมาก
หลังๆมา .c อันเดียว อยากใช้อะไรก็ include เข้าไป ชีวิตง่ายขึ้นเยอะ ...  ;D
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on May 12, 2013, 11:48:20 pm
อันนี้เป็นรูปแบบที่ผมชอบใช้ อาจจะไม่ถูก หรือ ดีที่สุด แต่ผมชอบที่สุด

แฮ่ๆ ได้ลองแล้วบ้างครับ
ลองแบบ ง่ายๆ คอมไพล์ยังไม่ผ่านเลย T_T!
ไม่รู้ว่าขาดอะไรไป
ทุกที จะทำเป็นแต่ ฟังค์ชั่น และการเรียกใช้งานน่ะครับ

ผมลองโค้ด ง่ายยยยยๆ แบบนี้น่ะครับ
อันนี้ ใน newmain.c

//----------------------------------- newmain.c-----------------------------------------------------------------
#include <xc.h>

#include "Lib.c"

int y;

void main (){
    y=func(2);
}


อันนี้ ใน Lib.c ครับ
//--------------------------------------------- ใน Lib.c ----------------------------------------------------------

#include <xc.h>

int func(int x){
    return(x+x);
}
//-----------------------------------------------------------------------------------------------



มันขึ้น error อย่างนี้น่ะครับ
//--------------------------------------------- E r r o r------------------------------------------------------------------
Lib.c:3: error: function "_func" redefined
(908) exit status = 1
make[2]: *** [dist/default/production/Test_include_c.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory `C:/Users/mr.TaoTao/Desktop/Test include/Test_include_c.X'
make[1]: Leaving directory `C:/Users/mr.TaoTao/Desktop/Test include/Test_include_c.X'


ขอบคุณล่วงหน้าครับ
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: Wiz on May 13, 2013, 01:00:26 am
แบบท่าน p_chusak ก็สะดวกดีครับ ใช้ได้แน่นอนกับทุกคอมไพเลอร์ แต่เพิ่มเติมนิดนึงตอนตั้งชื่อตัวแปรโกลบอลและฟังก์ชั่น ต้องให้แน่ใจว่าต่างจากของเก่าที่เคยเขียนไว้ครับ

ส่วนตัวผมชอบแบบแยก .c .h มากกว่าครับ ใช้ pre-processor ช่วยจัดการพารามิเตอร์ ตอนทำงานอาจจะยุ่งยากนิดหน่อยแต่เข้ากันได้กับงานของคนอื่น ๆ ข้อดีข้อเสียก็ต่างกันไปครับ

สำหรับบางคอมไพเลอร์ที่มีปัญหากับระบบหลาย source file ก็จำใจใช้วิธี include .c เหมือนกันครับ
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on May 13, 2013, 02:53:29 am
เหอะๆ ใช่ประมาณว่า

1. เอาฟังก์ชั่นที่เคยใช้ มาโยกไว้อีกเอกสาร Lib.c อันนึง

2. และ #include ที่บนหัวกระดาษ ของ main.c

3. และ เรียกใช้ฟังก์ชั่น ได้เลย จากหน้าของ main.c หรือเปล่าครับ

ทำไมผมลองแล้ว มันบอก ฟังชั่นที่เรียกใช้ใน main.c  ขึ้นว่า "function redefined"

@_@!

มันต้องเพิ่มเติมตรงไหนอีกอ่ะครับ
ลองมั่ว มาหลายกระบวนท่าละ ยังคอมไพล์ไม่ผ่าน

@_@   @_@   @_@
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: p_chusak on May 13, 2013, 08:56:10 am
ตอนเอา file เข้ามาใน ใน mplabX ให้คลิ๊กขวาที่ file เลือก properties แล้วเลือก exclude from build เพราะว่าหาเราไม่เลือก ตัว IDE จะ include ให้เราอีกทีนึง
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on May 13, 2013, 07:58:29 pm
ได้ แว้วววววว 

โอ้วว จอร์จ มันยอดมากกกกกกก ทำตามแว้ว ได้ทันทีเลย
ไม่ได้ทำ Exclude from build นี่เอง ที่ทำให้ Complies ไม่ผ่าน

ขอบคุณมากคร๊าบบบบ
    ___/|\___

ชีวิตที่ง่ายยยย ขึ้น  อิอิ
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: jele99 on May 18, 2013, 02:19:37 pm
ตอนเอา file เข้ามาใน ใน mplabX ให้คลิ๊กขวาที่ file เลือก properties แล้วเลือก exclude from build เพราะว่าหาเราไม่เลือก ตัว IDE จะ include ให้เราอีกทีนึง

น่าสนใจดีครับ ท่านพี่ 'ผมขอลองมั่งนะ ;D
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on May 19, 2013, 12:09:24 am
ตอนเอา file เข้ามาใน ใน mplabX ให้คลิ๊กขวาที่ file เลือก properties แล้วเลือก exclude from build เพราะว่าหาเราไม่เลือก ตัว IDE จะ include ให้เราอีกทีนึง

น่าสนใจดีครับ ท่านพี่ 'ผมขอลองมั่งนะ ;D

มานั่งยันอีกรอบก๊าบบบ
วิธีนี้ ยอดเยี่ยมกระเทียมดอง

เดิม เอกสารเดียว เป็นพันบรรทัด  @_@!
พอกระจายออก เป็น หมวดหมู่ต่างๆ.C

ชีวิตง่ายขึ้นมากเลยยยยย
มาขอบคุณอีกครั้งกับน้ำใจอันงดงามทั้งสองท่านนะครับ

:-)
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: wlasoi on May 19, 2013, 03:17:08 am
ผม ยังนิยมแบบ Include หูดับ ตับใหม้อยู่ ครับ ....  พอดีส่วนมากจะพัฒนา  *.c , *.h  เองเป็นหลัก เลยมักจะไม่ค่อยมี ความงงเท่าไหร่ ... ปกติก็เขียน gcc AVR เป็นหลักอยู่แล้ว ชิวมาก สำหรับ PIC ..  ซึ่งการทำแบบนี้ มันมีเทคนิคอยู่ ครับ .. จะวางตัวแปรยังไง ประกาศตัวแปรยังไง extern ออกนอก function ยังไง .. การสร้าง function ต้องมีลำดับการ สร้าง .. function ไหนจะ in/out นอก files ต้องวางแผน ทำมั่วซั่วๆ stack overflow โดยเฉพาะพวก interrupt .. แต่ทำทำบ่อยๆ คุ้นเอง .. มันจะช่วยให้งานง่ายขึ้นเยอะ copy pase ในไม่กี่นาทีก็เสร็จ แต่มือใหม่นี่ มีหงายหลัง ... ก็ต้องใช้เวลาและประสบการณ์  หลังๆมาเริ่ม บ้า #define บ้าเลือดก ;D เหมือน Microchip Libary ซ่ะด้วย ... ใช้ง่ายสบายดี แต่จะเสียเวลาตอรทำ libary ปวด หัว สุดๆ ...

ลองเขียนพวก RTOS หรือ STack TCP ครับ ....เยอะแยะ หูดับตับใหม้ .. เวลาย้ายเครื่องทีปวดหัว folder ไม่ตรง files หาย .. ผมเลยเริ่มทำวิธีการ pack project file พวกนี้ เข้ารวมกัน .. ย้ายเครื่องเปิด project file มา compile เลย .. แต่ล่ะ IDE ทำไม่เหมือนกัน บางตวต้องแก้ Include กันใหม่ ...แก้ part บางตัวก็ไม่ต้องตั้งทีเดียว เจอหมดก็มี ..  ;D
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: p_chusak on May 19, 2013, 01:06:47 pm
ตอนนี้ Microchiip Application Library ตัว 2013 ล่าสุด จัด file กับ folder ใหม่ดูง่ายขึ้นมาก หากใครต้องการดูการจัดระเบียบ library ให้ลองโหลดมาเปิดตัวอย่างดูครับ 
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on May 26, 2013, 05:53:31 pm
เอ...
ล่าสุด แปลกมากครับ

ผม สร้าง header.h เพื่อเก็บ global
จากนั้น สร้าง Function1.c, F2.c, F3.c, ...
ปรากฏว่า ไม่ต้องคลิกขวา มันก็คอมไพล์ผ่านน่ะครับ
Debug ก็ผ่าน ทีนี้ ยิ่ง งง ใหญ่เลย

@_@!
แต่ก็ไม่เป็นไร ใช้งานได้

แต่ก็ยัง งงงง ในหลักการที่ถูกต้องน่ะครับ

ขอบคุณทุกๆท่าน ที่เข้ามาตอบน่ะครับ
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: p_chusak on May 27, 2013, 05:44:47 pm
หลักการมันก็คือ
ถ้าเรา include file.c ใดๆ เข้ามาใน code หลักการมันก็จะเป็นเหมือนเอา text มาต่อๆ กันเป็น file เดียว ดังนั้นการ include หากไม่ต้องการบอก main ว่าจะใช้ ก็ประกาศ include ก่อน function main ไปเลย ที่นี้มันจะมีปัญหาว่า เกิดตัว function ย่อย ของอีก file หนึ่ง ต้องการใช้ function ของ อีก file หนึ่ง มันจะยุ่งยากที่จะมานั้งลำดับการ include ซึ่งจะทำไม่ได้เลย ถ้า สอง file เรียกใช้ function แบบ ไขว้กันไปมา จึงเป็นที่มาของ function protype ต่อไป  ซึงจะนิยมประกาศไว้ใน header file ครับ หรือ file.h
   รบกวน เจ้าของกระทู้หาข้อมูลของ file .h เพิ่มครับ เพราะผมก็ไม่แม่นเหมือนกันครับ ทุกวันนี้ผมยังสับสนอยู่เลย เพราะว่าตัว IDE เองมีการจัดการตรงนี้ด้วย แต่ผมไม่นิยมให้ ide จัดการ ผมจะใส่ไว้ใน code ทั้งหมดเพื่อความชัว แม้แต่ file.h ผมก็ใส่ใน code
    รบกวนลองเขียน code ใน file.h เป็น code C เต็มๆเลยครับ ที่ไม่ได้มีเฉพาะ function prototype หรือ global variable ผมว่าจะให้ผลที่แตกต่างกันด้วยครับ
   
   
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: jele99 on May 28, 2013, 07:32:40 pm
เอ...
ล่าสุด แปลกมากครับ

ผม สร้าง header.h เพื่อเก็บ global
จากนั้น สร้าง Function1.c, F2.c, F3.c, ...
ปรากฏว่า ไม่ต้องคลิกขวา มันก็คอมไพล์ผ่านน่ะครับ
Debug ก็ผ่าน ทีนี้ ยิ่ง งง ใหญ่เลย

@_@!
แต่ก็ไม่เป็นไร ใช้งานได้

แต่ก็ยัง งงงง ในหลักการที่ถูกต้องน่ะครับ

ขอบคุณทุกๆท่าน ที่เข้ามาตอบน่ะครับ

อันนี้เป็นตัวอย่าง Library ที่ผมทดลองทำใช้เองกับ MPLAB-X แบบ Complete code (คล้ายๆกับเขียนC#)นะครับ
สร้างยากนิดนึง แต่ใช้งานง่ายครับ ไม่ต้องจดจำชื่อฟังก์ชัน พิมพ์ปุ๊บ ก็จะมี เมมเบอลิสต์ขึ้นมาให้เลือกปั๊บ โดนใจมากๆเลยสำหรับ MPLAB-X ตัวนี้ (นี่...............................................เอง)
Title: Re: >> อยากสร้างเป็น Library ไว้ใช้งานเองน่ะครับ
Post by: TaoTao on June 04, 2013, 06:16:44 pm
ก็ ขอขอบคุณทุกๆ คนมากเลยนะครับ

ตอนนี้ ล่าสุด เริ่มเข้าใจขึ้นมากๆ เลย หลังจากที่หลายๆ คน มี ตย มาให้ดู
ผมได้ทดลอง โค้ดกับ Complier หลายๆ ตัว และชิบ หลายยี่ห้อ

จุดลงตัวสำหรับผม ปรากฏว่า เป็นการ ผสมผสานน่ะครับ

คือ มีทั้ง *.h
อันนี้ ผมไว้เก็บ Var ประกาศฟังก์ชั่นที่มี  และผนวกโค้ด initial ของ MCU แต่ละเบอๆ ไปเลย

ส่วน *.c ก็ เก็บ Lib ไว้ให้ main มันเรียกใช้

ผมเจอปัญหาหลายๆ อย่าง อย่างที่หลายๆ คนได้ชี้แนะไว้เลยครับ

แต่ก็ พอใช้วิธีผสมกัน ความวุ่นวายก็น้อยลง ดูง่ายขึ้น และปรับแต่งได้หลากหลาย

โค้ด สามารถปรับ เปลี่ยนไปตามเบอร์ MCU
และก็ เปลี่ยนข้ามยี่ห้อได้ไม่วุ่นวายนัก

โดย #include แยกเฉพาะ เบอร์ MCU และค่าย ไว้เป็น mcu.h ไปเลย 555+
ทั้ง Initial config , varible , global_var และมีหัวของฟังชั่น
(เผื่อเวลา ฟังชั่นมันใช้งาน ไขว้กัน อย่างที่ เม้น ข้างบนบอกไว้เลย ก๊าบบบ)

ส่วน Lib.c นี่ เป็น ส่วนกลาง ใครใครใช้ ก็ใช้  อิอิ