ok, ill try it.
By the way, the spelling is "indeterminate", not "intermediate".
this is what i have, what should i change?
int AM9111::read(unsigned int address)
{
int rv = 0;
_read() = rv;
_setAddress(address);
return rv;
}
int AM9111::_read()
{
int rv = 0;
digitalWrite(_odp,0);
digitalWrite(_wep,1);
bitWrite(rv,0,digitalRead(_IO[0]));
bitWrite(rv,1,digitalRead(_IO[1]));
bitWrite(rv,2,digitalRead(_IO[2]));
bitWrite(rv,3,digitalRead(_IO[3]));
_read() = rv;
}
_read() = rv;
I thought we'd already decided that this was a no-no?
int AM9111::read(unsigned int address)
{
int rv = 0;
_read() = rv;
_setAddress(address);
return rv;
}
Is that really the correct order of events?
farlepet:
int AM9111::_read()
{
digitalWrite(_odp,0);
digitalWrite(_wep,1);
int rv = 0;
bitWrite(_rbits,0,digitalRead(_IO[0]));
bitWrite(_rbits,1,digitalRead(_IO[1]));
bitWrite(_rbits,2,digitalRead(_IO[2]));
bitWrite(_rbits,3,digitalRead(_IO[3]));
_read() = _rbits;
return rv;
}
Someone's been doing too much Visual Basic.
Instead of:
_read() = _rbits;
return rv;
You want:
return _rbits;
Although I'm not sure what rv does. Did you put it there to make compiler errors go away?
farlepet:
int AM9111::_read()
{
digitalWrite(_odp,0);
digitalWrite(_wep,1);
int rv = 0;
bitWrite(_rbits,0,digitalRead(_IO[0]));
bitWrite(_rbits,1,digitalRead(_IO[1]));
bitWrite(_rbits,2,digitalRead(_IO[2]));
bitWrite(_rbits,3,digitalRead(_IO[3]));
_read() = _rbits;
return rv;
}
I still don't totally get this. Are you trying to change _rbits? In which case why return anything from the function? In that case you want:
void AM9111::_read()
{
digitalWrite(_odp,0);
digitalWrite(_wep,1);
_rbits = 0;
bitWrite(_rbits,0,digitalRead(_IO[0]));
bitWrite(_rbits,1,digitalRead(_IO[1]));
bitWrite(_rbits,2,digitalRead(_IO[2]));
bitWrite(_rbits,3,digitalRead(_IO[3]));
}
But if you want to return stuff, and not affect things such as _rbits (have side-effects) then you actually want:
int AM9111::_read()
{
digitalWrite(_odp,0);
digitalWrite(_wep,1);
int rv = 0;
bitWrite(rv,0,digitalRead(_IO[0]));
bitWrite(rv,1,digitalRead(_IO[1]));
bitWrite(rv,2,digitalRead(_IO[2]));
bitWrite(rv,3,digitalRead(_IO[3]));
return rv;
}
Thanks, ill try it
Yes! It finally compiled! I will upload it tomorrow morning and try it.
Thanks for all your help
And what do you mean by "Someone's been doing too much Visual Basic"?
Well, have you done Visual Basic?
In VB, a function returns its results by assigning to the function name. For example:
function foo (a, b)
foo = a + b ' return result of adding a to b
end function
So when I saw you write:
_read() = _rbits;
I thought you might have thought this was how you returned the function value.
Well i have done a little visual basic, but not much, i did more visual c++.
and i have made an arduino sketch thad did, for example:
boolean yn(int pin)
{
yn = digitalRead(pin);
}
Not one that compiled, right?
sketch_apr23c.cpp: In function 'boolean yn(int)':
sketch_apr23c:2: error: assignment of function 'boolean yn(int)'
sketch_apr23c:2: error: cannot convert 'int' to 'boolean ()(int)' in assignment
hmm, well i know it was something like that, mabey i used if statements or something, i don't know. it was a while ago. Well ill test the lib tomorrow...
Now the _read() always returns 0
here is the code:
#include "AM9111.h"
#include "WProgram.h"
/////////////////////////////////////////
//
// PUBLIC
//
AM9111::AM9111(uint8_t outputDisablePin, uint8_t writeEnablePin)
{
_odp = outputDisablePin;
_wep = writeEnablePin;
}
int AM9111::setIO(uint8_t IO0, uint8_t IO1, uint8_t IO2, uint8_t IO3)
{
_IO[0] = IO0;
_IO[1] = IO1;
_IO[2] = IO2;
_IO[3] = IO3;
}
int AM9111::read(unsigned int address)
{
int rv = 0;
_setAddress(address);
return rv;
}
int AM9111::write(unsigned int address, uint8_t value)
{
int rv = 0;
_setAddress(address);
rv = _write(value);
return rv;
}
/////////////////////////////////////////
//
// PRIVATE
//
void AM9111::_setAddress(unsigned int address)
{
for(int p=0; p<8; p++)
{
pinMode(p, OUTPUT);
digitalWrite(p, bitRead(address, p));
}
}
int AM9111::_read()
{
digitalWrite(_odp,0);
digitalWrite(_wep,1);
int rv = 0;
bitWrite(rv,0,digitalRead(_IO[0]));
bitWrite(rv,1,digitalRead(_IO[1]));
bitWrite(rv,2,digitalRead(_IO[2]));
bitWrite(rv,3,digitalRead(_IO[3]));
return rv;
}
int AM9111::_write(uint8_t value)
{
digitalWrite(_odp,1);
digitalWrite(_wep,0);
int rv = 0;
digitalWrite(_IO[0],bitRead(0,value));
digitalWrite(_IO[1],bitRead(1,value));
digitalWrite(_IO[2],bitRead(2,value));
digitalWrite(_IO[3],bitRead(3,value));
return rv;
}
is it because of the first read statement rv = 0?
Yes.
That, and the fact that you don't call _read from read.
how do you call _read from read?
In your own reply #30, you very nearly did.
You just got it the wrong way round.
I got it to work, and i just got the Shift Registers today, so i will experiment with them and add to the library.
I got the shift register working, but it wont work now, it keeps sending a zero
#include "AM9111_Shift.h"
#include "WProgram.h"
/////////////////////////////////////////
//
// PUBLIC
//
AM9111::AM9111(uint8_t outputDisablePin, uint8_t writeEnablePin, uint8_t clockPin, uint8_t latchPin, uint8_t dataPin)
{
_odp = outputDisablePin;
_wep = writeEnablePin;
_cp = clockPin;
_lp = latchPin;
_dp = dataPin;
pinMode(_lp, OUTPUT);
pinMode(_cp, OUTPUT);
pinMode(_dp, OUTPUT);
}
int AM9111::setIO(uint8_t IO0, uint8_t IO1, uint8_t IO2, uint8_t IO3)
{
_IO[0] = IO0;
_IO[1] = IO1;
_IO[2] = IO2;
_IO[3] = IO3;
}
int AM9111::read(unsigned int address)
{
int rv = 0;
_setAddress(address);
return rv;
}
int AM9111::write(unsigned int address, uint8_t value)
{
int rv = 0;
_setAddress(address);
rv = _write(value);
return rv;
}
/////////////////////////////////////////
//
// PRIVATE
//
void AM9111::_setAddress(unsigned int address)
{
for(int p=0; p<8; p++)
digitalWrite(_lp, LOW);
// shift out the bits:
shiftOut(_dp, _cp, MSBFIRST, address);
//take the latch pin high so the LEDs will light up:
digitalWrite(_lp, HIGH);
// pause before next value:
delay(15);
}
int AM9111::_read()
{
pinMode(_IO[0],INPUT);
pinMode(_IO[1],INPUT);
pinMode(_IO[2],INPUT);
pinMode(_IO[3],INPUT);
digitalWrite(_odp,0);
digitalWrite(_wep,1);
int rv = 0;
bitWrite(rv,0,digitalRead(_IO[0]));
bitWrite(rv,1,digitalRead(_IO[1]));
bitWrite(rv,2,digitalRead(_IO[2]));
bitWrite(rv,3,digitalRead(_IO[3]));
return rv;
}
int AM9111::_write(uint8_t value)
{
pinMode(_IO[0], OUTPUT);
pinMode(_IO[1], OUTPUT);
pinMode(_IO[2], OUTPUT);
pinMode(_IO[3], OUTPUT);
digitalWrite(_odp,1);
digitalWrite(_wep,0);
int rv = 0;
digitalWrite(_IO[0],bitRead(0,value));
digitalWrite(_IO[1],bitRead(1,value));
digitalWrite(_IO[2],bitRead(2,value));
digitalWrite(_IO[3],bitRead(3,value));
return rv;
}
it keeps sending a zero
I wonder why that is:
int AM9111::read(unsigned int address)
{
int rv = 0;
_setAddress(address);
return rv;
}