Upload
john-smit
View
217
Download
0
Embed Size (px)
Citation preview
8/19/2019 ESL - Learning Space
1/4
2/18/2016 ESL - Learning Space
http://cpre.kmutnb.ac.th/esl/learning/index.php?article=pcf8574a-i2c
"Embedded Space"
Think − Do − Learn − Share
การใช งานไอซ PCF8574 / PCF8574A สร า ง พ อ ร ต I/O ขนาด 8 บ ต ให Arduino
ในกรณท ⡅ต องการเช ⡅อมตอระหวางไมโครคอนโทรลเลอร (เช น บอรด Arduino) และอปกรณอ ⡅นแบบดจทัล สามารถเช ⡅อมตอได โดยตรง ตามจานวนขาส ัญญาณท ⡅ต องการใช แตจานวนขา I/O ของไมโครคอนโทรลเลอรท ⡅ต องใช จะเพ ⡅มข ꪍนตามจานวนส ัญญาณ เทคนคหน ⡅งท ⡅ช วยประหยัดขา I/O ของไมโครคอนโทรลเลอรคอ การใช ไอซ ขยายพอรต หรอเพ ⡅มจานวนขาI/O (หรอท ⡅เรยกวา I/O Port Expander) บทความน ꪍกลาวถง การใช งานไอซ PCF8574A (ของบรษัท NXP) รวมกับบอรดArduino โดยจะทดลองตอวงจรบนเบรดบอรด และใช ขา I/O ของไอซ เปนเอาตพตอยางเดยว
ไอซ PCF8574 / PCF8574A
ไอซ อยางเช น PCF8574 I/O Port Expander สามารถนามาใช เช ⡅อมตอ I/O แบบดจทัลไดถง 8บต และเช ⡅อมตอแบบบัสI2C ซ ⡅งใช ส ัญญาณเพยงสองเส น (SCL และ SDA) เทานꪍัน ดังนꪍันจงใช ขาดจทัล I/O ของไมโครคอนโทรลเลอรเพยงสองเส น ไมโครคอนโทรลเลอรทาหนาท ⡅เปน I2C Master (เปนฝ ายเร ⡅มตดตอส ⡅อสารและกาหนดจังหวะการทางานดวยส ัญญาณclock) ในขณะท ⡅ไอซ PCF8574ทางานเปน I2C Slave (เป นฝ ายคอยตอบสนองตอการตดตอส ⡅อสารจาก I2C Master)นอกจากนัꪍน ถ าต องการมากกวา 8 บต กสามารถใช ไอซ PCF8574 ได หลายตัวในระบบบัสเดยวกัน เพยงแตกาหนดหมายเลขท ⡅อย ของไอซ แตละตัวไดตางกัน (เรยกท ⡅อย น ꪍวา I2C Slave Address) ตัวถังของไอซ มขา A2,A1,A0 ส าหรับใช กาหนดคาให 3 บตลางจากทัꪍงหมด 7บตของเลขท ⡅อย (7-bit Address) ดังนꪍันในบัส I2C เดยวกัน สามารถตอไอซ น ꪍได จานวนถง 8 ตัว ไอซ PCF8574 และ PCF8574A ทางานไดเหมอนกัน ตางกันท ⡅บตของหมายเลขท ⡅อย หมายเลขท ⡅อย ขนาด7 บต มรปแบบดังน ꪍ PCF8574: "0100xxx" และ PCF8574A: "0111xxx" โดยท ⡅ xxx คอ 3 บต ท ⡅จะถกกาหนดโดยขา A2, A1,
A0
ข อมลเช ง เ ท ค น ค เ ก ⡅ย ว กบัไอซ โดยสรป
ช วงแรงดันไฟเล ꪍยง: 2.5V ถง 6Vกาหนดคาบตส าหรับเลขท ⡅อย ได 3 บต (ขา A2, A1,A0)ใช ความถ ⡅ SCL ได เพยง 100kHzขา I/O ม 8 บต ใช งานไดแบบดจทัลและสองทศทาง (bidirectional)ปรมาณกระแสไหลแบบ Sink ได ขาละไมเกน 25mA แตปรมาณกระแสไหลแบบ Source ได ขาละไมเก น 0.3mA
ไอซ PCF8574 และ PCF8574A (ส าหรับตัวถังแบบ PDIP-16) มขาดังน ꪍ
8/19/2019 ESL - Learning Space
2/4
2/18/2016 ESL - Learning Space
http://cpre.kmutnb.ac.th/esl/learning/index.php?article=pcf8574a-i2c
Pin 1 = A0 เปนขาอนพต Address Input 0 (ส าหรับกาหนดคาใหหมายเลขท ⡅อย ส าหรับบตท ⡅ 0)Pin 2 = A1 เปนขาอนพต Address Input 1 (ส าหรับกาหนดคาใหหมายเลขท ⡅อย ส าหรับบตท ⡅ 1)Pin 3 = A2 เปนขาอนพต Address Input 2 (ส าหรับกาหนดคาใหหมายเลขท ⡅อย ส าหรับบตท ⡅ 2)Pin 4 = P0 เปนขา Digital I/O 0Pin 5 = P1 เปนขา Digital I/O 1Pin 6 = P2 เปนขา Digital I/O 2Pin 7 = P3 เปนขา Digital I/O 3Pin 8 = VSS เปนขา Supply GroundPin 9 = P4 เปนขา Digital I/O 4Pin 10 = P5 เปนขา Digital I/O 5Pin 11 = P6 เปนขา Digital I/O 6Pin 12 = P7 เปนขา Digital I/O 7Pin 13 = /INT interrupt output (active LOW) เปนขาเอาตพต (open-drain output) ให ตอ pull-up ด วยPin 14 = SCL เปนขา Serial Clock Line (SCL) ของบัส I2CPin 15 = SDA เปนขา Serial Data Line (SDA) ของบัส I2CPin 16 = VDD เปน Supply Voltage ส าหรับปอนแรงดันไฟเล ꪍยง
ศ กษาขอมลเพ ⡅มเตมไดจาก PCF8574 Datasheet
ในการทดลอง จะตอวงจรบนเบรดบอรดตามผังวงจรตอไปน ꪍ ส ังเกตวา ได เลอกใช ตัวต านทานแบบ R-Pack ขนาด 330 โอหม ทาใหสะดวกในการตอวงจร ขา I/O ของไอซ PCF8574A จะถกใช เปนเอาตพต และเม ⡅อขาใดมลอจกเปน LOW จะทาให LEDท ⡅ตอกับขาดังกลาว "ตด" (มกระแสไหลจาก VCC = +5V ไปผานตัวต านทาน และ LED ไปยังขาของไอซ )
http://cpre.kmutnb.ac.th/esl/learning/pcf8574a-i2c/pcf8574_datasheet.pdf
8/19/2019 ESL - Learning Space
3/4
2/18/2016 ESL - Learning Space
http://cpre.kmutnb.ac.th/esl/learning/index.php?article=pcf8574a-i2c
Arduino Sketch
ส าหรับการเช ⡅อมตอส ⡅อสารกับไอซ PCF8574A ด วย Arduinoผานบัส I2C สามารถใช ไลบราร ⡅ Wireของ Arduino ได ซ ⡅งจะทาใหการเขยนโคดทาไดงายข ꪍน ข อควรระวังคอ การเลอกใช ขา SDA และ SCL ให ถกต อง เม ⡅อนาไปตอวงจร และการกาหนดหมายเลขท ⡅อย (7-bit Slave Address) ถ ากาหนดคาในโคดไมถกต อง จะทาใหไมสามารถส ⡅อสารกับไอซ ได
พฤตกรรมการทางานของโค ดมดังน ꪍ ฟังกช ัน running_led_light() จะวนลปคอยทาหนาท ⡅ส งข อมลไปยังไอซ ซ ⡅งเปนขอมล 8
บตส าหรับขา I/O และเปนตัวกาหนดสถานะ "ตด" หรอ "ดับ" ของ LEDแตละดวง ในตัวอยางน ꪍ จะส งคา 8บต ในรปแบบท ⡅ทาใหการทางานของ LEDปรากฏในลักษณะของ "ไฟว ⡅ง"
// Author: RSP @KMUTNB// Date: 2013‐10‐27// Board: Arduino Uno / Leonardo / Mega2560// Arduino IDE: version 1.0.5// This sketch shows how to use send 8‐bit data to a PCF8574A IC// which is used to turn on/off eight LEDs.
// Arduino Uno: SDA = A4, SCL = A5// Arduino Leonardo: SDA = D2, SCL = D3// Arduino Mega2560: SDA = D20, SCL = D21// Connect: 2.2k or 4.7k pull‐up resistors to SDA and SCL lines
// Use VCC=5V for PCF8574A// PCF8574A pins in output mode should be used to sink current (up to 25mA).// Don't use its I/O pin to source current!// Pin P0..P7 are connected to 8x LED+330R (current sink).
#include // use the Wire library// See: http://arduino.cc/en/reference/wire
// connect address pins: A0=0 (GND), A1=0 (GND), A2=0 (GND)#define ADDR_BITS (0B000) // A0=0,A1=0,A2=0#define I2C_SLAVE_ADDR ((0B0111000) | ADDR_BITS) // 7‐bit address
/*TWBR = ((F_CPU / TWI_FREQ) ‐ 16) / 2;
For TWI_FREQ = 100000 and F_CPU = 16000000:=> TWBR = 72
For TWI_FREQ = 400000 and F_CPU = 16000000:=> TWBR = 12
*/
void setup() {Wire.begin();// TWBR = 12; // for 400kHz
}
void writeOutput( byte value ) {Wire.beginTransmission( I2C_SLAVE_ADDR );Wire.write( ~value ); // inverted logic (bitwise inverting)Wire.endTransmission();
}
void running_led_light() {static byte value = 0x01;static byte dir = 1;static byte dly = 100;while(true) {
writeOutput ( value );if (dir) { // forward
value = (value > 7);} else { // backward
value = (value >> 1) | ((value
8/19/2019 ESL - Learning Space
4/4
2/18/2016 ESL - Learning Space
http://cpre.kmutnb.ac.th/esl/learning/index.php?article=pcf8574a-i2c
ไปหนารายการบทความ / Back to the article list ห องปฏบัตการระบบสมองกลฝังตัว ภาควชาวศวกรรมไฟฟาและคอมพวเตอร คณะวศวกรรมศาสตร มหาวทยาลยัเทคโนโลยพระจอมเกล าพระนครเหนอ (KMUTNB)Embedded Systems Lab (ESL) / Computer Engineering ProgramDepartment of Electrical and Computer Engineering (ECE)Faculty of Engineering, KMUTNB, Bangkok / Thailand
dly ‐= 10; // decrement delay by 10if (dly < 10) {
dly = 100;writeOutput( 0xFF );delay(1000);
}}else if (value == 0x80 && dir == 1) {
dir = 0; // forward}delay( dly );
}}
void loop() {running_led_light();
}//////////////////////////////////////////////////////////////////
รปแสดงการตอวงจรบนเบรดบอรด
แก ไขครัꪍงลาสด (Last Update): 27 Oct. 2013
เผยแพรภายใตลขส ทธ 㧞 / This work is licensed under: Creative Commons Attribution-NonCommercial 3.0 Unported
© 2007-2016 Embedded System Lab | Maintained by RSP
http://creativecommons.org/licenses/by-nc/3.0/http://cpre.kmutnb.ac.th/esl/learning/index.php