Review วิชา Embedded ที่เจ้าของบล็อกกำลังเรียน~


ที่มาของบทความนี้คือ อีกไม่กี่วันเจ้าของบล็อกก็จะสอบกลางภาคแล้ว เจ้าของบล็อกก็เลยอยากจะมาลองสรุปในแต่ละหัวข้อที่ได้เรียนในวิชานี้ดูหน่อย


โหหห นี่คือเนื้อหาที่จะสอบ Midterm ค่อนข้างเยอะเลยทีเดียว แต่คิดว่า เจ้าของบล็อกก็คง Review ในส่วนที่จำเป็น คงไม่ลงรายละเอียดลึกทั้งหมด ถ้าเอาหมดนี่บทความนี้คงไม่จบแน่เลย ฮ่า ๆ

Microcontroller

ว่ากันตามตรงแล้ว Microcontroller มันก็คือ Computer เครื่องนึงนี่แหละ เพียงแต่เป็น Computer ที่ถูกย่อส่วนลงมาเหลือแค่ตัว Chip เล็กนิดเดียว ที่เจ้าของบล็อกพูดอย่างนี้ก็เพราะว่าในตัว Microcontroller มันได้ยัดทุกอย่างไว้ใน Chip แล้ว

รูปภาพจาก : https://www.edgefxkits.com/blog/wp-content/uploads/Architecture-of-PIC-Microcontroller.jpg

ถ้าพูดถึงอุปกรณ์ใน computer เราก็จะรู้ว่ามันมี CPU , RAM ,Hardisk etc. ซึ่งทั้งหมดเนี่ย มันรวมกันอยู่ใน Microcontroller ตัวเดียวเลย 

Registers

register จริง ๆ แล้วมันก็คือวงจร electronic ที่สามารถเก็บค่าบางอย่างได้ ซึ่งค่าบางอย่างที่ว่านี้มันก็อ้างอิงจากหลาย ๆ cell ที่อยู่ภายใน SRAM ซึ่งแต่ละ cell มันก็จะเก็บค่าสถานะ 0 หรือ 1 ไว้

รูปภาพจาก : https://iis-people.ee.ethz.ch/~kgf/aries/5.html
รูปนี้คือหน้าตาของ Cell ใน SRAM ที่เก็บค่า 1 Bit ไว้ โดยการต่อ Not Gate สลับกัน ถ้าดูลึกไปอีก มันก็คือการเอา transister มันต่อกันแบบ Not Gate

รูปภาพจาก : https://iis-people.ee.ethz.ch/~kgf/aries/5.html

เมื่อเรานำแต่ละ Cell มาต่อรวมกันหลาย ๆ Cell เป็น Array ก็เลยกลายเป็น SRAM Architecture เพราะภายใน SRAM จะมี Cell พวกนี้ต่อกันเยอะมาก

รูปภาพจาก : https://moodle.insa-toulouse.fr/pluginfile.php/2632/mod_resource/content/0/content/static_ram.html

ในเรื่องของ register ยังมีอีกเรื่อง ก็คือ SFRs (Special Function Registers) ความพิเศษของ register พวกนี้คือ มันจะผูกกับวงจรภายใน โดยวงจรภายในพวกนี้ อาจจะเอาไปควบคุม Output แต่ละ pin หรือ อ่านค่าบางอย่างแต่ในแต่ละ pin ก็ได้ รวมทั้งกำหนดสถานะบางอย่างให้กับ Microcontroller เช่น การ Setup Interrupt หรือ Timer ต่าง ๆ

Microcontroller ของเราสามารถอ่านหรือเขียนข้อมูลลงบน register นี้ได้ตรง ๆ หรือจะพูดอีกอย่างก็คือ การทำงานของ Microcontroller จะขึ้นอยู่กับ register พวกนี้


Arduino interfacing a serial eeprom using SPI
ยกตัวอย่าง register ตัวนี้ ซึ่งมีขนาด 1 Byte และในแต่ละ bit ก็มีความหมายในตัวของมันเอง เช่น ถ้าเจ้าของบล็อกกำหนดให้ bit ที่ 7 มีสถานะเป็น 1 นั่นหมายความว่าเรากำลังสั่งให้ Microcontroller เปิดใช้งาน SPI interrupt อยู่นั่นเอง และยังมี register อีกหลายอย่างที่เอาไว้ใช้งานต่าง ๆ กันไป แต่ขอไม่พูดถึง เพราะเดี๋ยวจะเยอะ ข้ามไปเรื่องอื่นดีกว่า


งงเว้ยยยยย ว๊ากกก picture_link


Microcontroller Programming

ในส่วนนี้ไม่พูดเยอะ เจ็บคอ... ไม่ใช่ ๆ!! ฮ่า ๆ จั่วหัวมาอย่างนี้คือเขียนตามหัวข้อใน slide ที่เจ้าของบล็อกเรียนเลยนะ แต่ก็ไม่ได้ Programming อะไรขนาด เป็นแค่พื้นฐานจำเป็นที่ต้องใช้ใน Programming น่าจะเหมาะกว่า

ระบบจำนวน

อันนี้ก็ถือว่าสำคัญนะ เพราะเวลาเขียนพวก Low level อย่าง Embedded เนี่ยเราจะเห็นตัวเลขหลายแบบมาก เช่น ระบบตัวเลขฐาน 2 ฐาน 10 ฐาน 16 ที่เจ้าของบล็อกบอกว่าสำคัญ ง่าย ๆ คือมันใช้บ่อย เลยคิดว่ามันคือสิ่งที่ต้องรู้อยู่แล้วเวลาทำงานพวก embedded

การแปลงเลขฐาน

ก่อนหน้านี้ที่บอกว่าเห็นตัวเลขหลายแบบ ก็มาจากการแปลงเลขฐานนี่แหละ เพราะงั้นสำคัญพอ ๆ กันเลย คือเราต้องรู้จักวิธีการแปลงเลขฐาน ซึ่งเดี๋ยวจะบอกวิธีแปลงง่าย ๆ ที่เจ้าของบล็อกชอบทำ

Keywords ที่ควรรู้ (มั้ง)

  • Bit เป็นหน่วยที่เล็กที่สุด ที่เก็บค่าแค่ 1 หรือ 0
  • Nibble คือหน่วยที่นำ Bit จำนวน 4 ตัวมาต่อกัน
  • Byte คือหน่วยที่นำ Bit จำนวน 8 ตัวมาต่อกัน
  • Word คือหน่วยที่นำ Bit จำนวนเท่ากับระบบปฎิบัติการของเครื่องมาต่อกัน เช่น MCU 16 Bit Word ก็จะมี Bit 16 ตัวต่อกันอยู่นั่นเอง

วิธีแปลงเลขฐาน

เราก็มาดูในแต่ละ step กันดีกว่าว่าทำยังไงถึงจะง่าย มีผู้อ่านบอกใช้เครื่องคิดเลขก็จบละ ฮ่า ๆ เห่ยยย เราก็ต้องเผื่อกรณีที่ไม่มีเครื่องคิดเลขด้วยไงง มา ๆ เริ่มง่าย ๆ ก่อน



อันดับแรกเจ้าของบล็อกจะเขียนอย่างนี้ไว้ก่อน มี 8 ตัว เลขที่อยู่ข้างในมันก็คือเลข 2 ยกกำลังตามเลขที่อยู่ด้านบนนั่นแหละ ถ้าเจ้าของบล็อกต้องการหาว่า 71 ในเลขฐาน 2 เขียนยังไง ก็ตามรูปด้านล่างเลย



เจ้าของบล็อกก็จะเลือกตัวเลขจากค่าที่มากที่สุดที่ไม่เกิน 71 มาก่อน ก็คือ 64 จากนั้นก็หาเลขอื่น ๆ มาเรื่อย ๆ จนได้เลข 4 เลข 2 และ 1 ที่รวมกันทั้งหมดแล้วเป็น 71 ถ้าทำจนชินแล้ว ก็ทดเลขในใจแล้วแปลงเลขตรง ๆ ก็ยังได้เลย โดยไม่ต้องเขียนเป็นตารางแบบนี้

การทำแบบนี้มันยังสะดวกเวลาเราจะเอาไปหาเลขฐาน 16 อีกนะ ตามรูปด้านล่างเลย


เลขฐาน 2 ที่เราหามาได้ เราสามารถ group รวมทีละ 4 bit ได้เลยพอเรา group แล้ว นั่นหมายความว่าแต่ละ group จะมีค่าตั้งแต่ 0 - 15 ซึ่งค่าพวกนี้ก็คือเลขฐาน 16 นั่นเอง โดยระบบเลขฐาน 16 ค่าตั้งแต่ 10 - 15 จะแทนด้วยตัวอักษร A - F เพราะงั้นถ้าเราคำนวณได้ตั้งแต่ 10 ขึ้นไป เราก็แทนตัวอักษรเข้าไป อย่าแทนตัวเลขเข้าไปละ เดี๋ยวผิด

อย่างที่บอกว่าใช้บ่อย ๆ เราก็จะคิดในใจได้เลย ลองเอาไปหัดดูได้ หรือมีวิธีอะไรใหม่ ๆ ก็แนะนำเจ้าของบล็อกด้วยนะ

Logic circuits / Operators

ตรงนี้ถ้าให้พูดจริง ๆ เนื้อหาก็จะเยอะอีก เจ้าของบล็อกแค่มา review เอาเป็นว่า ยกตัวอย่างบทความที่ใช้ในงานจริงดีกว่า มาออกแบบ Protocol ไว้สื่อสารกันเถอะ แนะนำว่าอย่าอ่านตอนนี้ดีกว่า หรือถ้าพอมีเวลาก็ลองเข้าไปอ่านในบทความที่แปะให้ ก็จะเห็นว่ามันสามารถเอาไปใช้ในการส่งข้อมูลหรือเข้ารหัสได้อีกหรืออื่น ๆ อีกเยอะ


นี่คือส่วนของโปรแกรมว่า Operater หรือตัวดำเนินการในระดับ bit มีหน้าตายังไงบ้าง และก็เทียบกับรูปด้านล่าง

https://learn.adafruit.com/binary-boolean-and-logic/logic-gates

สภาพตอนนี้ ขนาดแมวยังปวดหัว picture link

Memory

เราก็มาถึง ส่วนที่เยอะที่สุดกันแล้ว แต่โชคดีที่เจ้าของบล็อกเคยเขียนบทความคล้าย ๆ กันไว้ ซึ่งเนื้อหาที่เรียนกับที่เขียนในบทความก็คล้าย ๆ กัน เพียงแค่ใช้ Chip คนละตัวแค่นั้น
โยนมาโป้งเดียวเลย ฮ่า ๆ แต่ว่าใน link ที่ให้ไปมีเรื่องที่ยังไม่ได้พูดถึงเหมือนใน slide อยู่ ก็จะมาอธิบายในหัวข้อนี้ละกัน

Electrically Erase Programmable ROM (EEPROM)

จริง ๆ เล่าคร่าว ๆ ในบทความ ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม ตอนที่ 1 ว่าเป็นยังไงแล้ว แล้วก็บทความ ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม ตอนที่ 4 ที่ลงรายละเอียดส่วนนึงให้ดูว่า EEPROM ทำงานยังไง แต่จะขอเพิ่มอีกนิดนึงให้กับตัว EEPROM ซักหน่อย

ถ้าพูดถึงการเก็บข้อมูลแล้ว ข้างในวงจรมันก็มีพวก transister ต่าง ๆ นั่นแหละ แต่สิ่งที่ทำให้ EEPROM ยังเก็บข้อมูลและยังรักษาข้อมูลไว้ได้ ขณะบอร์ดไม่ได้จิ้มไฟ ตรงนี้ก็เพราะความพิเศษของ transistor ที่เอามาใช้ใน EEPROM ก็คือ floating gate transistor พูดเข้าใจง่าย ๆ ตัว floating gate มันจะคล้าย ๆ กับ capacitor ช่วงที่เขียนข้อมูลมันจะเก็บสถานะไว้ภายใน floating gate และเพราะว่ามันคล้ายกับ capacitor จำเป็นต้องมาการ charge ประจุเข้าไป มันจึงใช้เวลาส่วนนึงในการเก็บข้อมูล ทำให้การเก็บข้อมูลแบบ EEPROM จะช้ากว่าแบบ SRAM ค่อนข้างสูง และเขียนข้อมูลได้ทีละ byte ด้วย ถ้าใครจะลงลึกอีกนิดเกี่ยวกับวิธีเก็บข้อมูลใน EEPROM ก็ดูจากบทความ EEPROM เก็บข้อมูลยังไงนะ 

SRAM & DRAM

SRAM (Static Random Access Memory) มันก็คือหน่วยความจำที่สำคัญอย่างนึงใน Microcontroller นั่นแหละ ข้อดีของมันคือเร็วมากก memory ในส่วนนี้เป็นส่วนที่เรียกใช้บ่อยมาก เพราะงั้นมันต้องเร็ว



รูปภาพจาก : https://iis-people.ee.ethz.ch/~kgf/aries/5.html

ใน 1 cell จะมี transister ต่ออยู่ด้วยกันประมาณ 4-6 ตัว ลักษณะการต่อจะเป็น Not gate 2 ตัวสลับกัน ใน 1 cell จะเก็บได้แค่ 1 Bit เท่านั้น

รูปภาพจาก : https://iis-people.ee.ethz.ch/~kgf/aries/5.html

ในส่วนของ DRAM (Dynamic Random Access Memory) 1 cell จะเก็บได้แค่ 1 Bit เหมือนกันกับ SRAM เพียงแต่ว่า DRAM จะใช้ transistor เพียงแค่ตัวเดียวเท่านั้น แต่สิ่งที่เพิ่มขึ้นมาคือ capacitor อีก 1 ตัว เพื่อเอามาใช้เก็บค่าสถานะของ cell นั่นเอง 

https://electronics.stackexchange.com/questions/306002/why-does-a-dram-cell-necessarily-contain-a-capacitor

ด้วยความที่เป็น capacitor มันจึงมีการ charge และ discharge เป็นเหตุทำให้การจะเก็บข้อมูลจำเป็นต้องเขียนใหม่ซ้ำเรื่อย ๆ เพื่อไม่ให้ข้อมูลหาย และการเก็บข้อมูลแต่ละครั้งคือมันก็จะยุ่งยากมากกว่า SRAM หน่อย แต่แลกมาด้วย ขนาดพื้นที่ที่ใช้น้อยกว่า SRAM มาก และราคาถูกกว่า SRAM ด้วย

ถ้าถามว่าเจ้าของบล็อกจะเลือกอันไหน ก็คงเป็น SRAM แน่นอนอยู่แล้ว ถึงแม้จะมีราคาที่แพงกว่า แต่เวลาใช้งานก็สะดวกสบายมากกว่า เน้นความสะบาย ฮ่า ๆ

Cache Memory (CPU Memory)

พูดถึง Cache Memory ในส่วนนี้ การเข้าถึงข้อมูลจะเร็วกว่าหน่วยความจำหลักแน่นอน เพราะว่าในส่วนนี้มันอยู่ภายใน CPU แต่ถึงจะเร็วกว่าแต่ก็แลกมาด้วยขนาดที่น้อยลงเช่นกัน

เราสามารถเข้าถึง memory เหล่านี้ผ่าน keyword register ในภาษา c นั่นเอง เพราะมันจะเรียกใช้ memory ใน CPU ให้เลย แต่ข้อควรระวังคือ register ไม่มี address เหมือนใน SRAM เพราะงั้น register จึงเหมาะกับการทำงานที่เน้นความเร็ว ไม่เน้นคำนวณนาน ๆ compiler บางตัวในภาษา c จะมีแจ้งเตือนถ้าหากใช้ register ผิดวิธี




Digital Input Port and Digital Output Port

กำลังเขียน..



_____________________________________________

reference

หนังสือ ภาษา C ฉบับสมบูรณ์ พ.ศ.2556



ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม : รู้จักกับ Memory

คณิตศาสตร์กับโปรแกรมมิ่งมันเป็นยังไงนะ ตอนที่ 1 เกริ่นพีทาโกรัส

Pointer กับตัวแปร Array นะจ๊ะ.. [Back to basic แต่ไม่ basic]