วันจันทร์ที่ 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