Seltsames RDS Problem mit SI4703

Folgendes:
Wenn ich das Radio mit einer Frequenz starte, bei der ich weiß, dass das Signal stabil genug ist, bekomme ich einen Namen des Senders und der Text wird abgerufen (Name der Songs usw.).
Stelle ich dann die Frequenz um und wieder zurück, bekomme ich nicht mehr den Namen, aber Text.

Starte ich das Radio auf einer "unsauberen" Frequenz bekomme ich natürlich erst einmal nichts.
Stelle ich dann jedoch wieder auf den stabilen Sender, empfange ich Namen und Text.
Wenn ich dann wieder hin und zurück verstelle, empfange ich wieder keinen Namen, aber Text.

Bin mir recht sicher, dass das mal funktioniert hat, aber kann mich auch täuschen.
Um Codefehler auszuschließen, habe ich nochmal den Beispielcode geladen und dort ist es das gleiche Problem.

Im Endeffekt ist scheinbar so, dass die Funktion DisplayServiceName nur einmal nach Start aufgerufen wird und danach nicht mehr.
Finde den Fehler nicht...

Danke für eure Hilfe!

Autor des Radio Codes ist Matthias Hertel, http://www.mathertel.de bzw auch unter "Radio" in den Libs zu finden.

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <LiquidCrystal_PCF8574.h>
#include <Arduino.h>
#include <radio.h>
#include <si4703.h>
#include <RDSParser.h>
#include <RotaryEncoder.h>

#define FIX_BAND     RADIO_BAND_FM   ///< The band that will be tuned by this sketch is FM.
#define FIX_STATION  9990            ///< The station that will be tuned by this sketch is 89.30 MHz.
#define FIX_VOLUME   14               ///< The volume that will be set by this sketch is level 14.

SI4703 radio;
RDSParser rds;
LiquidCrystal_PCF8574 lcd(0x3F); 
RotaryEncoder encoder(A2, A3);

int encoderLastPos;
unsigned long encoderLastTime;

String get_wochentag(uint8_t dow){ 
  String dows="  ";
  switch(dow){
   case 1: dows="Sonntag"; break;
   case 2: dows="Montag"; break;
   case 3: dows="Dienstag"; break;
   case 4: dows="Mittwoch"; break;
   case 5: dows="Donnerstag"; break;
   case 6: dows="Freitag"; break;
   case 7: dows="Samstag"; break;
  }
  return dows;
}

void print2digits(int number) {
  if (number >= 0 && number < 10) {
     lcd.print('0');
  }
   lcd.print(number);
}

void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4) {
  rds.processData(block1, block2, block3, block4);
}

void DisplayTime(uint8_t hour, uint8_t minute) {
  lcd.setCursor(0, 3); 
  if (hour < 10) lcd.print('0');
  lcd.print(hour);
  lcd.print(':');
  if (minute < 10) lcd.print('0');
  lcd.println(minute);
  lcd.setCursor(5, 3);
  lcd.print("  ");
  Serial.println("Minute: ") + Serial.println(minute);
} // DisplayTime()

void DisplayText(char *name) {
  Serial.println("MESSAGE: ") + Serial.println(name);
}

void DisplayFrequency(RADIO_FREQ f)
{
  char s[12];
  radio.formatFrequency(s, sizeof(s));
  lcd.setCursor(0, 2); 
  lcd.print(s);
}

void DisplayServiceName(char *name) {
  lcd.setCursor(7, 2);
  lcd.print(name);
  Serial.println("RDS: ") +  Serial.println(name);       
}

void setup() {
  
  lcd.begin(20, 4);
  lcd.print("Radio....");
  delay(999);
  lcd.clear();
  lcd.setBacklight(1);
  radio.debugEnable();
  radio.init();
  radio.setBandFrequency(FIX_BAND, FIX_STATION);
  radio.setVolume(FIX_VOLUME);
  radio.setMono(false);
  radio.setMute(false);
  radio.attachReceiveRDS(RDS_process);
  rds.attachTextCallback(DisplayText);
  rds.attachTimeCallback(DisplayTime);
  rds.attachServicenNameCallback(DisplayServiceName);
  encoderLastPos = (radio.getFrequency() - radio.getMinFrequency()) / radio.getFrequencyStep();
  encoder.setPosition(encoderLastPos);
  PCICR |= (1 << PCIE1);    // This enables Pin Change Interrupt 1 that covers the Analog input pins or Port C.
  PCMSK1 |= (1 << PCINT10) | (1 << PCINT11);  // This enables the interrupt for pin 2 and 3 of Port C.
  Serial.begin(57600);
  Serial.println("Los geht es.");
  
}

ISR(PCINT1_vect) {
  encoder.tick(); // just call tick() to check the state.
}

void loop() {

  radio.checkRDS();
  tmElements_t tm;
  int newPos;
  static unsigned long nextFreqTime = 0;
  newPos = encoder.getPosition();
  unsigned long now = millis();
  static RADIO_FREQ lastf = 0;
  RADIO_FREQ f = 0;
  char incoming;
  
  if (Serial.available() > 0) {
    incoming=Serial.read();
    if (incoming=='s') { 
      Serial.println("SEEK...");
      radio.seekUp(true);
    }
  }
  
  if (newPos != encoderLastPos) {
    RADIO_FREQ f = radio.getMinFrequency() + (newPos *  radio.getFrequencyStep());
    radio.setFrequency(f);
    encoderLastPos = newPos;
    nextFreqTime = now + 10;        
  }
  
  if (now > nextFreqTime) {
    f = radio.getFrequency();
    if (f != lastf) {
      // don't display a Service Name while frequency is no stable.
      Serial.println("RDS deaktiviert"); 
      lcd.clear();
      //DisplayServiceName("    ");
      DisplayFrequency(f);
      lastf = f;
    } // ifnextFreqTime = now + 400;
     
  } // if  

  if (RTC.read(tm)) {      
      lcd.setCursor(0, 0);
      print2digits(tm.Hour);
      lcd.print(":");
      print2digits(tm.Minute);
      lcd.setCursor(0,1);
      lcd.print(get_wochentag(dayOfWeek(tm.Day)));
      lcd.print(", ");
      lcd.print(tm.Day);
      lcd.print('.');
      lcd.print(tm.Month);
      lcd.print('.');
  }
  
}

Kleines Update:
Habe mittlerweile herausgefunden, dass wenn ich zwischen zwei stabilen Sendern hin und her wechsel, wird der RDS Name aktualisiert.
Aber scheinbar nicht, wenn man zwischen "funktioniert" und "funktioniert nicht" wechselt.
Es muss also ein anderes RDS Signal (für den Namen) empfangen werden, dass die Funktion aufgerufen wird.
In der Praxis kommt das wahrscheinlich nicht oft vor, aber trotzdem verstehe ich das Verhalten nicht.

Setze doch mal das RDS-Mode-Flag auf High und lies die Zustände aus.
Das Datenblatt gibt es hier.

Gruß Tommy