01 เมษายน 2553

GenesisPump


รายงานความก้าวหน้่าครั้งที่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 5 - DORD: Data Order
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 โดยมีรูปแบบดังนี้


โดยจะส่งไป 2 Byte เช่น เลข 19 คือ b00010011 (จาดการทดลองส่งเลข 17 ก้อใช้งานได้เช่นกัน 17=b00010001)

ครั้งที่สองเป็นการส่ง Data Byte
4) spi_transfer(volatile char data)
SPDR=data; ค่าที่รับมาจะถูกส่งไป SPI Data Register

SPSR=SPI Status Register


ประกอบไปด้วย
Bit 7 - SPIF: SPI Interrupt Flag
Bit 6 - WCOL: Write COLlision Flag
Bit 5...1 - Res: Reserved Bits
Bit 0 – SPI2X: Double SPI Speed Bit



เมื่อการส่งข้อมูลเสร็จแล้ว SPIF เป็น 1 จะทำให้ SPIE เป็น 1 และจำทำการเคลียค่า SPIF เป็น 0 เมื่อเข้าถึงค่าใน SPI Data Register คิดว่าน่าจะส่งค่าสู่ Digital Potentiometer ในส่วนนี้ (ขอ comment ข้อผิดพลาดด้วยครับ)
5) loop(); เป็น function ที่ตอบสนองการทำงานอย่าต่อเนื่อง

โดยค่า resistance = 0; โดยถูกกำหนดไว้ตอนแรก
โดยค่า resistanceจะมีค่าได้ระหว่าง 0-255 เพราะ MCP1010 จะทำงานได้ที่ 256 ระดับ
ภายใน loop จะให้ค่า resistance เพิ่มขึ้นเรื่อย นั่นทำให้ค่าความต่างศักย์ลดลง
delay(1000) ไว้หน่วงการส่งที่ 1 วินาที

* คำถาม ทำไมใน function spi_transfer(volatile char data) ถึงต้องนำ char มาเป็นพารามิเตอร์ และ volatile ใช้อย่างไร