วันจันทร์ที่ 2 พฤศจิกายน พ.ศ. 2558

LAB05_I2C (IC 24LC64)

1.แนวคิดและวิธีการเขียนโค๊ด

  • แบ่งเป็นสองส่วน คือส่วนที่เขียนข้อมูลลง eeprom และ ส่วนอ่านข้อมูลจาก eeprom
  • ให้ค่า i ซึ่งเป็น address ที่จะเขียนลง IC 24LC64 เพิ่มขึ้นทุกครั้งที่มีการเขียนค่าลงไปใน IC ดังนั้น address จะถูกเลื่อนไปเรื่อยๆเริ่มจาก address 0
  • อ่านค่าจะต้องเริ่มจากตัวแรกสุด แล้วไล่ไปเรื่อยๆตามที่กด Debounce Switch 
  • มีการใช้ BusIn ในการรับค่า switch 7 ตัว เข้ามาเปนเลขฐาน2 7 bit
  • มีการใช้ BusOut ในการส่งค่าไปแสดงผลที่ LED ทั้ง 8 ดวงแบบ binary 7 bit
  •  Debounce Switch เป็นเงื่อนไขในการ ส่ง หรือ อ่านค่า จาก IC ถ้าไม่กด จะไม่เกิดการส่งหรืออ่านค่าทั้งนั้น

2.การทำงานของโปรแกรม

เมื่อ Start Program
  1. switch 0 เป็น logic 0 program อยู่ในโหมดส่งค่า set switch 1-7 ให้เป็น logic 1 แล้วกด debounce switch ส่งค่าไปที่ EEPROM แบบ I2C ค่าแรกที่ส่งคือ '127' 
  2. ไล่สลับ switch ที่1 ถึง 7 เป็น logic 0 พร้อมกับกด debounce switch ทำให้ส่งค่า 63,31,15,7,3,1,0
  3. สลับ switch 0 ให้เป็น logic1 เพื่อเปลี่ยน mode เป็นการอ่านค่า
  4. อ่านค่าตัวแรกมาได้ 127 ไฟ LED ติด 7 ดวง
  5. อ่านค่าตัวต่อๆไปไฟติด 6,5,4,3,2,1 และ 0 ดวงเมื่อ read data ครั้งที่ 8 
  6. มีการเปิด logic analyzer ให้ดูว่าการรับส่ง ตรงกับที่ display ผ่าน Serial Moniter
  7. หลังจากเปลี่ยนโหมดกลับไปที่เขียนค่า จะเริ่มเขียนจาก address 0 ทับลงไปเรื่อยๆ

3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/acqde1vf7ms7b1m/LAB05_24LC64_I2C.rar

วันพฤหัสบดีที่ 29 ตุลาคม พ.ศ. 2558

LAB04 sin wave (microcontroller interface)

1.แนวคิดและวิธีการเขียนโค๊ด

  • ใช้พื้นฐานเรื่อง กราฟ sin(zeta) ครึ่งคาบจะตัดแกนx ที่ pi (pi=3.14159265359) ดังนั้นจึงให้ค่าตัวแปรเพิ่มไปเรื่อยๆจาก 0 จนถึงค่า pi  เพื่อสร้างกราฟ sin(zeta) ในช่วง 0 ถึง 1 
  • ถ้าค่าเกินกว่า pi ให้เข้าเงื่อนไขเพื่อทำ Two's Complement เราจะได้กราฟ sin(zeta) ในช่วง 0 ถึง -1  
  • นำการเลื่อนแกนมาช่วยเพื่อให้กราฟขยับขึ้นไปจาก -1 ถึง 1 เป็น 0 ถึง 2 ด้วยการ บวกหนึ่งค่า sin(zeta) 
  • แปลงค่าจาก 0 ถึง 2 ให้เป็น 0 - 4095 เพื่อส่งออกด้วยคำสั่ง MCP.writeA()

2.การทำงานของโปรแกรม



Step 1 : ต่อ nucleo กับ IC MCP4922 เพื่อช่วยแปลงค่า digital เปลี่ยนให้เป็น analog เนื่องจากเป็นรุ่น F411RE 

Step 2 : นำ Output IC MCP4922 ไปต่อเข้ากับ scope ของ hantek เพื่อวัดสัญญาณที่ส่งออกมา

Step 3 : โปรแกรมจะสร้าง sin wave เริ่มจากค่า sin(zeta)ตั้งแต่ 1 ถึงสอง 2  แล้วค่อย  Two's Complement  พื่อสร้าง sin wave ตั้งแต่ 1 ถึง 0 สลับไปเรื่อยๆ

3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/342w100zsmzqwwe/LAB_04_sinwave.rar

วันจันทร์ที่ 26 ตุลาคม พ.ศ. 2558

Assignment 2 (microcontroller interface)

1. แนวคิด และ วิธีการเขียน code


  • สามารถ ส่งค่า 0 - 99 จาก smartphone ไปแสดงบนบอร์ด NX-100 ในรูปแบบของ 7-segment ได้
  • อ่านค่า VR adjust ที่อยู่บนบอร์ด NX-100 แล้วส่งกลับไปให้ Smartphone ได้ในรูปแบบ Voltage 
  • มีการใช้ switch case ในการลำดับเงื่อนไขว่าควรจะเข้า menu ไหนก่อน และ หลัง 
  • สร้าง busout 2 ชุด busout 1 ชุดควบคุม 7-segment 1 ตัว
  • รับค่า analog จาก VR adjust แล้วนำไป calculation ให้ได้ 0 - 3.3 V เพื่อตอบค่ากลับไปที่ smartphone  

ปัญหาที่พบ


  • เริ่มแรกผมใช้function  pc.getc() กับ pc,readable() เป็นส่วนสำคัญแต่ความยากอยู่ตรงค่าที่ได้รับจาก smartphone เป็น ascii ผมจึงต้องสร้าง function ที่แปลง ascii เป็น int แต่ด้วยความที่มันใช้งานได้ลำบาก และเสียเวลา จึงเปลี่ยนเป็นรับค่าโดย function scanf() แทน เพราะสามารถรับค่าเป็น int ได้เลย ไม่ต้องแปลงค่าอีก
  • การที่ใช้ scanf() มีข้อเสียคือต้องส่ง "\n" มาหลังค่า data ที่เราส่งเพื่อให้ scanf() รู้ว่านั่นคือจบdataแล้ว แต่ทั้งนี้ app อย่าง roboremo สามารถ setting ค่าได้ว่าตอนจบ จะให้ส่ง "\n" ปิด    ท้ายเสมอ

2. VDO แสดงการทำงานของ Program

#เราได้ทำการ test โดยใช้ application "Terminal Bluetooth" ของ Android

Step 1 : เลือกว่าจะกด 1 : ส่งเลข 00-99 ไปแสดงที่ 7-segment 
                              กด 2 : ถามหาค่า Voltage ของ VR adjust ณ ปัจจุบัน

Step 2 : เมื่อเลือกปุ่ม 1 ให้ใส่ค่า 00 - 99 ลงไปโดยมี "\n" ปิดท้าย

Step 3 : ค่าdata ที่รับเข้ามาจะถูก show บน 7-segment ทั้ง 2 อันเป็นตัวเลขตามที่ส่งจาก smartphone

Step 4 : เมื่อเลือกปุ่ม 2 ระบบจะส่งค่า Voltage กลับมาให้กับผู้ใช้ทันทีในรูปของ text ตัวอย่างเช่น

"Voltage from VR adjust : 0.47 V " เป็นต้น



3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/21tnmfoql1zc51i/Assignment2_digitalFRA221.rar

LAB 03 (microcontroller interface)

1.แนวคิดและวิธีการเขียนโค๊ด

- เป็นการเขียนโปรแกรมเพื่อให้บอร์ดนิวคลีโอสื่อสารกับคอมพิวเตอร์ได้ โดยสามารถสั่งงานผ่าน serial monitor ของ Arduino
- เราได้นำโปรแกรมที่เรียนในคลาสมาประยุกต์แก้ไขเป็นโปรแกรมของเรา แบ่งออกเป็นสองส่วนคือ 1. Output LED 8 ดวง มี 3 pattern  2. Function ในการรับค่า switchจาก บอร์ดNX-100 ว่า On / Off
-  มีการแบ่ง state เพื่อให้โปรแกรมสามารถเข้าใจได้ง่าย
- ใช้ switch  case เพื่อ check ว่า ascii ที่รับเข้ามานั้นเป็นโหมดการทำงานไหน
- มีรูปแบบ show display ที่ LED 8 ดวง สองแบบคือ 1. LED ติดจากซ้ายไปขวา 2.ไล่ติด LED เปน binary เริ่มจากเลข  0 - 255 แสดงแบบ 8 bit
- ต้องการให้สามารถใส่คำสั่งเข้าแล้ว pattern ที่ Display LED เปลี่ยนทันที โดยไม่ต้องรอให้วนลูป for จบก่อน

2.การทำงานของโปรแกรม

-  เมื่อเริ่มการทำงาน หน้าจอ serial monitor จะขึ้นมาให้เรากดเลือกโหมดการทำงาน โดยจะมี 2 โหมดให้เลือก  ถ้าส่งค่า 1 ก็จะโหมด 1 ส่งค่า 2 ก็จะโหมด 2
- เมื่อเลือกเข้าสู่โหมด 1 ทางหน้าจอ serial monitor ก็จะขึ้นหัวข้อมาให้เลือกอีกสามโหมด
    - a  ถ้าส่งค่า a ไปโหมดนี้จะเป็นการไปสั่งให้ LED วิ่งเป็นแพทเทิร์นๆหนึ่ง
    - d  ถ้าส่งค่า d ไปดหมดนี้จะเป็นการสั่งให้ LED วิ่งอีกแพทเทิร์นหนึ่ง
   - s   ถ้าส่งค่า s ไปจะเป็นการออกจากโหมด 1 ไปสู่หัวข้อเริ่มต้นให้เลือกโหมดใหม่ว่าจะ 1 หรือ 2

- เมื่อเลือกเข้าสู่โหมด 2 จะเป็นการไปอ่านค่าว่า สวิสต์ On หรือ Off อยู่และจะแสดงผลออกมาทาง Serial monitor จากนั้นก็จะออกจากโหมดนี้โดยอัตโนมัติ  กลับไปเมนูเริ่มต้น


3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/n6u9zyxhpnyrvlz/LAB_03.rar

วันอาทิตย์ที่ 18 ตุลาคม พ.ศ. 2558

LAB 02 (microcontroller interface)

LAB 2.1

1.แนวคิดและวิธีการเขียนโค๊ด

เป็นการเขียนโปรแกรมให้สามารถรับค่าแรงดันไฟฟ้า แบบ Analog จาก VR adjust  และนำมาแสดงในรูปของ หลอด LED 8 ดวง โดย ระดับของแรงดันไฟฟ้าจะแปรผันตรงกับจำนวน LED ที่ติด แรงดันไฟฟ้าเข้ามาน้อย LED ก็จะติดน้อย และไล่ระดับไปเรื่อยๆ จนติดครบทั้ง 8 ดวง
- ในการเขียน โปรแกรมนั้นก็ไม่มีอะไรมากครับ เริ่มต้น ก็แน่นอนต้องมีคำสั่งอ่านค่าสัญญาณ Analog
เมื่อได้ค่า Analog มาแล้วก็จะเป็นในส่วนเงื่อนไขต่างๆ โดยกลุ่มผมทำการแบ่งสัญญาณ Analog ออกเป็น 8 ช่วง จ่ายแรงดันมามากแค่ใหน ถึงช่วงใหน LED ก็จะติดถึงช่วงนั้น จะเห็นว่าในโค๊ดจะมี คำสั่ง If else อยู่ 9 ตัว โดยแบ่งเป็น คำสั่ง on ไฟ LED 8 ระดับ และ  คำสั่งที่ 9 คือ off LED
ในโปรแกรมพวกผมเลือกใช้คำสั่ง BusOut หรือก็คือ คำสั่งที่ทำให้แปลงค่าจากเลขฐานสิบเป็นเลขฐานสอง แล้วส่งค่าออกไป On LED 8 bit ดังนั้นจึงได้ตัวเลขฐานสองตั้งแต่ 0 ถึง 255
-โดยพวกผมมอง LED ทั้งแปดตัว เป็นเลขฐานสอง 8 bit ดังนั้นในแต่ละฟังชั่นของฟังชั่น If else ก็จะทำการจับ LED มาเท่ากับเลข ฐานสิบค่าหนึ่งที่เมือส่งออกไปในรูปเลขฐานสอง 8 bit แล้วจะทำให้ LED on ตามจำนวนที่ต้องการ
     Example แรงดันแรงมากแต่ยังไม่แรงที่สุดจะให้ LED ติด 7 ดวง ในฟังชั่น else if ก็ทำการจับLED มาเท่ากับ 127 เพราะเมื่อแปลงเป็นเลขฐานสอง 8 bitแล้วจะได้ 01111111 ไฟจะติดแค่เจ็ดดวง



2. VDO การทำงานของโปรแกรม

         เมื่อทำการหมุนปุ่ม VR adjust มากขึ้นเรื่อยๆ LED ก็จะติดเรียงกันไปเรื่อยๆตามระดับแรงดันไฟฟ้าที่ VR adjust ปล่อยออกมา ตั้งแต่ 0 V - 3.3 V Display เป็น LED 8 ดวง คิดเป็น 8 ระดับ    

ค่า VR adjust   = 0 V    => LED ทั้ง 8 ดวงดับหมด
ค่า VR adjust >= 3.3 V => LED ทั้ง 8 ดวงติดครบทุกดวง


3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/l33dfg146wy00vr/LAB02_01.rar



LAB 2.2

1.แนวคิดและวิธีการเขียนโค๊ด

-เป็นการเขียนโปรแกรมให้สามารถรับค่าแรงดันไฟฟ้า แบบ Analog จาก VR adjust  และนำมาแสดงออกทาง 7-SEGMENT แบบเดียวกับ Volt meter
-ในส่วนของโปรแกรมนั้นก็แน่นอน ต้องเขียนคำสั่งเพื่ออ่านค่า Analog ของแรงดันไฟฟ้าที่มาจาก ปุ่มหมุน VR adjust
-เมื่อได้ ค่าสัญญาณ analog มาแล้ว เนื่องจากการอ่านค่าสัญญาณ Analog จะอ่านอยู่ในช่วง 0-1.0 แต่เราต้องการให้ค่า Max สุดแสดงที่ 3.3 (เนื่องจากบอร์ดนิวคลีโอรับไฟได้มากสุด 3.3 volt) จึงนำค่าที่ได้มาคูณ 3300 (ที่คูณ 3300 แทนที่จะเป็น 3.3 เพราะจะได้ความละเอียดของค่าที่มากกว่า
-ในการจะแสดงผลออกทาง  7-SEGMENT จำเป็นจะต้องส่งค่าออกไปในรูปเลขฐานสอง จึงใช้คำสั่ง BusOut และต้องใช้ สองตัว เพื่อแสดงจำนวนเต็มและหลักทศนิยมหนึ่งตำแหน่ง
-จากนั้นก็นำค่า Analog ที่ได้ หาร ด้วยหนึ่งพันเก็บไว้ในตัวแปร INT ตัวหนึ่งทำให้ค่าที่ได้จะเป็นจำนวนเต็ม แล้วก็ ส่งออกไปทางคำสั่ง BusOut ตัวแรก
-ในการจะคิดหาหลักทศนิยมนั้น กลุ่มผม นำค่าจำนวนเต็มที่ส่งไปกับ BusOut ตัวแรกนั้นคูณหนึ่งพัน เก็บไว้ในอีกตัวแปร
-จากนั้นก็นำค่า Analog ที่วัดได้มาลบกับค่าที่เก็บเอาไว้ จะทำให้ได้ส่วนต่างออกมา ซึ่งเมื่อนำส่วนต่างนั้นไปหารด้วยหนึ่งร้อย  ก็จะได้หลักทศนิยม และทำการส่งออกไปกับ BusOut ตัวที่ 2

2. VDO การทำงานของโปรแกรม

- เมื่อทำการหมุน VR adjust จะทำให้เกิดสัญญาณ Analog ของค่าแรงดันไฟฟ้าออกมาและก็ไปแสดงผลกับ                7-SEGMENT  ค่าออกมาเป็น Voltage ตั้งแต่ 0 V - 3.3 V


3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/3qhp927i9r26337/LAB02_02.rar

วันอังคารที่ 13 ตุลาคม พ.ศ. 2558

LAB01 (microcontroller interface)

1. แนวคิด และ วิธีการเขียน code

- สามารถควบคุม Delay เพิ่ม/ลด ได้จาก button ที่เป็น Debounce Switchs 2 ปุ่ม
- ควบคุมการติดของ LED จาก ซ้ายไปขวา และ ขวาไปซ้ายได้เอง จาก Switchเลื่อนตัวที่ 0
- แสดง Display(Output) เป็น LED 8 ดวง ทั้งหมด 3 pattern
- สามารถ Reset Delay กลับไปที่ค่าเริ่มต้นได้ จาก Switchเลื่อนตัวที่ 1
- มี Input ทั้งหมด 4ปุ่ม
- แบ่งการทำงานเป็น state เพื่อให้ควบคุมได้ง่ายขึ้น
- ไม่ต้องการสั่งให้ LED ทั้ง 8 ดวง ติดและดับ ทีละดวง

ปัญหาที่พบ

- เรื่อง DigitalIn/DigitalOut แบบ Array
DigitalIn Input[3]={D0,D1,D2};
DigitalOut LED[8]= {D3,D4,D5,D6,D7,D8,D9,D10};
แต่มี error เกิดขึ้นเพราะว่าไม่สามารถวน while(1){} จึงไปศึกษาจาก Handbook พบว่านิยมใช้
BusOut LED(D3,D4,D5,D6,D7,D8,D9,D10); มากกว่า
จึงนำมาใช้ในการสร้าง pattern ของ LEDs ทั้ง 8 ตัว
- การเปลี่ยน state จะทำได้ก็ต่อเมื่อหมดการทำงานของ state นั้นๆแล้วครับ ไม่สามารถเปลี่ยนกระทันหันในทีเดียวได้
- DigitalIn D0 D1 ไม่สามารถใช้งานได้ครับ อาจเนื่องจากเป็นportเฉพาะ
- การใช้คำสั่ง BusOut จำต้องคำนวณเลขให้ได้เพราะ Output ออกมาเป็นตัวเลขฐาน2  8 bit จึงยุ่งยากกว่าการสั่งแบบทั่วไป แต่สั้นกว่า
Example
         for (int j=0; j<256; j++)
                {
                LED = j;
                wait_ms(100);  
                }
นี่คือ pattern การ Output LED 8 ดวง เป็นตัวเลขฐาน2 ตั้งแต่ 0-255 แบบ 8 bit ครับ


2. VDO แสดงการทำงานของ Program




Step 1 : LED ไล่ติดจากขวาสุดไปซ้ายสุด/  ติดพร้อมกันหมดทุกดวง / ไล่ดับจากขวาสุดไปซ้ายสุด โดยที่ switch ตัวที่0 ยังเป็น logic 0 delay 150 ms

Step 2 : กด  Debouce Switch ตัวที่ 2 เพิ่มDelayขึ้น เป็น1000 ms การติด/ดับของ LED ช้าลง

Step 3 : กด Debouce Switch ตัวที่ 1 ลดDelayลงเหลือ 50 ms การติด/ดับของ LED เพิ่มขึ้น

Step 4 : กด  switch ตัวที่0 เป็น logic1 pattern LED จะติดไล่จากซ้ายสุดไปขวาสุด / ติดพร้อมกันหมดทุกดวง / ไล่ดับจากซ้ายสุดไปขวาสุด

Step 5 :  กด  switch ตัวที่1 เป็น Logic1 Reset Delay เป็น 150 ms

Step 6 : กดDebounce Switch ตัวที่ 1 และ ตัวที่ 2 พร้อมกัน LED จะติดเป็นเลขฐาน2 จาก 1-255 Output แบบ 8 bit

3.code ที่กลุ่มของเราเขียนขึ้นครับ

http://www.mediafire.com/download/3zzirijgl3biz9v/LAB01_microcontroller_interface.rar


วันอังคารที่ 29 กันยายน พ.ศ. 2558

บทสรุปการเรียน week7


การออกแบบวงจร sequential logic

-  ในการออกแบบเราต้องระบุให้แน่นอนว่าต้องการที่จะให้วงจรของเราทำงานอย่างไร เมื่อระบุได้แล้ว
ก็ทำการแปลงรูปแบบดังกล่าวให้เป็น State diagram



Finite State Machine


                              เรานำรูปแบบที่เราต้องการมาแปลงเป็น State แบบรูปข้างบน โดย ในวงกลมครึ่งบนแต่ละวงกลมคือ ชื่อของ state การทำงาน ครึ่งล่างคือ out put ว่าใน state นั้นๆ output คืออะไร  และเส้นตรงที่มีปลายเป็นลูกศรพร้อมมีตัวเลขกำกับก็คือ ถ้าเรา ใส่ input  (ตัวเลขกำกับลูกศร) เป็นค่าอะไร state จะเปลี่ยนเป็นอะไร
จากนั้นเราก็ทำการเปลี่ยนชื่อ state ให้อยู่ในระบบเลขฐานสอง เรียงไปเรื่อยๆ 00 01 10 .... จนครบทุก state ดังรูป


จากนั้นเราก็จะนำ State ที่ได้มาสร้างตาราง โดยในช่อง output เป็น outputของ current state(สเตทปัจจุบัน)

 


จากนั้นเราก็จะทำเพิ่มตารางของ Flip Flop เข้าไป จำนวนFlip Flop ที่ใส่เข้าไปจะเท่ากับ bit ของ current state โดยตัวอย่างแรกนี้จะเป็น D Flip Flop ในการใส่ค่าลงในตารางของ Flip Flop เราจะดูค่า ในช่อง A และ A next และจะใช้คุณสมบัติของ D Flip Flop ว่าต้อง input อะไรให้ Flip Flop A ถึงจะเปลี่ยนเป็น A next
แล้วก็ทำเช่นกันกับ B และ B next                ดังรูป

ถ้าดูดีๆ จะพบว่า ค่าในตารางFlip Flop  จะเหมือนค่าใน Next state เด๊ะๆ นั่นละครับ ก็อป Next state มาใส่ จบปิ๊ง

ในกรณีที่ เรา ใช้ jk Flip Flop ก็ทำเหมือนเดิมครับสร้างตาราง จำนวน Flip Flop ที่ใช้ก็ยังเท่า bit ของ Current state เหมือนเดิม เพียงแต่ว่า input ของ jk Flip Flop มีสองตัวก็คือ ขา JและK เราก็ต้องมีตารางเพิ่ม จากนั้นก็ใช้คุณสมบัติของ jk Flip Flop ใส่ค่าเหมือนเดิม โดยจะมีตารางช่วยในการใส่ค่าที่ง่ายขึ้น
ตารางนั้นคือ

เมื่อเราก็ทำการใส่ค่าตามตารางนี้  แล้วเราก็จะสามารถสร้างตาราง JA , KA , JB , KB แบบนี้ออกมา


หลังจากได้ตารางแล้ว ขั้นต่อไปที่เราต้องทำนั้นก็คือ สร้างตาราง karnaugh map ของ A B และ Input โดยในตารางจะใส่ค่าของ Flip Flop

จะเห็นว่าเป็น ตาราง ของ A BและInput ค่าในตารางคือ Flip Flop  A

เราก็จะทำแบบนี้จนครบ Flip Flop ทุกตัว แต่สำหรับ jk Flip Flop สำหรับ Flip Flop 1ตัว สร้าง karnaugh map สองตาราง เพราะมันมีinput สองตัว คือ j และ k



ขั้นต่อไปคือ ทำ karnaugh map ของ output  โดยสร้างจาก Aและ B

ขั้นตอนสุดท้ายคือเรานำ k-map ที่ได้มานั้นไปต่อเป็นวงจรที่มี And gate , OR gate , D-type Flip - Flop

Reference 

http://fls.fibo.kmutt.ac.th/pluginfile.php/1200/mod_resource/content/1/LN7-Finite%20State%20Machines-Fullslide.pdf









วันอังคารที่ 8 กันยายน พ.ศ. 2558

บทสรุปการเรียน week6

ความรู้ที่ได้รับ

โดยหลักแล้ว digital circuit มีด้วยกัน 2 แบบคือ

1. Combiration : Input และ Output สามารถคำนวณได้จากการใช้ Truth table มีความแน่นอน
2. Sequential    : การที่จะรู้ว่า Output จะออกมาเป็นเช่นไรขึ้นอยู่กับ state ก่อนว่า Output แบบใด Input แบบใด และขึ้นอยู่กับ Input ปัจจุบันด้วย สามารถนำไปประยุกต์ใช้เกี่ยวกับ memory และ counter ได้

- พูดถึง basic ของ Combiration ว่าต้องเป็น logic gate ดังนั้นถ้าพูดถึง Sequential เราต้องมองหา       Flip-Flop  เราจะมาดูกันว่ามันคืออะไร

Flip-Flop

 => อันที่จริงก็คือ logic gate นี่ละเพียงแต่ถูกต่อให้เกิด Truth table ที่ไม่แน่นอน และมีความสามารถในการ memory Output หรือ Input state ก่อนได้

เราสนใจ Flip-Flop 4 ประเภทคือ

1. RS Flip - Flop => มีด้วยกัน 4 state ตาม Truth table ไล่ทำความเข้าใจทีละ state
           - S เป็น logic 0 และ R เป็น logic 0 มันจะ No change ก็คือ hold วงจรไว้ที่ Output state ก่อนหน้านั่นเอง
          - S เป็น logic 0 และ R เป็น logic 1 หรือ S เป็น logic 1 และ R เป็น logic 0  อันนี้จะเป็น Output ที่แน่นอน ตายตัว
         - S เป็น logic 1 และ R เป็น logic 1 อันนี้ต้องบอกว่าเป็น state ที่ไม่สามารถประเมินได้ หรือ Undefined เราไม่รู้ว่าจะเกิดอะไรขึ้น ซึ่งจริงๆแล้วมันจะทำให้ทั้ง Q และ Q' ออกเป็น logic 0 ดังนั้นเราจะไม่นำเอามาใช้


2. JK Flip - Flop => อันนี้เป็น Flip-Flop ที่พัฒนามาจาก RS เนื่องจากเราไม่ต้องการ state "undefined" ดังนั้นความแตกต่างอย่างแรกคือ มีการต่อ NAND Gate เพิ่มเข้ามา 2 ตัว เพื่อเปลี่ยน state undefined ที่ไม่ต้องการ ให้กลายเป็น Toggle แทน ในตอนที่ S เป็น logic 1 และ R เป็น logic 1
           - หลักการทำงานเหมือนกับ RS flip-flop แต่ว่า บาง IC จะมีขา Reset แยกต่างหากมาด้วย อย่าง IC ที่อาจารย์นำมาให้ใช้ทดลอง ถ้ามีขา Reset หมายความว่า ให้ logic 0 ที่ Reset เมื่อไหร่ Output จะถูก Reset กลับไปเป็นค่าตามที่โรงงานผลิตออกมา
           - เมื่อเราทำให้ J เป็น logic 0 และ K เป็น logic 1 หรือ J เป็น logic 1 และ K เป็น logic 0  แล้ว เราต้องกดปุ่ม Clock เพื่อบันทึกค่าให้ Output แสดงออกมา ไม่เช่นนั้น ต่อให้เราสลับ switch แค่ไหน ก็ไม่ทำให้ Output เปลี่ยนไป
          - JK flip - flop นั้นก็มี state hold เหมือนกับ RS เมื่อเราให้ J เป็น logic 0 และ K เป็น logic 0 แม้ว่าเราจะกด Clock อย่างไร ก็จะไม่เกิดผลกับ Output เพราะ Clock จะดึง Output ของ state ก่อนมาแสดงวนไปเรื่อยๆ
*Toggle การที่เมื่อ Q เป็นlogic 0 พอ Toggle  1 ครั้ง จะสลับให้ Q เป็น logic 1


3. T-Type Flip-Flop => หมายถึง Flip-Flop ที่ถูกใช้ในการสร้าง Counter
           ลักษณะการทำงาน นำขา J และ ขา K ของ JK Flip-Flop มาต่อเข้าหากันเรียกว่าขา T เมื่อเราใส่ T เป็นแบบใด และ ขึ้นอยู่กับ Output ครั้งก่อนหน้าด้วย
                  - Output ครั้งก่อนเป็น 0 Input T เป็น 0 Output ปัจจุบันจะเป็น 0
                  - Output ครั้งก่อนเป็น 0 Input T เป็น 1 Output ปัจจุบันจะเป็น 1



เราสามารถแบ่ง Counter ออกได้ 2 รูปแบบคือ

1. Asynchronous Counters => แยกขา Clock  ของ JK Flip-Flop เป็นของใครของมัน ไม่ได้ต่อร่วมกัน
        - ทำให้เกิดการ Delay เวลาเปลี่ยน State จะทำงานช้ากว่า Synchronous
        - สร้างได้ง่าย
        - ความถี่ต่ำกว่า Synchronous Counter แน่อน

2.Synchronous Counter => ต่อขา Clock ของ JK Flip-Flop ไว้ร่วมกัน
        - ต่อได้ยาก ต้องมีการคำนวณว่าต้องเพิ่ม Logic gate แบบใด ต่อกันแบบไหนเพื่อให้ได้วงจรที่                   ทำงานได้ตามต้องการ
        
จากหลักการที่กล่าวมาข้างต้นเรานำมาสร้างเป็นวงจรAsynchronous  Counter ดังรูป


หลักการทำงานของวงจรคือ มี Output ทั้งหมด 4 ค่าคือ Q0 - Q3  signal ที่ส่งเข้าไปจะเริ่มจาก Clock ส่งหนึ่งครั้ง ดูที่ขอบขาขึ้น จะมีผลกับ Q0 ทำอย่างนี้ไล่ไปตั้งแต่ LSB ถึง MSB เราจะได้วงจรที่สามารถ Counter ค่าได้ ขึ้นอยู่กับ Clock Pulses ที่ส่งมาว่ากี่ครั้ง


4. D-Type Flip - Flop => หมายถึง Flip-Flop ที่ถูกใช้ในการสร้าง Shift Register
        ลักษณะการทำงาน
                - เมื่อขา Clock เป็น 0 ไม่ว่าขา D จะเป็นอะไรก็ตาม Q และ Q' จะขึ้นอยู่กับ Output state                              ก่อนหน้า
               - เมื่อขา Clock เป็น logic 1 จะมี 2 กรณี
                         - ขา D logic 0 : Q จะ Output logic 0
                         - ขา D logic 1 : Q จะ Output logic 1

Shift Register 

Shift Register หมายถึง การเลื่อน หลักการคือเมื่อเราต้องการส่งข้อมูลอย่างเช่น 1011  อย่างในภาพจะเป็น Input แบบSerial  Output แบบ Parallel  จะเห็นได้ว่าเราต้องกด Clock ทั้งหมด 4 ครั้งเพื่อให้ข้อมูลเราเข้ามาครบ 4 bit (clock ละ 1 bit) เพื่อให้ข้อมูลเข้าสู่ IC ครบ เป็นต้น หลักการนี้เราใช้เพื่อสร้างความสเถียรให้กับ Signal ที่เราจะนำไปใช้ต่อ หรือว่า ต้องการ Memory ค่าบางค่า เพื่อนำไปคำนวณก็ได้


มีด้วยกัน 4 แบบคือ
  • • Serial-in to Parallel-out (SIPO)  
  • • Serial-in to Serial-out (SISO)  
  • • Parallel-in to Serial-out (PISO) 
  • • Parallel-in to Parallel-out (PIPO)  

ปัญหาที่พบ

- เราต้องดูให้ดีว่า counter  circuits ที่เรานำมาต่อนั้น มี buffer หรือไม่ การมี buffer หรือ นิเสธ หมายถึง ต้องให้ logic 0 ที่ขานั้น วงจรจึงจะทำงาน
- เมื่อเราต่อวงจรจริง สิ่งที่มักผิดพลาดคือการอ่าน datasheet ได้ไม่ดีพอ เนื่องจาก datasheet มีทุกอย่างอยู่แล้ว ถ้าเราสามารถทำความเข้าใจได้อย่างถ่องแท้ จะทำให้เรานำอุปกรณ์นั้นๆไปใช้งานได้อย่างมีคุณภาพและเหมาะสมที่สุด

- ไม่จำเป็นที่ IC ทุกตัวที่เป็น JK Flip-Flop จะต้องมีขา Reset เหมือนกับ IC ที่เราใช้ในการทดลอง
- การที่เราจะload Input แบบ Parallel เข้าไปใน IC นั้นต้องทำให้ขา PE เป็น logic 0 ก่อนแล้วจึงกด Clock 1 ครั้ง เพื่อ upload เปลี่ยนขา PE มาเป็น logic 1 แล้วกด Clock 8 ครั้งเพื่อให้ Output ออกมาเป็น Serial 
- ขา CE ต้องเป็น logic 1 เสมอ เพื่อให้ CP ทำงาน ถ้าขา CE เป็น logic 0 ไม่ว่าขา CP จะเป็นอย่างไรก็จะไม่มีผล

อ้างอิง

http://sub.allaboutcircuits.com/images/04353.png
http://qph.is.quoracdn.net/main-qimg-8d6bb2ecf259a4d1d876de7b7c30ae22?convert_to_webp=truehttps://upload.wikimedia.org/wikipedia/commons/f/ff/JK-FlipFlop_(4-NAND).PNG
http://worldclassprogramme.com/images/RS-Flip-Flop.gif
http://worldclassprogramme.com/images/D-FlipFlop.gif
http://electronicspost.com/wp-content/uploads/2015/05/14.png
http://www.learnabout-electronics.org/Digital/images/register-SISO.gif
http://www.ee.usyd.edu.au/tutorials/digital_tutorial/part2/pics/regist05.jpg
http://fourier.eng.hmc.edu/e85_old/lectures/figures/T_flipflop.gif
http://www.ee.surrey.ac.uk/Projects/CAL/seq-switching/Graphics/operT.gif
http://www.ibiblio.org/kuphaldt/electricCircuits/Digital/04348.png
http://sub.allaboutcircuits.com/images/04347.png
http://www.electronics-tutorials.ws/counter/count_1.html
http://www.ubooks.pub/Books/B0/E77R7385/MAIN/images/04349.png

วันอังคารที่ 1 กันยายน พ.ศ. 2558

Class work #2


Multiplexer input 4 to 1


จากการบ้านให้นำ Mux input 2 to 1 แปลงเป็น Mux input 4  to 1
นั้นต้องใช้ Mux input 2 to 1 ทั้งหมด 3 ตัว ต่อดังภาพจึงได้เป็น Mux input 4 to 1 1 ตัว 

ทั้งนี้เราหา Truth table ของวงจร Mux input 4 to 1 ได้ และนำไปคำนวณเพื่อหาการต่อซึ่งสามารถได้ truth table หน้าตาแบบเดียวกัน 



การหาผลลัพธ์จากวิธีการ Sum of Products โดยใช้ร่วมกับ Don't care 

วันจันทร์ที่ 31 สิงหาคม พ.ศ. 2558

บทสรุปการเรียน week5

LED 7-Segment 

               ที่จริงแล้วก็คือ LED ต่อกัน 7ดวง และมี LED จุด 1 ดวง a-g และ DP คือ point หรือจุด


           ซึ่งหลักการจะให้มันโชว์ตัวเลข หรือว่าตัวอักษร นั้นก็ต่อเมื่อเราสั่ง LED 7ดวงนั้นให้อะไรดับ อะไรติด   ดังรูป


ทั้งนี้ 7-Segment จะมี 2 แบบ แบ่งตามขา common ดังรูป


        - Common Cathode คือการนำขา Common ไปต่อกับแรงดัน (Voltage) 0 V แล้วนำขั้วตรง a - g , DP ไปต่อเข้ากับแรงดัน +5 V เมื่อต้องการให้ LED ติด
        - Common Anode สลับกัน โดยนำขา Common ไปต่อกับแรงดัน (Voltage) +5 V แล้วนำขั้วตรง      a - g , DP ไปต่อเข้ากับแรงดัน 0 V เมื่อต้องการให้ LED ติด

Example เมื่อเราต้องการให้ 7-Segment Output เป็นเลข 0 เราต้องสั่งให้ a,b,c,d,e,f เป็นlogic 1 แต่ว่า g เป็น logic 0

Decoder 

จากตารางจะเห็นว่าเป็นการยากที่เราจะต้องมาสั่งแบบนี้ไปตลอด ดังนั้น จึงมีการสร้างวงจร Decoder หรือพูดง่ายๆก็คือ วงจรถอดรหัส เพื่อที่เราจะได้สั่งเพียงแค่  4 เส้น คือ 1s 2s 4s 8s ที่จริงก็คือเราสั่งแบบ binary เลขฐาน2 แล้วdecoder จะช่วยแปลงให้กลายเป็น logic 8 เส้นเพื่อควบคุม 7-Segment นั่นเอง


อันนี้คือตารางการแปลง binary เป็น HEX เพื่อ Display ที่ 7-segment ของ Decoder



BCD (Binary Coded Decimal)

เราสามารถแปลง เลขฐาน2 ไปเป็น เลขฐาน 16 จาก decoder แต่แล้วถ้าเราอยากจะแปลงเป็นเลขฐาน 10 ซึ่งมีตั้งแต่ 0-15 เราจะต้องใช้ 7-Segment ทั้งหมด 2 อัน , Decoder 2 ตัวและวงจร BCD ในการควบคุม
โดยต้องแปลง binary เป็น BCD เป็นขั้นแรก


แต่ก่อนจะรู้ว่าเราจะต้องสร้างวงจร BCD ยังไง เราก็ควรจะรู้ก่อนว่า truth table ของเราเป็นแบบไหน ซึ่งก็คือการนำเอา Input กับ Output ทั้งหมดมาสร้าง truth table ขึ้นได้ดังตาราง


ดังนั้นเมื่อเรานำไปสร้างเป็น digital circuit จึงได้เป็น
BCD to 9's complement circuit

Encoder

เมื่อเรามี Decoder เราก็มี Encoder เช่นเดียวกัน ซึ่งเป็นวงจรเข้ารหัสบางสิ่งบางอย่าง อย่างเช่นรูปด้านล่าง จะเห็นว่า เราใส่ D0 - D3 แต่ Output ออกมาแค่ Q0 , Q1  เท่านั้น ถือเป็นการเข้ารหัสอย่างหนึ่ง

หรือ

จากรูปเราใส่ Input เป็น D0 - D3 แต่ Output มีเพียง Y0 และ Y2 เท่านั้น เราสามารถนำไปประยุกต์ใช้กับสิ่งต่างๆได้

Multiplexer 

คือ วงจรที่มี Input เข้ามา  2 ตัวและเราสามารถเลือก Output ได้เพียงหนึ่ง ผ่าน logic ที่ให้กับขา Sel(Select) อย่างเช่น ถ้าเราให้ logic 0 กับขา Sel Output ของเราจะเป็น Input ตัวที่ 0 นั้นเอง



truth table Multiplexer 2 input


Multiplexer แบบ 4-input 2 select


เราสามารถเลือก ได้ว่าจะให้ Input ไหน Output ออกไป ผ่านขา Sel ดังตาราง



เรานำเอาวงจร Multiplexer ไปใช้อย่างเช่น การเลือกค่า R ในวงจร Integrate ที่เราเคยเรียน


การประยุกต์ใช้จากหัวข้อข้างต้น มีการใช้ BCD , Multiplexer , Decoder , 7-Segment ในการสร้างวงจรที่รับ Input มาเป็น BCD แล้ว Output Display ออกมาเป็นตัวเลขที่ 7-Segment

ปัญหาที่พบ

   จากการต่อวงจร BCD เพื่อแปลง binary เป็น BCD โดยใช้ 7-Segment 2 ตัว และตัว Decoder นั้นพบว่า ถ้าเราไม่ออกแบบการต่ออย่างเป็นระบบ มีการ mark จุดว่าเราได้ต่อจุดไหนไปแล้ว และมีความเข้าใจที่มากพอเกี่ยวกับ circuit ที่กำลังต่อ จะพบว่า เราจะผิดพลาดได้หลายจุด ผมผิดพลาด 2 จุดด้วยกัน คือ 
1. เสียบสาย Output กับ 7-Segment สลับขากัน ทำให้ Display ที่แสดงออกมาผิดไปจากที่ควร
2. เสียบ IC กลับหัว ทำให้5V เข้า GND และ 0V เข้า Vcc แต่ทั้งนี้จากการตรวจสอบ IC ยังไม่เสีย สามารถใช้งานได้ปกติครับ

วิธีการ Debug วงจร =>  นำ Output 8 เส้น ไปเสียบกับ LED ทีละเส้น แล้วcheck ว่าถ้าInput pattern นี้ Output ตรงกับ truth table หรือไม่

reference

http://dsearls.org/courses/C391OrgSys/Homework/Hmwk06e.gif
http://www.thelearningpit.com/lp/doc/7seg/7segLed.gif
http://www.tutorialspoint.com/computer_logical_organization/images/priorityencoder_logiccircuit.jpg
http://www.codeproject.com/KB/system/441038/7segtruth.PNG
http://www.robotroom.com/DebouncedCounter/Figure713.gif
http://cds.linear.com/image/164_circuit_1.jpg
http://fourier.eng.hmc.edu/e85_old/lectures/digital_logic/img167.png
http://www.electronics-tutorials.ws/combination/comb17.gif?81223b
http://www.knowelectronics.org/bcd-to-9s-complement-converter-circuit/

วันอังคารที่ 25 สิงหาคม พ.ศ. 2558

บทสรุปการเรียน week4

ความรู้ที่ได้รับ

Krnaugh Map(k-map)

Krnaugh Map(k-map)  คือ วิธีการที่ทำให้เราสามารถแปลง truth table เป็น digital circuits ที่มีการใช้ Logic Gate ต่ำสุดเท่าที่จะทำได้
หลักการทำ k-map

  1. วงแค่ บน - ล่าง - ซ้าย - ขวา
  2. วงแบบ 2^n
  3.  Sum-Of-Products ต้องมี logic '1' อย่างเดียวอยู่ภายในวง ห้ามมีlogic '0' ขั้นอยู่
  4.  Sum-Of-Products ต้องวงจน logic Output '1' ถูกใช้ครบทุกตัว
  5.  Products-Of-Sum ต้องมี logic '0' อย่างเดียวอยู่ภายในวง ห้ามมีlogic '1' ขั้นอยู่
  6. Products-Of-Sum ต้องวงจน logic Output '0' ถูกใช้ครบทุกตัว
  7. ยิ่งเราสามารถวง Output เพื่อยุบได้มากเท่าไหร่ Logic Gate ที่ต้องใช้จะยิ่งลดลงเท่านั้น


8. รูปแบบที่สามารถวงได้ โดยมองเป็น สเฟียร์



k-map 2 input  จะสามารถสร้างเป็นตาราง 2 x 2 ได้ โดย Output ที่สามารถเกิดได้มีทั้งหมด 4 แบบ


k-map 3 input จะสามารถสร้างเป็นตาราง 2 x 4 ได้

มีข้อสังเกตว่า หัวของตาราง จะเรียง 00 01 11 10 ซึ่งไม่ใช่การเรียงแบบ Binary แต่เป็นการเรียงแบบ Gray Code

Gray Code คือ การที่ค่าที่เปลี่ยนไปต่างจากค่าตัวก่อนหน้า 1 bit เสมอ ที่นำมาใช้ใน krnaugh map เนื่องจาก k-map เป็นตารางที่เปลี่ยนแปลงค่าทีละ 1 bit ต่อ  1 ช่อง จึงสัมพันธ์กับ Gray code




Example K-map 3 Input แบบ Sum-Of-Products



Example K-map 3 Input แบบ Products-Of-Sum




k-map 4 input จะสามารถสร้างเป็นตาราง 4 x 4 ได้

Example K-map 4 Input แบบ Sum-Of-Products และ Products-Of-Sum




ส่วน K-map ที่มากกว่า 4 input นั้นส่วนใหญ่ไม่ค่อยได้รับความนิยม จะหันไปใช้ program computer ในการคำนวณจาก truth table ให้กลายเป็น digital circuit แทน อาทิเช่น program "Logic Friday" เป็นต้น

Example รวมของ K-map

Don't care 

คือ การที่เราไม่สนใจค่า Output ของ มันเพราะว่าเป็นกรณีที่ไม่สามารถเกิดขึ้นได้จริงจาก Input ที่เราต้องการมักใส่สัญลักษณ์ '*' ไว้ใน Krnaugh Mapเพื่อบอกว่าตัวนั้นคือตัวที่ไม่จำเป็นต้องสนใจ


เราสามารถนำ Output ที่ don't care ใส่เข้าไปในวงกลมของ k-map ได้เพื่อยุบรวม ถ้ามันจะทำให้ Output ที่ออกมา ใช้ Logic gate น้อยลง

DeMorgan's Theorem

คือ ทฤษฎีที่ช่วยให้เราสามารถยุบรวมตัว Output ที่มีนิเสธติดอยู่ทั้งก้อนนั้น ให้นิเสธเหลือน้อยลง และใช้ Logic gate ที่น้อยกว่าเดิม เราสามารถเปลี่ยน NAND ให้เป็น OR ที่ invert Input ทั้งสองตัว และเปลี่ยน NOR ให้เป็น invert Input ทั้งสองตัวของ AND

Example DeMorgan's








อ้างอิง

http://jpkc.njau.edu.cn/szdzjs/pic/eng_dzjc/clip_image073.jpg
http://www.ubooks.pub/Books/B0/E77R7385/MAIN/images/14155.png
http://www.ibiblio.org/kuphaldt/electricCircuits/Digital/14096.png
http://m.eet.com/media/1062047/max-gc-03.gif
http://sub.allaboutcircuits.com/images/14131.png
https://www.safaribooksonline.com/library/view/introduction-to-digital/9780470900550/images/ch006-f013.jpg
http://www.ee.surrey.ac.uk/Projects/Labview/minimisation/karrules.html
https://learn.digilentinc.com/Documents/319