Hey friends,
I have a two daisy chained shift registers (74AHC595) which are controlled via an ESP32. I want to set one output to high at a time before switching to the next.
The code seems to work, but the outputs O_9 and O_10 are not staying high (zoom) after setting them, whereas all the other ones are working fine. This is the used code snipped:
pinMode(SHIFT_OUT_DATA, OUTPUT); pinMode(SHIFT_OUT_CLK, OUTPUT); pinMode(SHIFT_OUT_N_EN, OUTPUT); pinMode(SHIFT_OUT_LATCH, OUTPUT); digitalWrite(SHIFT_OUT_N_EN, LOW); uint16_t input_bin = 0b1000000000000000; for(int i=0; i<17; i++){ byte upper_byte = input_bin >> 8; byte lower_byte = input_bin & 0x00FF; digitalWrite(SHIFT_OUT_LATCH, LOW); shiftDataOut(SHIFT_OUT_DATA, SHIFT_OUT_CLK, MSBFIRST, lower_byte); shiftDataOut(SHIFT_OUT_DATA, SHIFT_OUT_CLK, MSBFIRST, upper_byte); usleep(10); digitalWrite(SHIFT_OUT_LATCH, HIGH); delay(10) input_bin = input_bin>>1; }
Is there anything I’m doing wrong, or any idea on where the problem may lie? I’ve already tried looking for shorts and other error sources, but the design was manufactured on a PCB and no assembly issues are noticeable.
Kalcifer@lemm.ee 1 year ago
The first two lines of the for loop,
don’t really accomplish anything. The first line is bit shifting to the right 8, and then you write over that with all 1s. For example, starting with
input_bin
:So, every time you go through a cycle of the for loop, you’ll just start with the same values in
upper_byte
, andlower_byte
. To sequentially output each shifted value, you’ll instead want something like:quiescentcurrent@discuss.tchncs.de 1 year ago
You’re 100% right, I’ve lost ‘i’ somewhere in my debugging process
byte upper_byte = input_bin >> (8+i) ; byte lower_byte = (input_bin >> i) & 0x00FF;
mvirts@lemmy.world 1 year ago
I think you got and and or switched, first two lines should be fine for shifting the top 8 bits down.
Kalcifer@lemm.ee 1 year ago
I don’t follow what you mean.