รายงานความก้าวหน้่าครั้งที่4
จากการใช้ Aduino ควบคุม digital potentiometer ยังมีข้อสงสัยในส่วนของ source code จึงต้องมีการศึกษาเพิ่มเติม ดังนั้นในวันนี้จะมาอธิบายในส่วนของ source code โดยอธิบายทำละส่วนดังนี้
1.) #define DATAOUT 11//MOSI #define DATAIN 12//MISO - not used, but part of builtin SPI #define SPICLOCK 13//sck เป็นการกำหนด pin ที่ 11,12,13 ตามมาตรฐานของ SPI
โดย pinที่13 ต่อกับ pinที่2 ของ MCP41010 (Serial Clock (SCK))
pinที่12 ไม่ได้ใช้
pinที่11 ต่อกับ pinที่3 ของ MCP41010 (Serial Data Input (SI)) อ่านเพิ่มเติมได้ที่ http://klk64.com/arduino-spi/ #define SLAVESELECT 10//ss
pinที่ 10 ต่อเข้ากับ pinที่1 ของ MCP41010 (Chip Select (CS))
2.)
byte resistance=0; // ประกาศตัวแปร ชื่อ resistance ชนิด char โดยมีค่าเริ่มต้นเป็น 0
3.1)function Setup() จะถูกเรียกก่อนทุกครั้งเมื่อมีการทำงาน โดยในส่วนนี้จะเปนการกำหนดค่าเริ่มต้นให้กับตัวแปร,pin mode เป็นต้น
3.2)
จากคำสั่งนี้พบว่างงกับคำสั่งมากว่าทำอะไรจึงทำการค้นคว้าข้อมูลเพิ่มเติม พบว่า SPCR คือ SPI Control Register ซึ่งสามารถเรียกใช้โดยไม่ต้องประกาศตัวแปร ซึงมี 8 bit
Bit 7 - SPIE: SPI Interrupt Enable
Bit 6 - SPE: SPI Enable
Bit 4 - MSTR: Master/Slave Select
Bit 3 - CPOL: Clock Polarity
Bit 2 - CPHA: Clock Phase
Bit 1 and bit 0 - SPR1, SPR0: SPI Clock Rate Select 1 and 0
จากคำสั่งข้างต้น ค่าของ SPCR = 01010000 โดยค่าของ SPE=1 SPI enable, MSTR=1 เป็นการกำหนดว่า เป็น Master หรือตัวส่งข้อมูล
3.3) Write_pot(255); เปนการกำหนดค่าเริ่มต้นในการทำงานโดยส่งค่า 255 ไป
อธิบาย function write_pot(int)
เมื่อมีการส่งข้อมูลต้องให้ค่า SLAVESELECT เปน 0 จึงจะทำการส่งข้อมูลได้ ดังนั้นจึงต้องใช้คำสั่ง
digitalWrite(SLAVESELECT,LOW);
spi_transfer(19);
spi_transfer(value);
หลายคนอาจสงสัยว่าเหตุใดจึงมีการ function สองครั้ง
ครั้งแรกเป็นการส่ง COMMAND Byte โดยมีรูปแบบดังนี้
SPDR=data; ค่าที่รับมาจะถูกส่งไป SPI Data Register
SPSR=SPI Status Register
Bit 7 - SPIF: SPI Interrupt Flag
Bit 6 - WCOL: Write COLlision Flag
Bit 0 – SPI2X: Double SPI Speed Bit
เมื่อการส่งข้อมูลเสร็จแล้ว SPIF เป็น 1 จะทำให้ SPIE เป็น 1 และจำทำการเคลียค่า SPIF เป็น 0 เมื่อเข้าถึงค่าใน SPI Data Register คิดว่าน่าจะส่งค่าสู่ Digital Potentiometer ในส่วนนี้ (ขอ comment ข้อผิดพลาดด้วยครับ)
โดยค่า resistanceจะมีค่าได้ระหว่าง 0-255 เพราะ MCP1010 จะทำงานได้ที่ 256 ระดับ
ภายใน loop จะให้ค่า resistance เพิ่มขึ้นเรื่อย นั่นทำให้ค่าความต่างศักย์ลดลง
delay(1000) ไว้หน่วงการส่งที่ 1 วินาที
* คำถาม ทำไมใน function spi_transfer(volatile char data) ถึงต้องนำ char มาเป็นพารามิเตอร์ และ volatile ใช้อย่างไร