After many hours head scratching and fiddling with scopes and logic
analysers etc, I found the issue. Both drivers now working perfectly, daisy
chained, with bit banging or SPI. Embarrassed to say was my error on the
silk screen on the breakout board I made for the PLCC HV5530. I had
transposed DO and POL labels.
Thanks everyone for your help.
On Thursday, 27 March 2025 at 21:48:22 UTC JBro63 wrote:
> Thank you for this.
>
> I'm still getting my head around shifting bits in general so examples are
> really useful; there looks to be a lot going on here! digitalWrite(DATAPin,
> !!(_val & ((uint64_t)1 << (i))));
> I'm making two prototypes, one with only 4 IN12 tubes and 2 INS1 neons
> individually driven from an ESP32 using 4 x K155ID1 and 4 x LTV-851 plus
> one MJE340 for PWM dimming. This is complete and works well but one flaw
> is having had to scrimp on pins meaning tubes 1 & 3 will only go as high as
> 2 & 5 respectively. I intend to connect them all on V2 so will likely need
> the 74HC595 or similar.
>
> The second will have 6 IN14 tubes and 4 IN3 neons hence the 5530. Having
> dropped the frequency today, a basic blink sketch is working using SPI or
> shifting bits manually but only on the first driver. Adding a second breaks
> everything. Both drivers work ok in isolation so I think the issue here is
> with the breakout boards or breadboard joining everything together so will
> be troubleshooting this next.
>
> Thanks.
>
> On Thursday, 27 March 2025 at 11:36:54 UTC Ian Sparkes wrote:
>
>> My hint would be to stay away from SPI until you have done a bit banged
>> version. I have drivers for everything, basically, so if you need some
>> code, I'm happy to help you out. Also be careful of the implicit type
>> conversions that come with bit twiddling and shifting out.
>>
>> This is for the ESP8266 with HV5622 or 5530 drivers:
>>
>> // ************************************************************
>> // Perform the parallel shift out to the registers
>> // ************************************************************
>> IRAM_ATTR void shiftOut64(uint64_t _val) {
>> uint8_t i;
>>
>> // Top 3 digits
>> digitalWrite(LATCHPin, LOW);
>> for (i = 0 ; i < 32 ; i++) {
>> digitalWrite(DATAPin, !!(_val & ((uint64_t)1 << (i))));
>> digitalWrite(CLOCKPin, HIGH);
>> digitalWrite(CLOCKPin, LOW);
>> }
>>
>> // Bottom 3 digits
>> for (i = 0 ; i < 32 ; i++) {
>> digitalWrite(DATAPin, !!(_val & ((uint64_t)1 << (i + 32))));
>> digitalWrite(CLOCKPin, HIGH);
>> digitalWrite(CLOCKPin, LOW);
>> }
>> digitalWrite(LATCHPin, HIGH);
>> }
>>
>> // ************************************************************
>> // Perform the parallel shift out to the registers
>> // ************************************************************
>> IRAM_ATTR void shiftOut64Off() {
>> uint8_t i;
>>
>> digitalWrite(DATAPin, LOW);
>> for (i = 0; i < 64; i++) {
>> digitalWrite(CLOCKPin, HIGH);
>> digitalWrite(CLOCKPin, LOW);
>> }
>>
>> // Latch in
>> digitalWrite(LATCHPin, HIGH);
>> digitalWrite(LATCHPin, LOW);
>> }
>>
>> I kind of guess you are 74HC595s if you are using K155ID1s, so here's a
>> similar piece of code for using 595s:
>>
>> // ************************************************************
>> // Perform the parallel shift out to the registers
>> // ************************************************************
>> void IRAM_ATTR shiftOut64(uint64_t _val1) {
>> uint8_t i;
>>
>> #ifdef INVERT_595_OUTPUTS
>> uint64_t bout = ~_val1;
>> #endif
>>
>> #ifdef NORMAL_595_OUTPUTS
>> uint64_t bout = _val1;
>> #endif
>> digitalWrite(LATCHPin, LOW);
>> for (i = 0; i < 64; i++) {
>> digitalWrite(DATAPin, !!(bout & ((uint64_t)1 << (63 - i))));
>> digitalWrite(CLOCKPin, HIGH);
>> digitalWrite(CLOCKPin, LOW);
>> }
>> digitalWrite(LATCHPin, HIGH);
>> }
>>
>> // ************************************************************
>> // Perform the parallel shift out to the registers
>> // ************************************************************
>> void IRAM_ATTR shiftOut64Off() {
>> uint8_t i;
>>
>> digitalWrite(LATCHPin, LOW);
>> #ifdef INVERT_595_OUTPUTS
>> digitalWrite(DATAPin, HIGH);
>> #endif
>>
>> #ifdef NORMAL_595_OUTPUTS
>> digitalWrite(DATAPin, LOW);
>> #endif
>> digitalWrite(DATAPin, LOW);
>> for (i = 0; i < 64; i++) {
>> digitalWrite(CLOCKPin, HIGH);
>> digitalWrite(CLOCKPin, LOW);
>> }
>> digitalWrite(LATCHPin, HIGH);
>> }
>>
>>
>> Of course, you'll have to adapt to your use case, but it shows the way
>> you have to twiddle the clock and the latch pins.
>>
>> Once you have that working, you can move over to SPI if you need - I have
>> never found it necessary, because I practically always work with interrupt
>> driven displays (hence the IRAM_ATTR) in the signature.
>>
>> Hope that helps.
>>
>> On Wednesday, 26 March 2025 at 21:56:54 UTC+1 JBro63 wrote:
>>
>>> Thanks Richard.
>>>
>>> Spent most of the day on this with little progress. Was able to blank
>>> the display using SPI but unexpected results when enabling and much flicker
>>> of the LEDs evident.
>>>
>>> Out of curiosity I swapped out the ESP32 dev board for a C3 mini and
>>> also tried a ESP82666 D1 which has much improved matters. Alas, ran out of
>>> time. I'll re-visit on Friday.
>>>
>>> Thanks again.
>>>
>>> On Tuesday, 25 March 2025 at 14:24:07 UTC Richard Scales wrote:
>>>
>>>> Hello,
>>>> Firstly, the reason (and I am NO expert) for expressing it that way was
>>>> to remind me that I wanted to store data for 12 x 8 bit elements - ie. 96
>>>> bits - as that was enough bits for what I wanted to control - which - in
>>>> this case was a bunch of 7 segment panaplex displays with DPs. so,
>>>> needing
>>>> 8 bits for each character (7 x segments plus DP) I could control 12 digits.
>>>>
>>>> You could just as easily put:
>>>>
>>>> unsigned char BitArray[12];
>>>>
>>>> To write any one bit in that array I use:
>>>>
>>>> void bitArrayWrite(const unsigned int index, const boolean value)
>>>> {
>>>> if (index > 96)
>>>> return;
>>>> bitWrite(BitArray[index / 8], index % 8, value); // write the right
>>>> bit of the right char
>>>> }
>>>>
>>>> This works out which bit of which byte actually gets set. Once you have
>>>> worked out your strategy for knowing how all your display elements are
>>>> mapped to the outputs of the shift registers then you could set any one
>>>> bit
>>>> on or off as follows:
>>>>
>>>> bitArrayWrite(10,1); // set bit 10 on
>>>> bitArrayWrite(10,0); // set bit 10 off again.
>>>>
>>>> Once you have got all the bits set for the display you want then call
>>>> the SPI transfer function:
>>>>
>>>> SPI.transfer(&BitArray, sizeof(BitArray));
>>>> digitalWrite(LEpin, HIGH);
>>>> digitalWrite(LEpin, LOW);
>>>>
>>>>
>>>> If you are using 2 x HV5530 then change the 96 to 64
>>>>
>>>> Additionally, you will want to include the SPI library and have this in
>>>> void setup()
>>>>
>>>> SPI.begin();
>>>> SPI.setFrequency(10000000L);
>>>> SPI.setBitOrder(MSBFIRST);
>>>> SPI.setDataMode(SPI_MODE1);
>>>>
>>>> - Richard
>>>>
>>>> On Tuesday, 25 March 2025 at 07:37:32 UTC JBro63 wrote:
>>>>
>>>>> @gregebert
>>>>> *Are you driving the HV5530's with the correct signal levels?* I
>>>>> believe so - using a CD4504BE set to CMOS.
>>>>> *Secondly, are you giving enough dead-time before-and-after wiggling
>>>>> the clock signal ?* I'm not including any delay in code but will
>>>>> revisit the datasheet and experiment.
>>>>>
>>>>> @Richard
>>>>> Does that help? - Yes, thank you. I won't be able to check until later
>>>>> but I think I'm setting the latch low before shifting data in. I have a
>>>>> couple of queries please..
>>>>>
>>>>>
>>>>> unsigned char BitArray[96 / 8];
>>>>> What is the significance of 96/8 or is this good coding practice?
>>>>> (ChatGPT called it 'clarity of intent :)) What was the reason for
>>>>> choosing
>>>>> 12 8 bit elements? Are you able to share how you populate the array with
>>>>> data for a digit?
>>>>>
>>>>> Thanks.
>>>>>
>>>>>
>>>>> On Tuesday, 25 March 2025 at 04:19:51 UTC Richard Scales wrote:
>>>>>
>>>>>> I am using SPI with multiple HV5522's (these work the same as
>>>>>> HV5530's as far as this example goes) with total success.
>>>>>>
>>>>>> The point about the 12V logic supply to these devices is based on the
>>>>>> fact that the specification clearly states that they need 12V logic and
>>>>>> whilst many have run them at 5V logic with complete success - for the
>>>>>> sake
>>>>>> of a level shifter I have always played it safe and stuck with 12V. I
>>>>>> see
>>>>>> that you are using a CD4504BE which I guess would be fine, I use
>>>>>> CD40109B
>>>>>> with total success.
>>>>>>
>>>>>> Why use SPI at all? Whilst i am no expert, simply put - instead of
>>>>>> you performing the bit bashing via Shiftout or some similar routine, the
>>>>>> SPI process leaves the job to the processor which takes the pressure off
>>>>>> your code a little - which is never a bad thing. I use Wemos Mini D1's
>>>>>> (ESP8266) so not as beefy as ESP32 and on the D1 you are restricted to
>>>>>> using only certain pins for the SPI transfer, I believe it may be
>>>>>> different
>>>>>> for the ESP32.
>>>>>>
>>>>>> When using SPI transfers I just point the SPI transfer command to the
>>>>>> buffer that contains my data and the micro does the rest. So far I have
>>>>>> driven 4 x HV55xx devices in a row transferring 128 bits in one fell
>>>>>> swoop
>>>>>> with total success.
>>>>>>
>>>>>> There is also a 'thing' about when the latch signal should be
>>>>>> toggled. My understanding is that the Latch signal should be generally
>>>>>> low
>>>>>> and when you want to latch the data to the outputs, set it High then Low
>>>>>> again.
>>>>>>
>>>>>> Here is a snip of my code for sending data out to 3 x HV55xx devices
>>>>>> in a chain, note the commented out ShiftOut commands which are all
>>>>>> replaced
>>>>>> by the single SPI.transfer command:
>>>>>>
>>>>>> // send data out
>>>>>> SPI.transfer(&BitArray, sizeof(BitArray));
>>>>>> /*
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[11]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[10]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[9]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[8]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[7]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[6]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[5]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[4]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[3]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[2]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[1]);
>>>>>> shiftOut(dataPin, clockPin, MSBFIRST, BitArray[0]);
>>>>>>
>>>>>> */
>>>>>>
>>>>>> digitalWrite(LEpin, HIGH);
>>>>>> digitalWrite(LEpin, LOW);
>>>>>>
>>>>>>
>>>>>> Then after the data has all been sent, send the latch pin High and
>>>>>> then Low to latch the data to the output pins.
>>>>>>
>>>>>> In the above example, BitArray was defined as follows:
>>>>>>
>>>>>> unsigned char BitArray[96 / 8]; // space for 96 bits
>>>>>>
>>>>>>
>>>>>> ... so it is a char array with 12 elements.
>>>>>>
>>>>>> All signals going to the HV55xx are at 12V logic levels (CLK, DATA,
>>>>>> LATCH and POL).
>>>>>>
>>>>>> Does that help?
>>>>>>
>>>>>> - Richard
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Tuesday, 25 March 2025 at 01:25:30 UTC gregebert wrote:
>>>>>>
>>>>>>> Are you driving the HV5530's with the correct signal levels ? Per
>>>>>>> the datasheet, they should be 0 or +12V, but many have been able to run
>>>>>>> them at TTL-levels and that can lead to intermittent problems.
>>>>>>>
>>>>>>> Secondly, are you giving enough dead-time before-and-after wiggling
>>>>>>> the clock signal ? If not, there could be a race condition, which can
>>>>>>> get
>>>>>>> worsened if not running at 12V logic levels.
>>>>>>>
>>>>>>> On Tuesday, March 25, 2025 at 4:52:13 AM UTC+7 JBro63 wrote:
>>>>>>>
>>>>>>>> Hi all.
>>>>>>>>
>>>>>>>> Ok so some progress. First PCBs have arrived and the K155ID1 IN12
>>>>>>>> based clock is almost complete. I also knocked up a very basic
>>>>>>>> breakout
>>>>>>>> board for a PLCC 44 pin socket to allow me to start testing with the
>>>>>>>> HV5530
>>>>>>>> with a breadboard and am having mixed results.
>>>>>>>>
>>>>>>>> To learn how to use the HV5530 I'm using LEDs connected to the
>>>>>>>> outputs, each with a 220 ohm resistor in series in place of the nixie
>>>>>>>> tubes
>>>>>>>> and the connections from an ESP32 go through a CD4504BE with VDD at
>>>>>>>> 12v.
>>>>>>>> The LEDs have a common +5V and the POL pin on the HV5530 is tied to
>>>>>>>> +12v
>>>>>>>>
>>>>>>>> https://reboots.g-cipher.net/time/ disusses how to write data to
>>>>>>>> the driver.
>>>>>>>>
>>>>>>>> With only a single HV5530 connected and using digitalWrite() I'm
>>>>>>>> able to blank / light all outputs reliably or target a single output.
>>>>>>>> There
>>>>>>>> is some flicker if I 'disturb' the wires on the breadboard but
>>>>>>>> otherwise
>>>>>>>> seems good. Adding a second driver (shared clock & latch pin, DO on
>>>>>>>> driver
>>>>>>>> one connected to DIN on driver two) causes all LEDs to flicker
>>>>>>>> randomly and
>>>>>>>> those on the second driver are not in the correct sequence.
>>>>>>>>
>>>>>>>> Using a separate set of pins for each driver improves things - the
>>>>>>>> LEDs on driver two light as programmed - but there is still some
>>>>>>>> flickering
>>>>>>>> evident on all LEDs.
>>>>>>>>
>>>>>>>> Is there anything obvious I can change in the above to improve
>>>>>>>> matters? I've seen several references to SPI but am 1) unsure why one
>>>>>>>> would
>>>>>>>> choose SPI over digitalWrite() and 2) it seems more difficult to
>>>>>>>> implement.
>>>>>>>> If anyone has a very simple example how to use SPI with the HV5530 and
>>>>>>>> ESP32 I would be grateful.
>>>>>>>>
>>>>>>>> Thanks
>>>>>>>> On Monday, 10 March 2025 at 11:49:58 UTC JBro63 wrote:
>>>>>>>>
>>>>>>>>> Thanks Ian, that's really helpful.
>>>>>>>>>
>>>>>>>>> On Saturday, 8 March 2025 at 08:33:06 UTC Ian Sparkes wrote:
>>>>>>>>>
>>>>>>>>>> They work fine at 5V. Never had a problem with one at 5V.
>>>>>>>>>>
>>>>>>>>>> But attention: ESP uses 3V3 and you might need to use a lever
>>>>>>>>>> shifter (e.g. CD40109) to make it work.
>>>>>>>>>>
>>>>>>>>>> On Monday, 3 March 2025 at 20:39:00 UTC+1 newxito wrote:
>>>>>>>>>>
>>>>>>>>>>> I use the HV5622, which goes up to 220 V, I think there is also
>>>>>>>>>>> a PLCC version. The disadvantages are the price and that it should
>>>>>>>>>>> be
>>>>>>>>>>> operated with 12V according to spec. However, I never had any
>>>>>>>>>>> problems
>>>>>>>>>>> using the chip with 5V.
>>>>>>>>>>> JBro63 schrieb am Montag, 3. März 2025 um 19:02:56 UTC+1:
>>>>>>>>>>>
>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>
>>>>>>>>>>>> Group noob here, about to start build on a few different types
>>>>>>>>>>>> of display using Nixie tubes and ESP32.
>>>>>>>>>>>>
>>>>>>>>>>>> Planning to use K155ID1 initially (as I have a bunch) with some
>>>>>>>>>>>> IN-12 and IN14 tubes but want to also try HV driver such as the
>>>>>>>>>>>> 5812 or
>>>>>>>>>>>> 5530 so would welcome any comment on which is the best one to go
>>>>>>>>>>>> for or an
>>>>>>>>>>>> alternative. I don't intend to multiplex. Any driver would need to
>>>>>>>>>>>> be DIP
>>>>>>>>>>>> or PLCC.
>>>>>>>>>>>>
>>>>>>>>>>>> Have spent many hours looking at the schematics and designs of
>>>>>>>>>>>> others, I'm grasping the basics but one frustration and evident
>>>>>>>>>>>> gap in my
>>>>>>>>>>>> knowledge is how to pick / calculate the correct component and its
>>>>>>>>>>>> size or
>>>>>>>>>>>> rating for anything other than the most basic circuit.
>>>>>>>>>>>>
>>>>>>>>>>>> For example, with a 180v supply, calculating the anode resistor
>>>>>>>>>>>> for a tube based on the datasheet is straight forward enough as
>>>>>>>>>>>> the
>>>>>>>>>>>> maintaining voltage and current are known.
>>>>>>>>>>>>
>>>>>>>>>>>> When looking at something like the HV5812, many seem to use a
>>>>>>>>>>>> 60 or 70V zener diode with a resistor to keep below the max for
>>>>>>>>>>>> the chip
>>>>>>>>>>>> but how do you determine the current needed for the driver, diode
>>>>>>>>>>>> and load
>>>>>>>>>>>> to be able to calculate the current limiting resistor? The diode
>>>>>>>>>>>> datasheet
>>>>>>>>>>>> is simple enough but I'm lost with the sheet for the HV5812.
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks.
>>>>>>>>>>>>
>>>>>>>>>>>>
--
You received this message because you are subscribed to the Google Groups
"neonixie-l" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion, visit
https://groups.google.com/d/msgid/neonixie-l/81009f93-38d2-49d4-ae2c-c8ebf9ae7339n%40googlegroups.com.