บทความ

ฟังก์ชันอินเตอร์รัปต์ใน c standard mode กับ MPLAB X IDE และ XC Compiler V2.2 (หรือสูงกว่า)

รูปภาพ
ในหนังสือ PIC16F MPLAB XC8 (PIC16F Programming กับ MPLAB XC8 Compiler) โค้ดส่วนที่เกี่ยวกับการเขียนฟังก์ชันอินเตอร์รัปต์จะประกาศใช้งานแบบนี้ ซึ่งเป็นการสร้างฟังก์ ชันอินเตอร์รัปต์ที่ใช้ c standard C90 static void interrupt isr(void)  {     … } เมื่อเราติดตั้ง MPLAB X และ XC8 Compiler เวอร์ชันใหม่ ค่าเริ่มต้น (default) ของ c standard ได้เปลี่ยนไปเป็น C99 แล้วในปัจุบัน การเขียนชื่อฟังก์ชันอินเตอร์รัปต์จึงเปลี่ยนไปเป็นดังนี้ 
 void __interrupt() isr(void) {     ….
 } *** ถ้าคอมไพล์โค้ดโปรแกรมจากต้นฉบับไม่ผ่านแสดงว่า เราใช้ mode C90 อยู่ วิธีแก้ไขคือ 
 1. เปลี่ยนไปใช้โหมดเดิมคือ C90 2. แก้ไขชื่อฟังก์ชันอินเตอร์รัปต์ใหม่ให้เป็นแบบ C99
 รายละเอียดด้านล่าง // Interrupt function all static void interrupt isr(void)     // c standard mode: C90
 {   if (RBIE && RBIF)    // RB Port change-on   {     PORTA = 0x0f;     __delay_ms(1000);     PORTB = 0;...

ฟังก์ชัน millis() กับ ARDUINO

รูปภาพ
ฟังก์ชัน millis() กับ ARDUINO เรารู้มาว่าฟังก์ชัน millis() จะนับและเพิ่มค่าเวลาไปเรื่อย ๆ ในหน่วยมิลลิวินาที และจะนับต่อเนื่องไปอย่างน้อย 50 วัน ก่อนที่จะกลับมาเริ่มต้นนับ 0 ใหม่อีกครั้ง หากต้องการให้เริ่มต้นนับ 0 ทุกครั้งที่ต้องการ เราสามารถเขียนโค้ดได้ดังตัวอย่างตามรูปนี้ ปล. นอกจากนีั้เรายังกำหนดค่าเริ่มต้นการนับได้ตามที่เราต้องการด้วย ด้วยการกำหนดค่าในตัวแปร timer0_millis

ความผิดพลาดที่ต้องระมัดระวังในการโค้ด C/C++

รูปภาพ
โค้ดโปรแกรมนี้มีความผิดพลาดเกิดขึ้น และเราอาจมองข้ามไปโดยไม่รู้ตัวได้ ลองหาแล้วตอบคำถามดูนะครับ :)

อยากรู้วิธีการเขียนไลบรารีของ Arduino

รูปภาพ
สวัสดีครับอาจารย์.. ต้องขออภัยถ้าข้อความนี้มาในเวลาดึก นะครับ คือ ผม อยากสอบถามครับ ว่า ผมอยากจะ หัดเรียนรู้ หัดเขียน โปรแกรม ทาง ฝั่งไลเบอรี่ของอดุยโน่ ถ้าผมเรียกไม่ผิด คือภาษา C++ อาจารย์มีหนังสือแนะนำไหมครับ..จุดประสงค์ อยากสร้างไลเบอรี่เอง และ ดัดแปลงไบเบอรี่ที่มีอยู่.. พื้นฐานผม ภาษาซีลงลึกถึงรีจิสเตอร์ได้ครับ ขอบคุณครับผม ด้วยความเคารพ 1. เริ่มต้นที่ C++ จากหนังสือเล่มไหนก็ได้ครับ ในอินเตอร์เน็ตก็ได้ครับ 2. ศึกษาการเขียนโค้ดแบบ AVR ครับด้วยภาษา C เพราะจะเป็นการเข้าถึงรีจิสเตอร์ต่าง ๆ ของ AVR ครับ 3. จากนั้นลองดูตัวอย่างไลบรารีของ Arduino โดยตรงเลยครับว่าเขาเขียนกันแบบไหน ดูแบบวิว ๆ ไปก่อน โดยเราต้องมีความรู้ใน ข้อที่ 1 และ 2 แล้ว 4. จากนั้นไปดูข้อกำหนดการเขียนไลบรารีที่ www.arduino.cc ครับ ตาม link ครับ เพื่อให้เขียนได้ถูกต้องตามข้อกำหนดของเขา (จริง ๆ แล้วเขียนสไตล์เราก็ได้ แต่ไม่แนะนำครับ) https://www.arduino.cc/en/Reference/Libraries https://www.arduino.cc/en/Hacking/LibraryTutorial https://www.arduino.cc/en/Reference/APIStyleGuide ***ตอนนี้ Arduino แบ่ง...

ฟังก์ชัน SerialEvent กับ Arduino

รูปภาพ
โดยปกติแล้วในการเขียนโปรแกรมติดต่อกับพอร์ตอนุกรม ในบางงานเราต้องการรับข้อมูลอนุกรมในรูปแบบของอินเตอร์รัปต์ คือ ส่วนของโปรแกรมหลัก ยังคงทำงานไปอย่างต่อเนื่อง ถ้ามีข้อมูลเข้ามาที่พอร์ตอนุกรม เราจึงจะค่อยเข้าไปอ่านข้อมูลจากบัพเฟอร์รับข้อมูล เราสามารถทำงานในรูปแบบนี้ได้ด้วยฟังก์ชัน SerialEvent ที่ Arduino ได้เตรียมไว้ให้ใช้งานดังนี้  จากโค้ดโปรแกรมจะเห็นได้ว่าเราไม่ต้องค่อยตรวจสอบข้อมูลอนุกรมในฟังก์ชัน loop() โดยปล่อยให้ฟังก์ชัน loop() ยังคงทำงานแสดงการติดดับของ LED ที่ขาพอร์ตดิจิตอลหมายเลข  13ไปอย่างต่อเนื่องทุก ๆ 100 มิลลิวินาที ส่วนฟังก์ชัน serialEvent() ก็ค่อยรับข้อมูลจากพอร์ตอนุกรม เมื่อมีข้อมูลมาที่พอร์ตอนุกรมฟังก์ชัน serialEvnet จะถูกเรียกใช้งานโดยอัตโนมัติ พร้อมอ่านข้อมุลจากพอร์ตอนุกรมด้วยฟังก์ชัน Serial.read() และเขียนข้อมูลไปที่พอร์ตอนุกรมด้วยฟังก์ชัน Serial.println() ในลำดับถัดไป  ลองนำไปทดลองเล่นกันดูนะครับ :)

เพิ่มเลขศูนย์เพื่อใช้ในการแสดงวัน 2016/04/09 และเวลา 16:04:09

รูปภาพ
โดยปกติเวลาเราจะแสดงตัวเลขของ วันเดือนปีและเวลา ของนาฬิกา เรานิยมที่จะใส่เลขศูนย์หน้าตัวเลขที่แสดงตัวเลขเพียงหลักเดียว ตัวอย่างเช่น รูปแบบของ ปี/เดือน/วัน เช่น 2016/4/9 เราจะนิยมที่แสดงในรูปแบบ 2016/04/09 คือมีการแทรกเลขศูนย์หน้าตัวเลขหลักเดียว เช่น 2016/12/9 เราจะนิยมที่แสดงในรูปแบบ 2016/12/09 เป็นต้น  รูปแบบของ ชั่วโมง:นาที:วินาที เช่น 16:4:9 เราจะนิยมที่แสดงในรูปแบบ 16:04:09 คือมีการแทรกเลขศูนย์หน้าตัวเลขหลักเดียว เช่น 16:12:9 เราจะนิยมที่แสดงในรูปแบบ 16:12:09 เป็นต้น เราสามารถแทรกตัวเลขศูนย์เพิ่มเข้าไปได้ด้วยเทคนิคง่าย ๆ กับโค้ดโปรแกรมต่อไปนี้ ผลลัพธ์ที่ได้ เทคนิคนี้ได้มาจากตัวอย่างโปรแกรม DS1302_Serial ครับ :)

ตัวแปรและชนิดข้อมูลในภาษา C

รูปภาพ
+ การเขียนโปรแกรมด้วยภาษา C + . หนึ่งในเรื่องที่สำคัญของภาษา C คือ เราต้องรู้ขนาดของข้อมูลที่ตัวแปรแต่ละตัวสามารถเก็บได้ เพราะ - เวลาเก็บข้อมูลจะได้เก็บได้อย่างถูกต้อง - เมื่อมีการวนลูป การวนลูปจะได้ถูกต้อง - เพื่อเป็นการใช้งานของหน่วยความจำได้อย่างเหมาะสม . ภาพนี้คือ ชนิดข้อมูลที่มีการใช้งานภายในคอมไพเลอร์ PIC C หรือ CCS สำหรับไมโครคอนโทรลเลอร์ PIC/dsPIC