Hallo Mede Arduino gebruikers,
Introductie: Na een tijdje zoeken op internet ben ik dit forum tegen gekomen en ben benieuwd of iemand mij kan helpen met het implementeren van een extra optie in een bestaande firmware van mijn Nixie klok.

De firmware van de Gra & Afch IN-14 Arduino Shield Nixie tube Clock is vrij standaard zonder al te veel poespas.
Ik heb zelf met een vriend van me enkele opties toegevoegd zodat ik doormiddel van een ESPEasy de menu knoppen kan bedienen en de tubes kan uitschakelen.
Nu heeft iemand anders een fade optie gemaakt voor zijn Nixie Tubes en heb deze om zijn firmware gevraagd. De verschillen heb ik allemaal wel kunnen ontdekken in zijn firmware en kunnen plakken / verwerken in mijn eigen firmware. Als ik deze vervolgens toepas krijg ik geen fade in de overgang van de cijfers ze knipperen meer.
Ik heb wel een verschil in beide firmwares gevonden welke naar mijn mening zorgt voor dit probleem.
De NCS314 gebruikt de
HV57708 64-Channel 32-MHz Serial-to-Parallel Converter with Push-Pull Outputs.
De NCT818 gebruikt de
HV5122 32-Channel Serial-to-Parallel with Open-Drain Outputs.
In de arduino code wordt dit doormiddel van de SPI verschillend aangestuurd.
Knip uit de NCS314 doindication.ino firmware://-------- REG 1 -----------------------------------------------
Var32=0;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(5))<<20; // s2
digits=digits/10;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(4))<<10; //s1
digits=digits/10;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(3)); //m2
digits=digits/10;
if (LD) Var32|=LowerDotsMask;
else Var32&=~LowerDotsMask;
if (UD) Var32|=UpperDotsMask;
else Var32&=~UpperDotsMask;
for (int i=1; i<=32; i++)
{
i=i+32;
int newindex=16*(3-(ceil((float)i/4)*4-i))+ceil((float)i/4);
i=i-32;
/*Serial.print("i=");
Serial.print(i);
Serial.print(" newindex=");
Serial.println(newindex);*/
if (newindex<=32) bitWrite(New32_L, newindex-1, bitRead(Var32, i-1));
else bitWrite(New32_H, newindex-32-1, bitRead(Var32, i-1));
}
//-------------------------------------------------------------------------
//-------- REG 0 -----------------------------------------------
Var32=0;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(2))<<20; // m1
digits=digits/10;
Var32|= (unsigned long)(SymbolArray[digits%10]&doEditBlink(1))<<10; //h2
digits=digits/10;
Var32|= (unsigned long)SymbolArray[digits%10]&doEditBlink(0); //h1
digits=digits/10;
if (LD) Var32|=LowerDotsMask;
else Var32&=~LowerDotsMask;
if (UD) Var32|=UpperDotsMask;
else Var32&=~UpperDotsMask;
for (int i=1; i<=32; i++)
{
int newindex=16*(3-(ceil((float)i/4)*4-i))+ceil((float)i/4);
if (newindex<=32) bitWrite(New32_L, newindex-1, bitRead(Var32, i-1));
else bitWrite(New32_H, newindex-32-1, bitRead(Var32, i-1));
}
SPI.transfer((New32_H)>>24);
SPI.transfer((New32_H)>>16);
SPI.transfer((New32_H)>>8);
SPI.transfer(New32_H);
SPI.transfer((New32_L)>>24);
SPI.transfer((New32_L)>>16);
SPI.transfer((New32_L)>>8);
SPI.transfer(New32_L);
digitalWrite(LEpin, HIGH); //<<-- это правильно H -> L
digitalWrite(LEpin, LOW); // <<-- это правильно H -> L
//-------------------------------------------------------------------------
Knip uit de NCT818 doindication.ino firmware://-------- REG 1 -----------------------------------------------
Var32=0;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(5)&blankDigit(2))<<20; // s2
digits=digits/10;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(4)&blankDigit(3))<<10; //s1
digits=digits/10;
Var32|=(unsigned long) (SymbolArray[digits%10]&doEditBlink(3)&blankDigit(4)); //m2
digits=digits/10;
if (LD) Var32&=~LowerDotsMask;
else Var32|=LowerDotsMask;
if (UD) Var32&=~UpperDotsMask;
else Var32|=UpperDotsMask;
SPI.transfer(Var32>>24);
SPI.transfer(Var32>>16);
SPI.transfer(Var32>>8);
SPI.transfer(Var32);
//-------------------------------------------------------------------------
//-------- REG 0 -----------------------------------------------
Var32=0;
Var32|=(unsigned long)(SymbolArray[digits%10]&doEditBlink(2)&blankDigit(5))<<20; // m1
digits=digits/10;
Var32|= (unsigned long)(SymbolArray[digits%10]&doEditBlink(1)&blankDigit(6))<<10; //h2
digits=digits/10;
Var32|= (unsigned long)SymbolArray[digits%10]&doEditBlink(0)&blankDigit(7); //h1
digits=digits/10;
if (LD) Var32&=~LowerDotsMask;
else Var32|=LowerDotsMask;
if (UD) Var32&=~UpperDotsMask;
else Var32|=UpperDotsMask;
SPI.transfer(Var32>>24);
SPI.transfer(Var32>>16);
SPI.transfer(Var32>>8);
SPI.transfer(Var32);
if ((hour() < TimeToSleep) & (hour() >= TimeToWake))
// if (!light)
{
digitalWrite(LEpin, HIGH);
} else {
if ((counter2 % SleepDim) == 0) digitalWrite(LEpin, HIGH);
}
//-------------------------------------------------------------------------
Als ik de bovenstaande code van de NCT818 kopieer naar de NCS314 firmware is de Fade aanwezig alleen is er totaal geen logica meer naar welke tube wat gestuurd wordt. Kortom alles word door elkaar aangestuurd en er is totaal geen tijd af te lezen. Maar de gewenste fade is er wel

.
Eigen kennis:Het betere knip en plak werk.
Firmwares Github:Default Firmware NCS314Modified Firmware NCT818Schema:Schema NCS314Video's:Fade optie toegevoegd zonder Registers aan te passenFade werkt met foute registersIs het mogelijk dit toch goed werkend te krijgen? Ik hoop dat ik voldoende en duidelijke uitleg heb kunnen geven.
Alvast bedankt voor de gedane moeite!.
Met vriendelijke groet,
Brutus.