วันอาทิตย์ที่ 23 มิถุนายน พ.ศ. 2562

ความหมาย 40 ขา Z-80

ขาสัญญาณต่างๆของ Z80

รูปแสดงหน้าที่ขาสัญญาณของ Z80

Z80 เป็นไอซีที่มีขาโดยจะแบ่งตามกลุ่มการใช้งานได้ 6 กลุ่มดังนี้
        1. กลุ่มขากำหนดตำแหน่ง (Address Bus) เป็นกลุ่มที่ใช้ในการระบุตำแหน่งของหน่วยความจำหรือตำแน่งของอินพุต-เอาท์พุต ที่ Z80 จะติดต่อด้วยโดยจะใช้ขา A0 – A15 ในการกำหนดตำแหน่งของหน่วยความจำที่จะติดต่อ และใช้ขา A0 – A7 ในการกำหนดตำแหน่งอินพุต-เอาท์พุต โดยจะเชื่อมต่อเข้ากับกลุ่มสายบอกตำแหน่งหรือแอดเดรสบัส (ADDRESSS BUS) ภายนอกของระบบ
        2. กลุ่มขาส่ง- รับข้อมูล (Data Bus) จะใช้ขา D0 ถึง D7 จำนวน 8 ขา ในการรับข้อมูลเข้าสู่ซีพียูหรือส่งข้อมูลออกไป โดยจะเชื่อมต่อกับ บัสข้อมูล (DATA BUS) ของระบบ การส่ง-รับข้อมูลจะกระทำทีละ 8 เส้น หรือ 8 บิต
        3. กลุ่มขาสัญญาณนาฬิกาและไฟเลี้ยงระบบ (Clock&Power Supply) จะเป็นกลุ่มที่รับสัญญาณนาฬิกาเพื่อกำหนดจังหวะการทำงานของซีพียูและไฟเลี้ยงโดยจะมรขา VCC สำหรับต่อกับไฟเลี้ยง +5 VDC และ ขา GND เป็นขาที่ต่อกับกราวด์ ส่วนขา CLK จะเป็นขาที่ต่อกับสัญญาณนาฬิกา (Clock) ของระบบ
        4. กลุ่มขาควบคุมระบบ (System Control) เป็นกลุ่มขาที่ Z80 ใช้ควบคุมระบบการทำงานต่างๆซึ่งประกอบด้วย
        - M1 เป็นขาแสดงสถานการณ์ทำงานในแมทชีนไซเคิล (Machine Cycle) การเฟทช์คำสั่ง ซึ่งเป็นแมทชีนไซเคิลแรก
        - MREQ เป็นขาที่ซีพียู Z80 ส่งออกมาเป็นสถานะลอจิก 0 เมื่อต้องการติดต่อกับหน่วยความจำ (Memory Request)
        - IORQ เป็นขาที่ซีพียู Z80 ส่งออกมาให้เป็นสถานะลอจิก 0 เมื่อต้องการติดต่อกับอินพุตหรือเอาท์พุต (IO Request)
        - WR จะมีสถานะเป็นลอจิก 0 เมื่อต้องการเขียนข้อมูล (Write) หรือส่งข้อมูลออกจากตัวซีพียู
        - RD จะมีสถานะเป็นลอจิก 0 เมื่อต้องการอ่านข้อมูล (Read) หรือนำข้อมูล เข้ามาในตัวซีพียู
        - REFSH ใช้สำหรับทวน (Refresh) ข้อมูลในกรณีเชื่อมต่อกับหน่วยความจำแรมแบบไดนามิก
        5. กลุ่มขาควบคุมการทำงานของซีพียู (CPU Control) เป็นกลุ่มขาที่ใช้ในการควบคุมการทำงานของ ซีพียู คือ
        - HALT จะมีสถานะเป็นลอจิก 0 เมื่อซีพียูหยุดการทำงาน
        - WAIT เป็นขาที่รับสัญญาณจากภายนอกเพื่อบอกให้ Z80 รอคอย ในกรณีอุปกรณ์ที่จะติดต่อ ด้วยทำงานไม่ทัน
        - INT เป็นขาที่อุปกรณ์ภายนอกส่งขัดจังหวะ (Interrupt) การทำงานของ Z80 เพื่อขอใช้บริการ
        - NMI ทำงานเช่นเดียวกับขา INT แต่ไม่สามารถยับยั้งได้ (Non-Maskable INT) ต้องให้บริการทันที
        - RESET เป็นขาที่ใช้รับสัญญาณรีเช็ต (สถานะลอจิก 0) เพื่อให้ Z80 เริ่มทำงานใหม่
        6. กลุ่มขา ควบคุมบัส (CPU Bus Control) เป็นกลุ่มขาในขอการควบคุมระบบบัสจากซีพียูโดยกลุ่มขาดังกล่าวมักจะใช้กับขบวนการ DMA (Direct memory Addressing) คือการที่อุปกรณ์ภายนอกขอติดต่อกับหน่วยความจำโดยตรง โดยไม่ต้องผ่านซีพียู เพื่อความรวดเร็วในการถ่ายโอนข้อมูล ประกอบด้วย
        - BUSRQ เป็นขาที่อุปกรณ์ภายนอกส่งออกมาเพื่อแจ้งการขอใช้บัส (BUS Request) จาก Z80
        - BUSAK เป็นขาที่ Z80 แจ้งตอบรับให้อุปกรณ์ภายนอกใช้บัส BUS ได้ (BUS Acknowledge) 

วันอังคารที่ 11 มิถุนายน พ.ศ. 2562

Arduino

1. Arduino คือ ไมโครคอนโทรลเลอร์ (Microcontroller) ชนิดหนึ่ง ซึ่งหมายถึง อุปกรณ์ที่ใช้สำหรับควบคุม หรืออ่านค่าบางสิ่ง ถ้าให้เปรียบเทียบมันก็คือคอมพิวเตอร์ขนาดเล็กนั่นเอง แต่มีราคาที่ถูกกว่าคอมพิวเตอร์มาก

ตัวอย่าง arduino board รุ่น UNO
             ค่าว่า arduino นั้นไม่ใช่ชื่อของไมโครชิพ (Microchip) เป็นแค่เพียงชื่อแบรนด์ที่ออกแบบรูปทรงและเพิ่มอุปกรณ์เสริมเข้าไปบนบอร์ดเพื่อให้เราใช้งานได้ง่ายขึ้น เช่น ช่องสำหรับเสียบ usb ช่องเสียบสายสัญญาณ ชุดแปลงไฟฟ้าก่อนเข้าไปเลี้ยงบอร์ด เป็นต้น และเราสามารถใช้แค่ไมโครชิพอย่างเดียวได้แต่ค่อนข้างยุ่งยาก สำหรับการทดลองหรือทำสิ่งประดิษฐ์จึงนิยมใช้เป็นบอร์ดสำเร็จแบบ arduino บอร์ดมากกว่า และยังมีโปรแกรมสำเร็จรูปที่ให้เราใช้กันฟรีๆ เพื่อใช้ในการเขียนโปรแกรม ชื่อของโปรแกรมคือ arduino ide สามารถโหลดใด้จากเว็บ https://www.arduino.cc/ 
  ตัวอย่างรูปร่างหน้าตาของโปรแกรม arduino ide


        Arduino board มีหลายรุ่น ซึ่งแต่ละรุ่นจะมีราคาและคุณสมบัติที่แตกต่างกันออกไป ตัวอย่างของบอร์ด arduino เช่น arduino UNO, arduino MEGA2560, arduino YUN เป็นต้น โดยที่รุ่นที่เป็นที่นิยมมากสุดน่าจะเป็น arduino UNO เนื่องจากมีราคาที่ถูก มีช่องสัญญาณที่สามารถเสียบได้ง่าย จึงถูกนำไปใช้อย่างแพร่หลาย อย่างเช่นในเครื่องมินิ CNC เครื่อง 3D Printer เป็นต้น


         Arduino board นั้นไม่มีลิขสิทธิ์ หรือที่เรียกกันอีกชื่อว่า Open source นั่นแปลว่าใครสามารถผลิตมันขึ้นมาก็ได้ดังนั้นบอร์ด arduino จึงมีหลายราคาโดยที่ arduino มีจุดเริ่มต้นมาจากอิตาลี ราคาบอร์ด arduino uno ที่สั่งจากอิตาลีมีค่าประมาณ 713.07 บาท ไม่รวมภาษีนำเข้าและค่าขนส่ง ส่วนราคาบอร์ด arduino uno ที่สั่งซื้อในไทยนั้นอยู่ที่ราคาประมาณ 300 บาท ดังนั้นหากเห็นบอร์ดที่ราคาแตกต่างกันมากนั้นอย่าตกใจครับ และก็จะมีคำถามว่าแล้วคุณภาพหละ!! หลายคนบอกว่าไม่แตกต่างกันครับ 


          ทุกวันนี้มีการทำเซ็นเซอร์และอุปกรณ์เสริมต่างๆที่สามารถใช้กับบอร์ด arduino ได้ทันทีอยู่มากมาย ทำให้สะดวกในการทดลองหรือใช้ในงานทั่วไป ส่วนโค้ดที่ใช้กับเซ็นเซอร์แบบต่างๆนั้นก็หาได้ง่ายเช่นกันสำหรับคนที่ไม่ได้มีความชำนาญมากก็สามารถใช้ได้เช่นกัน โค้ดสามารถโหลดได้ฟรีครับตัวอย่างเว็บไซต์ที่ใช้ในการโหลดคือเว็บ https://github.com/ 

       โดยที่เรามีตัวอย่างคุณสมบัติของ arduino uno แสดงในตารางด้านล่างนี้
MicrocontrollerATmega328P
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limit)6-20V
Digital I/O Pins14 (of which 6 provide PWM output)
PWM Digital I/O Pins6
Analog Input Pins6
DC Current per I/O Pin20 mA
DC Current for 3.3V Pin50 mA
Flash Memory32 KB (ATmega328P) of which 0.5 KB used by bootloader
SRAM2 KB (ATmega328P)
EEPROM1 KB (ATmega328P)
Clock Speed16 MHz
LED_BUILTIN13
Length68.6 mm
Width53.4 mm
Weight25 g
หรือเวอร์ชั่นภาษาไทยจะเป็นดังนี้

ไมโครคอนโทรนเลอร์    ATmega328
แหล่งจ่ายไฟ5V
ไฟเข้า(แนะนำ)7-12V
ไฟเข้า (จำกัดไว้ที่)6-20V
ขาดิจิตอล I/O14 ขา (6 รองรับเอาต์พุตแบบ PWM
ขาอะนาล็อกอินพุต6 ขา
กระแสไฟฟ้า DC ต่อขา I/O 40 mA
กระแสไฟฟ้าออก DC สำหรับขา 3.3V50 mA
Flash Memory32 KB (ATmega328)
SRAM2 KB (ATmega328)
EEPROM1 KB (ATmega328)
Clock Speed16 MHz

ตัวอย่างสำหรับ Code Arduino Uno R3

เป็นคำสั่งไว้สำหรับสั่งไฟกระพริบ ซึ่งหลอดไฟมีอยู่ในตัวบอร์ดอยู่แล้วสามารถทดสอบได้เลย

//http://arduino2robot.lnwshop.com
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second

}