di seguito intervallate dagli * le librerie e un piccolo esempio di funzionamento.
la PCF8574.cpp:****
#include "PCF8574.h"
#include "PCint.h"
PCF8574::PCF8574(){
resetRegister();
}
PCF8574::~PCF8574(){
/* DO NOTHING */
}
void PCF8574::begin(int SADR){
PCFaddress=SADR;
Wire.begin();
}
void PCF8574::pinMode(int pin, int mode){
bitWrite(PCFTRISA,pin,mode);
}
void PCF8574::digitalWrite(int pin,int value){
if((pin >= 0) && (pin < 8)){
bitWrite(PCFPORTA,pin,value);
i2cSend();
}
}
int PCF8574::digitalRead(int pin){
if((pin >= 0) && (pin < 8)){
i2cRead();
return bitRead(PCFPORTA,pin);
}
}
void PCF8574::write(int value){
PCFPORTA = value;
i2cSend();
}
void PCF8574::pullUp(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] == 1;
i2cRead();
bitWrite(PCFPORTA,pin,1);
i2cSend(PCFPORTA);
}
}
void PCF8574::pullDown(int pin){
if((pin >= 0) && (pin < 8)){
PCFPULL[pin] == 2;
i2cRead();
bitWrite(PCFPORTA,pin,0);
i2cSend(PCFPORTA);
}
}
int PCF8574::read(){
i2cRead();
return PCFPORTA;
}
void PCF8574::clear(){
PCFPORTA = 0x00;
i2cSend();
}
void PCF8574::set(){
PCFPORTA = 0xFF;
i2cSend();
}
void PCF8574::toggle(int pin){
if((pin >= 0) && (pin < 8)){
i2cRead();
bitWrite(PCFPORTA,pin,!bitRead(PCFPORTA,pin));
i2cSend();
}
}
void PCF8574::blink(int pin,int time,int wait){
if((pin >= 0) && (pin < 8)){
i2cRead();
for(int i=0;i<time;i++){
bitWrite(PCFPORTA,pin,0);
i2cSend();
delay(wait);
bitWrite(PCFPORTA,pin,1);
i2cSend();
delay(wait);
}
}
}
void PCF8574::enableInterrupt(int pin,void(* selfCheckFunction)(void)){
PCFIntPin = pin;
pinMode(PCFIntPin,INPUT);
PCattachInterrupt(PCFIntPin,selfCheckFunction,FALLING);
}
void PCF8574::disableInterrupt(){
PCdetachInterrupt(PCFIntPin);
}
#ifdef INT_INPUT_ONLY
#define INT_CHECK (PCFTRISA == INPUT)
#else
#define INT_CHECK true
#endif
void PCF8574::checkForInterrupt(){
- sei();*
- PCFBUFFER = i2cRead(0x00);*
- for(int i=0;i<8;i++){*
_ switch(PCFINT*){_
_ case CHANGE:_
if(INT_CHECK && (bitRead(PCFPORTA,i) != bitRead(PCFBUFFER,i)))
_ PCFJMP();
break;
case LOW:_
if(INT_CHECK && (bitRead(PCFBUFFER,i) == 0))
_ PCFJMP();
break;
case FALLING:_
if(INT_CHECK && (bitRead(PCFPORTA,i) == 1) && (bitRead(PCFBUFFER,i) == 0))
_ PCFJMP();
break;
case RISING:_
if(INT_CHECK && (bitRead(PCFPORTA,i) == 0) && (bitRead(PCFBUFFER,i) == 1))
_ PCFJMP();
break;
case 255:
break;
}
}
}
void PCF8574::attachInterrupt(int pin,void (*userFunc)(void),int mode){
if((pin >= 0) && (pin < 8)){
PCFINT[pin] = mode;
PCFJMP[pin] = userFunc;
}
}
void PCF8574::detachInterrupt(int pin){
if((pin >= 0) && (pin < 8)){
PCFINT[pin] = 255;
}
}
void PCF8574::resetRegister(){
PCFPORTA =0;
PCFTRISA =0;
PCFBUFFER =0;
for(int i=0;i<8;i++)
PCFINT = 255;
}
void PCF8574::i2cSend(){
PCFBUFFER = i2cRead(0x00);
for(int i=0;i<8;i++){
if(bitRead(PCFTRISA,i) == INPUT)
bitWrite(PCFPORTA,i,bitRead(PCFBUFFER,i));
if(PCFPULL == 1) bitWrite(PCFPORTA,i,1); // Required for unblock pull level
if(PCFPULL == 2) bitWrite(PCFPORTA,i,0); // Required for unblock pull level
}
Wire.beginTransmission(PCFaddress);
Wire.write(PCFPORTA);
Wire.endTransmission();
}
void PCF8574::i2cSend(int mask){
Wire.beginTransmission(PCFaddress);
Wire.write(PCFPORTA);
Wire.endTransmission();
}
void PCF8574::i2cRead(){_
uint8_t value = 0x00;
_ Wire.requestFrom(PCFaddress, 1);
if(Wire.available()) {
value = Wire.read();
}
PCFPORTA = (int)value;
}
int PCF8574::i2cRead(uint8_t value){
Wire.requestFrom(PCFaddress, 1);
if(Wire.available()) {
value = Wire.read();
}
return (int)value;
}
***************************************** la libreria PCF8574.h :_
#ifndef PCF8574_H
#define PCF8574_H
_#include <Arduino.h>
#include <Wire.h>
typedef void (*FunctionPointer)(void);
class PCF8574 {
public:
PCF8574();
~PCF8574();
void begin(int SADR);
void pinMode(int pin, int mode);
void digitalWrite(int pin,int value);
int digitalRead(int pin);
void write(int value);
int read();
void clear();
void set();
void pullUp(int pin);
void pullDown(int pin);
void toggle(int pin);
void blink(int pin,int time,int wait);
void enableInterrupt(int pin,void( selfCheckFunction)(void)); // Require pointer to an user create gateway function because checkForInterrupt() is in PCF8574 namespace.
void disableInterrupt();
void attachInterrupt(int pin,void (userFunc)(void),int mode);
void detachInterrupt(int pin);
void checkForInterrupt();
private:
volatile int PCFPORTA;
volatile int PCFPULL[8];
volatile int PCFTRISA;
volatile int PCFBUFFER;
volatile int PCFaddress;
int PCFIntPin;
* volatile int PCFINT[8];
volatile FunctionPointer PCFJMP[8];
void resetRegister();
void i2cSend();
void i2cSend(int mask);
void i2cRead();_
int i2cRead(uint8_t value);
_};*_
#endif
*************************************un piccolo esempio che ho usato per testare il funzionamento:*****************************************************
#include <PCF8574.h> // Required for ... all
#include <Wire.h> // Required for I2C communication
PCF8574 A; // Create object from PCF8574 class
PCF8574 B;
void setup(){
* B.begin(0x20);*
* A.begin(0x27); *
* pinMode(13,OUTPUT);*
* Serial.begin(9600); // Setup serial for read echo*
* A.pinMode(0,OUTPUT); // Setup pin D0 as output*
* A.pinMode(1,OUTPUT); // Setup pin D1 as output*
* A.pinMode(2,OUTPUT); // Setup pin D2 as output*
* A.pinMode(3,OUTPUT); // Setup pin D3 as input*
* A.pinMode(4,INPUT); // Setup pin D0 as output*
* B.pinMode(5,INPUT); // Setup pin D1 as output*
* B.pinMode(6,INPUT); // Setup pin D2 as output*
* B.pinMode(7,INPUT); // Setup pin D3 as input*
* }*
* void loop(){*
* if(A.digitalRead(4))*
* {*
* A.digitalWrite(0,HIGH);*
* delay(500);*
* A.digitalWrite(1,HIGH);*
* delay(500);*
* A.digitalWrite(2,HIGH);*
* delay(500);*
* A.digitalWrite(3,HIGH);*
* delay(500);*
* digitalWrite(13,HIGH);*
* delay(500);*
* }*
* else*
* {*
* A.digitalWrite(0,LOW);*
* A.digitalWrite(1,LOW);*
* A.digitalWrite(2,LOW);*
* A.digitalWrite(3,LOW);*
* digitalWrite(13,LOW);*
* }*
}
ciao Speleoduracell.