เคยสงสัยเล่นๆ ว่าทำไม CPU หรือ MCU ของแต่ละบริษัทที่ผลิตออกมาจำหน่าย ถึงมีการกำหนดความถี่ของสัญญาณนาฬิกาที่แตกต่างกัน แต่ก็พอจะเข้าใจแบบเหมารวมไปว่าก็คงเป็นเรื่องของเทคนิคการออกแบบและเทคโนโลยีของการผลิตตามยุคสมัย ซึ่งก็คงจะเหมือนๆกันกับ CPU ของเครื่องคอมพิวเตอร์ที่เมื่อกว่า 30 ปีก่อนที่มีความเร็วไม่กี่สิบ MHz จนปัจจุบันปาเข้าไปกว่า 3~4GHz เข้าไปแล้ว ยิ่งเร็วก็ยิ่งดีและก็เป็นเรื่องของการแข่งขันทางการตลาดด้วย
แต่จริงๆ แล้วหากศึกษาในรายละเอียดลึกๆ ลงไป ทำให้เข้าใจเหตุผลเชิงลึกของบางแง่มุมของมันด้วย ดังยกตัวอย่าง MCU ของตระกูล MCS-51 ซึ่งผมได้อ่านเจอจากคู่มือการใช้งานเล่มหนึ่งซึ่งได้อธิบายไว้ดังนี้ครับ
MCU 8051 มีวงจรออสซิลเลเตอร์อยู่ภายในสำหรับการสร้างพัลส์ของสัญญานนาฬิกา ซึ่งจะนำไปเป็นฐานเวลาหรือการกำหนดจังหวะการทำงานของหน่วยการทำงานทั้งหมดให้สอดคล้องกัน (Synchronization) โดยปกติแล้วมักจะทำโดยการใช้คริสตอลเชื่อมต่อเข้ากับขาสัญญาณ XTAL1 และ XTAL2 และมีตัวเก็บประจุต่อลง GND หรืออาจจะเป็นสัญญาณนาฬิกาจากวงจรภายนอกก็ได้
พัลส์ความถี่ของสัญญาณนาฬิกาจะเรียกว่า Pulse (ใช้สัญลักษณ์ตัวอักษร P) และคาบเวลาสัญญาณนาฬิกานี้เรียกว่า คาบเวลาออสซิลเลเตอร์ (Oscillator period)
คาบเวลาออสซิลเลเตอร์จำนวนสองคาบเรียกว่า State (ใช้สัญลักษณ์เป็นตัว S) ซึ่งจะนำไปใช้เป็นช่วงเวลาพื้นฐานการทำงานย่อยของไมโครคอนโทรลเลอร์ เช่น
การนำคำสั่ง (Fetch)
การถอดความหมาย (Decode)
การประมวลผล (Execute)
และการเขียนข้อมูล (Write) เป็นต้น
ดังแสดงในรูป ช่วงเวลาของ State จำนวนหกครั้งจะเรียกว่า Machine Cycle ดังนั้นค่าหนึ่งแมชชีนไซเคิลจะใช้เวลา 12 คาบเวลาออซซิลเลเตอร์
ค่าของ Machine Cycle นี้จัดว่าเป็นช่วงเวลาที่น้อยที่สุดในการทำคำสั่งใดคำสั่งหนึ่ง ซึ่งหากว่าเป็นคำสั่งที่ซับซ้อนมากก็จะต้องใช้เวลานานสองถึงสาม Machine Cycle
การคำนวนหาว่าเวลาที่ใช้ในการทำคำสั่งใดจนเสร็จสิ้น จะต้องดูว่าคำสั่งนั้นใช้จำนวน Machine Cycle เป็นเท่าใดในการประมวลผล (ดูได้จากคู่มือสรุปคำสั่งทั้งหมดของ MCU) เวลาที่ใช้จะคำนวนตามสูตร
T = C x 12 / Crystal Frequency
โดย C = ค่าจำนวน Machine Cycle ของคำสั่ง
Crystal Frequency = ค่าความถี่ของ Crystal ที่ใช้กับ 8051
ตัวอย่างเช่น
เวลาในการทำคำสั่ง ADD A,R1 ซึ่งต้องการ 3 Machine Cycle
เมื่อใช้ Crystal 16 MHz จะเป็นเวลานาน 0.75 uS
เมื่อใช้ Crystal 12 MHz จะเป็นเวลานาน 1 uS เป็นต้น
อย่างไรก็ตาม ในทางปฏิบัติหรือการใช้งานจริงมักจะพบเห็นการใช้ค่าของ Crystal เป็น 11.059 MHz ซึ่งจุดนี้เองที่ผมเข้าใจว่าเหตุผลน่าจะมาจากเป็นค่าความถี่ที่หาซื้อได้ง่ายในท้องตลาด แต่ที่จริงแล้วมันมีเหตุผลเนื่องจากสามารถนำค่าความถี่ที่ได้นี้ไปใช้ในการเป็นฐานเวลาสำหรับการสร้างความถี่ในการ รับ/ส่ง ข้อมูลอนุกรมซึ่งเป็นหน่วยการทำงานหนึ่งภายใน 8051 เอง โดยจะทำให้ได้ค่าที่ใกล้เคียงกับค่ามาตรฐานคือ 19200, 9600, 4800, 2400, 1200, และ 300 bit/S ซึ่งจะได้กล่าวอีกครั้งในเรื่องการส่งข้อมูลแบบอนุกรม
อย่างไรก็ตามอาจจะมีเหตุผลอื่นๆ อีกด้วย และสำหรับ CPU หรือ MCU เบอร์อื่นๆ ที่ไม่ได้ใช้ค่าความถี่ของ Crystal เท่าที่อธิบายยกตัวอย่างมานี้ก็ไม่ได้มีปัญหาอะไร เพราะในเทคนิคของการเขียนโปรแกรมบน MCU แต่ละเบอร์มันแตกต่างกัน (กำหนดค่าคงที่สำหรับตัวหารของ TIMER COUNTER แตกต่างกันไปตามการออกแบบ) และหากผู้ใช้งานใช้ภาษา C ในการเขียน CODE ก็ยิ่งไม่ต้องสนใจมันเท่าไหร่นัก เพราะ Compiler จะไปจัดการแปลงเป็นค่า HEX ที่เหมาะสมให้โดยอัตโนมัติ