Eine VFD-Anzeige bekommt ein neues Leben 

von Alexander "electronicfox" Fuchs              
   

Elektronik-Labor  Bastelecke  Projekte  Notizen



Irgendwann kommt jeder Elektroniker in seinem Leben in den Kontakt von VFD-Anzeigen, entweder weil man einen Videorecorder zerlegt oder einen CD-Player repariert. Eine kleine unscheinbare Glasplatte mit interessanten Innenleben von Symbolen, Heizdraht und jede Menge an Lötkontakten, welche auf eine stabile Platine gelötet sind. Unverwechselbares Klingen bei jeder Bewegung dieses Bauteils. Das sind die Eigenschaften eines Vakuum-Fluoreszenz-Displays. Erst im Betrieb zeigt sich ein herrlich anzusehendes Schauspiel aus Ästhetik und Vollkommenheit.
 
Vakuumfluoreszenzanzeigen sind zwischen einer durchsichtigen Glasscheibe und einer rückseitigen Basisplatte, die üblicherweise ebenfalls aus Glas besteht, aufgebaut. Die Platten sind am Rand mit Glaslot verbunden oder miteinander verklebt, das dazwischen liegende Anzeigesystem befindet sich im Vakuum. Vor den DIGIT-Gittern ist ein dünner, mit Oxiden beschichteter Wolfram-Heizdraht gespannt, welcher als direktbeheizte Kathode arbeitet und von diesem werden thermisch Elektronenemittiert die dann zu den Anoden-Segmenten bei positiver Gitterspannung geleitet werden. Die Leuchtstoffschicht aus Phosphor, mit der die Anoden bedeckt sind, beginnt beim Auftreffen der Elektronen zu leuchten wie im „Magischen Auge“. Ein Segment der Anzeige leuchtet, wenn sowohl das Gitter als auch die Anode elektrisch positiv gegenüber der Kathode sind. Die Spannung zwischen Anode und Kathode liegt zwischen ca. 18 und 40 Volt.

 

Da die Betriebsspannung noch basteltauglich ist, ist klar etwas damit bauen zu müssen. Die 30 V kann man leicht aus 12 V erzeugen, Die Heizspannung aus den 5 V gewinnen. Mein VFD-Display stammt aus einem Videorecorder der 1990er-Jahre und soll mir Programmplatz, Frequenz, Tage und Uhrzeit anzeigen können. Es hat lang gedauert das Konzept zusammen zu programmieren, auch das Herausfinden der PIN-Belegung dauerte etwas. Eines war im Vorhinein klar, es musste ein Anzeigenmultiplex gebaut werden.

Ein Schaltbildschafft Klarheit:

 

Die Transistoren T1, T2 und T3 erzeugen zusammen mit einigen zusätzlichen Bauteilen die ca. +30 V für die VFD-Anzeige, die Schutzschaltung mit der Zenerdiode D2 und einigen Teilgruppen der ULN2003-ICs sorgen dafür, dass Segmente und DIGITs nie mehr als 30V abbekommen und dadurch die Anzeige helligkeitsstabil bleibt. Hierbei wurde bewusst darauf geachtet, verfügbare Bauteile zu verwenden.  Die Darlington-Treiber-ICs ULN2003 biete die einfachste Weise VFD-Anzeigen ansteuern zu können. Normalerweise steuert man die DIGITs und Segmente aktiv positiv an und verwendet spezielle VFD-Treiber-ICs dafür. Die sind aber selten zu bekommen oder Maskenprogrammierte ROM-Controller und nicht leicht anzusteuern.

Die vielen PINs wollen natürlich betrieben werden und da wir nicht viele PORTs übrig haben, trickst man mit 4-zu-16-Decoder und Schieberegister. So ist es möglich mit 8 Bits 16 Stellen zu je 9 Segmenten leuchten zu lassen. Das Programm am ATMEGA8 ist dann nur noch die Kirsche am Törtchen.

Wegen der Komplexität und Größe des Programms, wurde es im AVR-Assembler geschrieben. Der Vorteil liegt einfach darin, dass es übersichtlicher und leichter zu verstehen ist. Umso schöner ist es, wenn es assembliert ist und diese File für den VFD-Controller ist
MAKERCLOCK_MEGA8.HEX

Die Datei wird einfach mit einem Programmiergerät wie dem AVR ATMEL STK500 auf den ATMEGA8 geflasht. Der ATMEGA8 muss aber auch noch so programmiert werden, dass der mit einem externen Quarz von 4MHz lauffähig ist. Das Ergebnis sollte STAND-Alone so aussehen:

Nun soll eine Infrarot-steuerbare Kontrolleinheit angeschlossen werden. Diese kann von zweiverschiedenen Fernbedienungen gesteuert werden. Zunächst das Schaltbild:



Für diese Schaltung gibt es zwei verschiedene Programme. Einmal nur IR-Steuerung und mit zusätzlicher Tastensteuerung. Einzig und allein, die Tag-, Uhr- und Frequenzsteuerung ist bei beiden gleich:
IR_KLEIN_MEGA8.HEX   ohne Tasten
IR_KLEIN_MEGA8_TAST.HEX  mitTasten

Beide Programme sind in C erstellt worden und sind diesem ARDUINO-Sketch ähnlich:

// ATMEGA8 mit internen 8MHz-RC-Oszillator
 // PB0=PA-M104B1, PB1=PB-M104B1, PB2=PC-M104B1, PB3=PD-M104B1, PB4=HIFI-TO, PB5=STBY-M104B1
 // PROGRAMM RUNTER           PC0 vom ATMEGA8
 // PROGRAMM RUNTER           PC1 vom ATMEGA8
 // LAUTSTÄRKE VERRINGERN     PD6 vom ATMEGA8
 // LAUTSTÄRKE ERHÖHEN        PD5 vom ATMEGA8
 // IN BEREITSCHAFT SCHALTEN  PD4 vom ATMEGA8
 // HIFI-Funktion             PD3 vom ATMEGA8
 // IR-Diode an               PD7 vom ATMEGA8
 
#define DECODE_NEC
 #define DECODE_SONY
 #define DISABLE_CODE_FOR_RECEIVE_PROTOCOLS 1
 #include <IRremote.hpp>
 #define IR_RECEIVE_PIN 7  // IR-Diode an PD7 vom ATMEGA8

// --- Zusätzliche Tastenpins ---
#define BTN_PROG_MINUS A0  // PROGRAMM RUNTER           PC0 vom ATMEGA8
#define BTN_PROG_PLUS  A1  // PROGRAMM RUNTER           PC1 vom ATMEGA8
#define BTN_VOL_MINUS  6   // LAUTSTÄRKE VERRINGERN     PD6 vom ATMEGA8
#define BTN_VOL_PLUS   5   // LAUTSTÄRKE ERHÖHEN        PD5 vom ATMEGA8
#define BTN_STBY       4   // IN BEREITSCHAFT SCHALTEN  PD4 vom ATMEGA8
#define BTN_HIFI       3   // HIFI-Funktion             PD3 vom ATMEGA8
 
byte portB_state = 0xFF;
unsigned long lastValidCode = 0;
unsigned long lastActionTime = 0;
bool waitingForValidIR = false;
 
void setup() {
  IrReceiver.begin(IR_RECEIVE_PIN);
  DDRB = 0xFF;
 
  // Eingänge mit Pullups
  pinMode(BTN_PROG_MINUS, INPUT_PULLUP);
  pinMode(BTN_PROG_PLUS,  INPUT_PULLUP);
  pinMode(BTN_VOL_MINUS,  INPUT_PULLUP);
  pinMode(BTN_VOL_PLUS,   INPUT_PULLUP);
  pinMode(BTN_STBY,       INPUT_PULLUP);
  pinMode(BTN_HIFI,       INPUT_PULLUP);
 
  // --- Einschaltimpuls ---
  PORTB = 0xDF;
  delay(35);
  PORTB = 0xFF;
  portB_state = 0xFF;
}
 
void loop() {
  unsigned long now = millis();
  // === Hardware-Tasten prüfen ===
  if (digitalRead(BTN_PROG_MINUS) == LOW) {
    PORTB = 0xFD;  // PROG-
    portB_state = 0xFD;
    lastActionTime = now;
  }
  else if (digitalRead(BTN_PROG_PLUS) == LOW) {
    PORTB = 0xFE;  // PROG+
    portB_state = 0xFE;
    lastActionTime = now;
  }
  else if (digitalRead(BTN_VOL_MINUS) == LOW) {
    PORTB = 0xFC;  // VOL-
    portB_state = 0xFC;
    lastActionTime = now;
  }
  else if (digitalRead(BTN_VOL_PLUS) == LOW) {
    PORTB = 0xFA;  // VOL+
    portB_state = 0xFA;
    lastActionTime = now;
  }
  else if (digitalRead(BTN_STBY) == LOW) {
    PORTB = 0xF0;  // STBY
    portB_state = 0xF0;
    lastActionTime = now;
  }
 
  else if (digitalRead(BTN_HIFI) == LOW) {
    PORTB = 0xEF;  // HIFI aktiv
    portB_state = 0xEF;
    lastActionTime = now;
  }
 
  // === IR-CODE prüfen ===
  if (IrReceiver.decode()) {
    unsigned long code = IrReceiver.decodedIRData.decodedRawData;
    // Fehlerhafte Codes abfangen
    if (code == 0x1821 || code == 0x1020) {
      waitingForValidIR = true;
      IrReceiver.resume();
      return;
    }
    if (waitingForValidIR) {
      if (code != 0x0 && code != 0x1821 && code != 0x1020)
        waitingForValidIR = false;
       else {
        IrReceiver.resume();
        return;
      }
    }
 
    if (code == 0x0 && lastValidCode != 0)
    code = lastValidCode;
    byte newPortB = portB_state;
    // --- IR-Befehle --- // PB0=PA-M104B1, PB1=PB-M104B1, PB2=PC-M104B1, PB3=PD-M104B1, PB4=HIFI-TO, PB5=STBY-M104B1
    switch (code) {
      case 0xEA15FF00: case 0x90: newPortB = 0xFE; break; // CH+, P+
      case 0xE718FF00: case 0x91: newPortB = 0xFD; break; // CH-, P-
      case 0xBE41FF00: case 0x92: newPortB = 0xFA; break; // VOL+
      case 0xBD42FF00: case 0x93: newPortB = 0xFC; break; // VOL-
      case 0xF50AFF00: case 0x95: newPortB = 0xF0; break; // STBY
      case 0xBB44FF00: case 0x97: newPortB = 0xEF; break; // HIFI AKTIV
      case 0xAC53FF00: case 0xE5: newPortB = 0xF8; break; // NORMALZUSTAND
    }
    if (newPortB != portB_state) {
      PORTB = newPortB;
      portB_state = newPortB;
    }
    if (code != 0x0) lastValidCode = code;
    lastActionTime = now;
    IrReceiver.resume();
  }
 
  // --- Automatisches Reset ---
  if (now - lastActionTime > 500 && portB_state != 0xFF) {
    if (portB_state != 0xF0) {
      PORTB = 0xFF;
      portB_state = 0xFF;
     }
  }
  delay(50);
}

Mit Hilfe dieses SKETCHES ist es möglich, die Schaltung anderen Fernbedienungen anzupassen.

PROG-/+ lassenden Programmplatz wechseln.
VOL-/+ ändern die Lautstärke.
STBY schaltet das Gerät in Bereitschaft.
AUDIO lässt die Schaltung auf einen externen AUDIO-Eingang HIFI umschalten.
Zusätzliche Tasten können zum Regeln der DAC-Ausgänge 1 -3 verwendet werden.
Mit Tasten am Bedienfeld gilt das Gleiche.
DAY ändert den Tag
HOUR ändert die Stunden
MIN ändert die Minuten
FREQ-/+ ändert die Frequenz
MEM speichert die Frequenz am aktuellen Programmplatz

Das IC M104B1 stellt folgendes Aufgabengebiet vor:
4 unabhängige DAC-Ausgänge, davon DAC0 = VOL (LAUTSTÄRKE).
32 Programmplätze (16 werden genutzt ).
Binäre Bedienung über ATMEGA8.
455kHz-Oszillator für die DACs.
Bereitschaftsschaltung mit Anwurfautomatik.

Die HIFI-Umschaltung erfolgt mit einer bistabilen Kippstufe mit Power-ON-RESET und besteht nur aus zwei Transistoren.   



Download: Software und Schaltpläne  VFD.zip

https://youtube.com/@electronicfox



Elektronik-Labor  Bastelecke  Projekte  Notizen