Go Down

Topic: Fade optie voor NCS314 Arduino Shield Nixie Tube Clock (Read 164 times) previous topic - next topic

brutusss

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:
Code: [Select]
//-------- 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:
Code: [Select]
//-------- 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 :smiley-roll-blue: .

Eigen kennis:
Het betere knip en plak werk.

Firmwares Github:
Default Firmware NCS314
Modified Firmware NCT818

Schema:
Schema NCS314

Video's:
Fade optie toegevoegd zonder Registers aan te passen
Fade werkt met foute registers

Is 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.

MAS3

Hoi brutusss, welkom !

Ik kan niet zeggen dat ik begrijp wat er in de snippets die je laat zien moet gebeuren.
Maar ik kan net zo goed als jij lezen wat daar staat, en dan valt dit verschil tussen de 2 snippets op:

Code: [Select]
  if (LD) Var32|=LowerDotsMask;
    else  Var32&=~LowerDotsMask;
 
  if (UD) Var32|=UpperDotsMask;
    else Var32&=~UpperDotsMask;


Tegen

Code: [Select]
  if (LD) Var32&=~LowerDotsMask;
    else  Var32|=LowerDotsMask;
 
  if (UD) Var32&=~UpperDotsMask;
    else  Var32|=UpperDotsMask;


Hier zie ik dat deze twee tegenovergesteld werken.

Verder is het in 90% (of meer) van de gevallen met zulke vragen, dat er bedradingsfouten zijn.
Nou is het natuurlijk zo dat je 1 van de 2 correct aan het werken hebt, maar je geeft ook aan dat er een hardware verschil zit in de 2 sketches.
Zo kan het zijn dat de ene converter een HIGH nodig heeft om een uitgang te activeren, en de andere een LOW.
En het kan zijn dat ze gewoon anders uitbedraad zijn (dus hoe de verbindingen tussen converter module en je nixie driver board lopen).
Dat uitbedraden moet jij dus met elkaar gaan vergelijken.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

ArdLab_Gent

Begrijp je wat het verschil is tussen push-pull output en open-drain output?
op een push-pull output wordt door de driver spanning gezet, een open drain output is 1 enkele transistor waarvan de collector niet verbonden is en waar je zelf voor de spanning moet zorgen, beide outputs worden op een totaal andere manier geïntegreerd in het schema.

Heb je het schema van die klok?

ArdLab geeft Arduino workshops voor beginners.
ArdLab is lid van de STEM-Academie.
http://www.ardlab.gent - http://www.stem-academie.be/

brutusss

Dank voor jullie antwoorden!

@MAS3:
Dit zijn kant en klare shields welke je kan kopen. Het enige wat je hoeft te doen is de Arduino Uno of Mega te laden met een door hun aangeleverde standaard firmware.

Nu heb ik zelf met een vriend al enkele kleine aanpassingen gedaan aan deze standaard firmware om met een ESPEasy via domoticz de tubes uit en aan te kunnen zetten als ik niet thuis ben. Zo bespaar je de levensduur van de tubes een beetje. Nu had ik deze fade functie gezien en wilde deze graag implementeren maar er blijkt toch hardware verschillen te zijn waardoor de code ook anders is.

@ArdLab_Gent:
Ik begrijp dat er een verschil is tussen die twee outputs. Vandaar ook dat er een verschil zit in de output code. Ik begrijp alleen niet hoe ik dit zou moeten vertalen naar de firmware. De standaard firmware werkt uiteraard naar behoren hierin zou ik ook niks hoeven aanpassen. Ik zou alleen die fade opties willen toevoegen. Dat heb ik dus gedaan maar dat krijg ik niet aan de praat omdat de ene code gemaakt is voor de NCT818.  

Ik heb een link in de startpost gezet naar het schema van mijn Arduino shield.

Dit is wat die andere persoon heeft aangepast aan zijn firmware onder andere:
Code: [Select]
//driver for NCM107+NCT318+NCT818 (registers HV5122)
//driver version 1.0
//1 on register's output will turn on a digit

#include "doIndication818.h"

#define UpperDotsMask 0x80000000
#define LowerDotsMask 0x40000000

void doIndication()
{
  static unsigned long lastTimeInterval1Started;
  static unsigned long lastTimeInterval2Started;
//  int light = digitalRead(pinLightSens);
  static int fadecycles = 20;

  static int counter2 = 0;
  static int counter3 = 0;
  static int counter4 = fadecycles;
  static int fadebegin = 1;
  long digits=stringToDisplay.toInt();
  static int LastSecond = second();
  if ((micros()-lastTimeInterval1Started)<fpsLimit) return;

if (LastSecond == second()) {
  counter2 ++;
  counter3 ++;
} else {
  counter2 = 0;
  counter3 = 0;
  counter4 = fadecycles;
  fadebegin = 1;
  LastSecond = second();
  lastTimeInterval2Started=micros();
}
  //if (menuPosition==TimeIndex) doDotBlink();
  lastTimeInterval1Started=micros();
  unsigned long Var32=0;
  if (
      (counter2 < 300)
    & (menuPosition == TimeIndex)
    & (second() > 0)
    & ((micros()-lastTimeInterval2Started) > 100)
//    & (!light)
    & (hour() < TimeToSleep)
    & (hour() >= TimeToWake)
    & !transactionInProgress
      )
    {
      if (fadebegin == 1) {
        if (((counter3) <= counter4))
        {
      digits = prevstringToDisplay.toInt();
    } else {
      counter4 --;
      counter3 = 0;
      digits=stringToDisplay.toInt();  
      }
      if (counter4 <= 2) {
        fadebegin = 0;
        counter4 = 0;
        counter3 = 0;
        }
    } else {
    if (((counter3) <= counter4)) {
      digits = stringToDisplay.toInt();
      } else {
        counter4 ++;
        counter3 = 0;
        digits = prevstringToDisplay.toInt();
        }
      }
    } else digits=stringToDisplay.toInt();
 
  //long digits=stringToDisplay.toInt();
  //long digits=12345678;
  //Serial.print("strtoD=");
  //Serial.println(stringToDisplay);
  
  /**********************************************************
   * Подготавливаем данные по 32бита 3 раза
   * Формат данных [H1][H2}[M1][M2][S1][Y1][Y2]
   *********************************************************/
  
  digitalWrite(LEpin, LOW);

 
 //-------- REG 1 -----------------------------------------------


Hierna komt het hierboven al eerder genoteerde code van de registers.

Met vriendelijke groet,
Brutus.

shooter

als de fade begint moet je de timer wel op nul zetten net zoals aan het eind een andere timer, dat zie ik niet,
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

brutusss

als de fade begint moet je de timer wel op nul zetten net zoals aan het eind een andere timer, dat zie ik niet,

Dank voor je antwoord, zou je me wellicht kunnen aangeven wat ik waar zou moeten toevoegen? 

brutusss

Zojuist enkele video's toegevoegd aan de start post welke visueel aangeven wat er gebeurd met de verschillende codes.

Tubes werken normaal op de NCS314 alleen de fade hapert: Video
Tubes werken niet normaal maar de fade wel NCS314 firmware met de register codes van de NCT818: Video

Go Up