ich programmiere seit einiger Zeit schon etwas mit dem Arduino und bin gerade dabei ein Radio mit dem Si4703 FM Tuner von Sparkfun und einem TFT-Screen von Adafruit zu programmieren. Das klappt soweit schon ganz gut, da ich auch die Library und den Beispiel-Code von Sparkfun zur Hilfe genommen habe (Link).
Das Problem ist nur, dass der Beispiel-Code zum auslesen der RDS Daten nicht so gut funktioniert und unpraktisch ist.
Dort ist nämlich ein Timeout eingebaut, sodass in der Zeit alles blockiert ist. Und es wird bei mir nur ein Sender erkannt, der Rest nicht.
Hat jemand einen Code oder eine Idee, wie man die RDS Daten Blockweise auslesen kann, ohne alles zu blockieren?
Auf einer anderen Seite hatte ich eine Möglichkeit gefunden, die war aber für ein Raspberry Pi geschrieben (Link).
void Si4703_Breakout::readRDS(char* buffer) { readRegisters(); byte blockerrors = (si4703_registers[STATUSRSSI] & 0x0600) >> 9; if (blockerrors!=0) return; if(si4703_registers[STATUSRSSI] & (1<<RDSR)){ byte Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl; Ah = (si4703_registers[RDSA] & 0xFF00) >> 8; Al = (si4703_registers[RDSA] & 0x00FF); Bh = (si4703_registers[RDSB] & 0xFF00) >> 8; Bl = (si4703_registers[RDSB] & 0x00FF); Ch = (si4703_registers[RDSC] & 0xFF00) >> 8; Cl = (si4703_registers[RDSC] & 0x00FF); Dh = (si4703_registers[RDSD] & 0xFF00) >> 8; Dl = (si4703_registers[RDSD] & 0x00FF); //Gruppe 0 if ( (Bh&0xF0)==0 && (Bl&0x10)==0) { unsigned int number = (Bl&0x03); if (number==0) { buffer[0]=Dh; buffer[1]=Dl; } if (number==1) { buffer[2]=Dh; buffer[3]=Dl; } if (number==2) { buffer[4]=Dh; buffer[5]=Dl; } if (number==3) { buffer[6]=Dh; buffer[7]=Dl; } } delay(40); //Wait for the RDS bit to clear } else { delay(30); //From AN230, using the polling method 40ms should be sufficient amount of time between checks } buffer[8] = '\0'; }
Könnte man den Code auch für den Arduino verwenden, wenn man den etwas umschreibt?
Ich habe auch ein Radioprojekt vor (RDA5807M-Basis) und mit der Library mein Modul angetestet. Das Keypad-Beispiel lief nach Eintrag des Empfängermoduls bei mir inkl. nicht blockierendem RDS-Empfang sofort. Weiter als das Beispiel habe ich mich allerdings mit meinem Radioprojekt noch nicht beschäftigt.
BluePixel:
... Könnte man den Code auch für den Arduino verwenden, wenn man den etwas umschreibt?
Wenn die delay()s das Problem sind und Du Code schreiben willst, der ohne delay()s auskommt, hilft evtl., was ich vor ein paar Wochen dazu ins Netz gekippt habe. Klick bei Interesse hier.
„Problematisch“ könnte sein, dass es verschiedene Strategien gibt/geben kann, wie man delay() vermeidet.
Habe die Library mit dem Beispielcode mal ausprobiert. Klappt auch, nur spuckt der bei RDS oft irgendwelche Sonderzeichen oder Zahlen mit in den Namen.
gregorss:
Wenn die delay()s das Problem sind und Du Code schreiben willst, der ohne delay()s auskommt, hilft evtl., was ich vor ein paar Wochen dazu ins Netz gekippt habe. Klick bei Interesse hier.
Werde es mir mal angucken
Wie siehts mit diesem zweiten Code aus, den ich gepostet hatte? Geht der auch beim Arduino? Kenne mich leider nicht so gut mit den Registern aus.
BluePixel: void Si4703_Breakout::readRDS(char* buffer) { readRegisters(); byte blockerrors = (si4703_registers[STATUSRSSI] & 0x0600) >> 9; if (blockerrors!=0) return; if(si4703_registers[STATUSRSSI] & (1<<RDSR)){ byte Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl; Ah = (si4703_registers[RDSA] & 0xFF00) >> 8; Al = (si4703_registers[RDSA] & 0x00FF); Bh = (si4703_registers[RDSB] & 0xFF00) >> 8; Bl = (si4703_registers[RDSB] & 0x00FF); Ch = (si4703_registers[RDSC] & 0xFF00) >> 8; Cl = (si4703_registers[RDSC] & 0x00FF); Dh = (si4703_registers[RDSD] & 0xFF00) >> 8; Dl = (si4703_registers[RDSD] & 0x00FF); //Gruppe 0 if ( (Bh&0xF0)==0 && (Bl&0x10)==0) { unsigned int number = (Bl&0x03); if (number==0) { buffer[0]=Dh; buffer[1]=Dl; } if (number==1) { buffer[2]=Dh; buffer[3]=Dl; } if (number==2) { buffer[4]=Dh; buffer[5]=Dl; } if (number==3) { buffer[6]=Dh; buffer[7]=Dl; } } delay(40); //Wait for the RDS bit to clear } else { delay(30); //From AN230, using the polling method 40ms should be sufficient amount of time between checks } buffer[8] = '\0'; }