Forum: Mikrocontroller und Digitale Elektronik RDS-Empfang


von Florian Maier (Gast)


Lesenswert?

Tach zusammen,

hat hier jemand schon was in Richtung Decodierung des RDS-Signals auf
Radiosendungen versucht? Ich verwende im Moment ein fertiges Radio von
Visteon (Ford-Original-Radio), greife darin die RDS Data, Clock und
Quality-Signale ab und bin mittlerweile so weit, dass ich den Binären
Datenstrom im Atmel/auf der Seriellen Schnittstelle sehe.. die vielen
Einsen und Nullen sehen zwar ganz nett aus (erinnert stark an schlechte
science-fiction-filme ;-) aber ich will das ja auch decodieren...
Ich werde aus diesen Specs nicht schlau :-( hat jemand schon fertigen
code für die Synchronisation und Decodierung der Gruppen und Blöcke?

Vielen Dank schon mal,
Gruß, Florian

von hebel23 (Gast)


Lesenswert?

Hi Florian,

hab schon mal was in der Richtung gemacht:
http://www.hebel23.de/projekte/radio/radio.htm

Gruß Andreas

von Florian Maier (Gast)


Lesenswert?

Heeey.. hätte nicht damit gerechnet!
VIELEN DANK! Sieht ja sehr viel versprechend aus und spart mir sicher
viel Arbeit :-)

Gruß, Florian

von Florian Maier (Gast)


Lesenswert?

Hallo Andreas,

ich hab mir jetzt mal dein Programm angeschaut. Erst mal grosses Lob
für die übersichtliche Programmierung! Ich hatte da erst vor kurzem ein
negativ-Beispiel zum gleichen Thema ;-)

Mir ist aber noch was aufgefallen, oder vielleicht hab ichs auch nicht
gefunden: Machst du in deiner TDA7330.c auch eine Fehlerkorrektur oder
nur eine Erkennung? Und für den ersten Fall: wie gut funktioniert das
ohne? Da gehen dann doch bis zum nächsten BLOCKA alle Daten verloren,
oder?

Gruß, Florian

von Uwe Nagel (Gast)


Lesenswert?

Dieses Programm habe ich mir auch mal angesehen.
Es gibt nur eine Fehlererkennung, keine Korrektur!
Das alle Daten bis zum nächsten BLOCKA verlorengehen macht nichts, den
man kann eigentlich nur mit einer ganzen Gruppe, also mit allen 4
Blöcken etwas anfangen.
Schade eigentlich, das Programm ist sonst wirklich ganz nett.
Mein eigenes Werk zu diesem Thema ist etwas unübersichtlicher,
aber es hat auch eine Fehlerkorrektur.
Muss ich nachher mal raussuchen und hochladen.
Bis dann...

von hebel23 (Gast)


Lesenswert?

Hi Florian,
eine mögliche Fehlerkorrektur habe ich vorerst außer Acht gelassen, da
dies meiner Meinung nach diese extrem redundante Übertragunsart des RDS
nicht erfordert. Die Daten, die übertragen werden, ändern sich ja nicht
wirklich schnell und werden ständig wiederholt. Wenn wirklich mal die
Synchronisation durch einen Übertragungsfehler verloren wird, wartet
man halt bis zum nächsten BlockA ab und ist dann wieder synchronisiert.
Bei schlechten Empfangsverhältnissen allerdings funktioniert das nicht
so toll.
Wenn Du Lust hast kannst Du den Code ja mit einer Fehlerkorrektur
erweitern. Wie Dir sicher aufgefallen ist, hab ich auch bei weitem noch
nicht alle möglichen Info´s aus dem Datenstrom gezogen. Wäre schön, wenn
 jemand da ein paar Erweiterungen machen würde, da ich leider auch immer
seltener Zeit finde...
( nichts zuletzt desshalb hab ich´s auch veröffentlicht ;o) )

Gruß Andreas

von Florian Maier (Gast)


Lesenswert?

Hallo Andreas,

stimmt schon, es wird ja alles ständig wiederholt... nur möchte ich
selbst die 62.5% redundanz des Datenstroms an sich nicht "verkommen"
lassen ;-) Ausserdem werde ich wohl schauen, dass die Clock direkt an
einen der beiden externen Interrupts angeschlossen ist, die bei dir
ja durch die Taster belegt sind.
Da mein Projekt aus mehreren Microcontrollern und anderen Devices
besteht, die via I2C-Bus aneinander geschaltet sind werde ich die
decodierten Daten auch nicht direkt auf ein Display geben, sondern sie
via I2C abrufbar machen...

Auf jeden Fall Danke ich dir für deine prompte Antwort und für die
Veröffentlichung der Quellcodes.
Wenn ich mal keine Lust mehr habe zu programmieren werde ich mal meine
gesammelten Werke auf meine Homepage stellen (http://db1lol.de).
Vielleicht ist was interessantes dabei.

Gruß Florian

von Uwe Nagel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

im Anhang meinen RDS-Dekoder, getestet am mega8. Ist
Interrupt-gesteuert. RDS-CLK auf INT1, RDS-DATA an PD2.
Die Daten werden auf einem 4x16-LCD dargestellt, dazu benutze ich die
Bibliothek von Peter Fleury.
Zu bedienen gibt es nix.
Ist nicht so schön aufgebaut, wie das Programm von Andreas, dafür
wesentlich kompakter, besser optimiert und leichter zu durchschauen
bzw. zu erweitern/anzupassen.

Gruß Uwe

von Florian Maier (Gast)


Lesenswert?

Hey Uwe,

vielen Dank für das File. Sieht gut aus... am besten ich werfe meinen
code weg. ich glaube der dauert beim ausführen 10 mal so lang und tut
noch nicht mal ;-)

Gru0 Florian

von Florian Maier (Gast)


Lesenswert?

Nochmal Hallo,

ich Probleme dein File zu compilieren. Ich benutze hier den AVR-GCC und
die AVR-Utils unter Gentoo Linux und er kompiliert einfach nicht das
Assembler-file und findet dann natürlich das object dazu nicht. Was
benutzt du um das zu compilieren? irgendein script/batchdatei?

Gruß Florian

von Florian Maier (Gast)


Lesenswert?

Nochmal Hallo #2,

ich hab jetzt meine alte Calculate_Syndrome-Funktion anstatt deiner
Assemblerroutine eingefügt... sollte eigentlich ja das gleiche
passieren.... ;-)

Gruß Florian

von Uwe Nagel (Gast)


Lesenswert?

Hallo Florian,

ich benutze WinAVR...
Die Calculate_Syndrom macht das gleiche wie mein Assembler-Programm,
braucht aber mehr Platz und Zeit. Naja, das ist bei den mega's kein
wirkliches Problem.
Woher hast Du diese Routine ?

Gruß Uwe

von Florian Maier (Gast)


Lesenswert?

Hallo Uwe,

das WinAVR sollte eigentlich nur eine für windows umkompilierte
variante der GNU Utilities sein.. keine ahnung warum das nicht tut.

Ich hab selbst eine Calculate_Syndrom geschrieben, aber um sicher zu
gehen, dass das auch so richtig ist verwende ich jetzt die aus Andreas
Programm. Nicht dass sich da irgendwo noch ein fehler eingeschlichen
hat und ich dann die Wände hoch gehe beim Fehlerfinden ;-)

Gruß Florian

von kapuchy (Gast)


Lesenswert?

hello

who knows Uwe Nagel mail or value (MHz)  of quartz in his project 
descrypted below ?


graetz

Autor: Uwe Nagel (Gast)
Datum: 08.10.2004 22:21
Dateianhang: megaRDS.zip (13,1 KB, 22 Downloads)

------------------------------------------------------------------------ 
--------
Hallo

im Anhang meinen RDS-Dekoder, getestet am mega8. Ist
Interrupt-gesteuert. RDS-CLK auf INT1, RDS-DATA an PD2.
Die Daten werden auf einem 4x16-LCD dargestellt, dazu benutze ich die
Bibliothek von Peter Fleury.
Zu bedienen gibt es nix.
Ist nicht so schön aufgebaut, wie das Programm von Andreas, dafür
wesentlich kompakter, besser optimiert und leichter zu durchschauen
bzw. zu erweitern/anzupassen.

Gruß Uwe

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Take a look at rds.c:
#define XTAL_CPU 4332000

So it should be a 4.332 MHz crystal.

von asdf-fan (Gast)


Lesenswert?

Hallo,

gibt es das Projekt von hebel23.de noch irgendwo zu finden oder hat es 
noch jemand gespeichert?
Der oben angegebene Link ist leider tot.

von Andreas H. (hebel23)


Lesenswert?

Hallo asdf-fan,

ich habe die Seite vor einiger Zeit vom Netz genommen, da ich keine Zeit 
mehr hatte, sie zu pflegen.

Die Projektdaten habe ich aber noch hier rumliegen. Was genau suchst Du 
denn?

Viele Grüße
Andreas

von asdf-fan (Gast)


Lesenswert?

Ich habe mir das RDS100 Radio-Modul von ELV zugelegt, bei dem die 
RDS-Rohdaten über eine serielle Schnittstelle ausgegeben werden.

Deshalb wäre es natürlich interessant mal über deinen Quelltext zu 
schauen, um ein wenig mehr über die Dekodierung der Rohdaten zu 
erfahren.

Ich werde die Auswertung dann über LabView machen.

Vielen Dank schon mal

Grüße
asdf-fan

von Andreas H. (hebel23)


Lesenswert?

Hi asdf-fan,

ich habe das Zeug hier nochmal hochgeladen:

http://www.mikrocube.de/RDS_Radio/index.htm

bzw.

http://www.mikrocube.de/USB_RDS_Dekoder/index.htm

Ich hab seit Ewigkeiten nichts mehr daran gemacht - also alles ohne 
Gewähr. Falls Du noch Fragen hast, melde Dich!

Viel Spaß
Andreas

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Gibt es dieses USB-Radio noch irgendwo oder kennt jemand eine 
Alternative? Bei E-Bay gibts das gerade nicht...
mit freundlichen Grüßen,
Valentin Buck

von asdf-fan (Gast)


Lesenswert?

Hi,

super vielen vielen Dank, sehr lobenswert dokumentiert.
Ich werds morgen genauer unter die Lupe nehmen, vielleicht kommt noch 
die eine oder andere Frage.

von Tio (Gast)


Lesenswert?

@Andreas: Super Seite! Was mich dabei stutzig macht ist wie dort 
beschrieben der im Bitbang Modus betriebene FT245BM. Das RDS Signal 
kommt doch mit 1,1875 kHz Clock. Mit 2facher Abtastung laut Shannon muss 
man das RDS-Signal bzw. den FT245BM also mindestens alle 421 us 
abtasten, oder? Ich habe mal einen FT232R im Bitbang Modus betrieben, 
und ich bin bei bestem Willen nicht unter 17 ms gekommen. oder habe ich 
hier einen Denkfehler? Oder lag es daran, dass ich unter Windows eine 
Oberfläche mit VB erstellen wollte? Wie hast Du das hingekriegt?

von Andreas H. (hebel23)


Lesenswert?

Hallo Tio,

das Geheimnis liegt darin, dass das Ganze nicht (mehr) im Bit-Bang-Modus 
läuft. So hatte ich das wohl am Anfang versucht, bin aber ebenfalls am 
Timing gescheitert. Es gibt aber eine viel bessere Lösung, die im 
Schaltplan und in Real schon realisiert ist, aber im Text noch nicht 
beschrieben wurde.

Der FT245 hat ja neben den Datenleitungen auch ein paar 
Handshakeleitungen, so auch einen WR-Eingang. Wenn an dem Pin der Pegel 
von high nach low wechselt, werden die Signale an D0...D7 direkt in den 
TX-FIFO geschrieben.
Laut Datenblatt müssen zwischen den WR Flanken mindestens 100ns liegen. 
Man könnte also theoretisch Datenraten von bis zu 10MHz da reinpumpen 
(natürlich nur bis der FIFO voll ist).

An den WR Pin habe ich dann einfach den Clock-Ausgang des RDS-Dekoders 
gehängt. Damit werden die beiden Signale QUAL und RDDA immer genau zur 
richtigen Zeit in Richtung PC geschoben. Der RDS-Dekoder wird also quasi 
nicht abgetastet, sondern sendet die Daten von selbst mit der richtigen 
Abtastrate. Genial oder? ;o)

Gruß Andreas

von Tio (Gast)


Lesenswert?

Das ist ja DER HAMMER!!! Das merke ich mir. DANKE!! :-))

Btw, ich habe so den ein oder anderen C Coder für RDS Dekodierung 
gesucht und gefunden (nachdem meine ersten Versuche nicht ganz so 
klappten). Jetzt heißt es ja, dass das Syndrom eigentlich nach 
Multiplikation mit der inversen Generatormatrix Null ergeben soll, wenn 
kein Fehler vorliegt.

So, die meisten Codes in C oder Basic arbeiten mit einer Matrix die 
verschieden ist von der eigentlichen inversen Generatormatrix. Und in 
diesen Codes erhält man nach exklusiven Oder-Verknüfungen das Syndrom, 
das den Blocktypen verrät. Es ergibt also keine Null.

Ich blick da jetzt den Unterschied nicht, kannst Du mir dabei helfen? 
ist bei der XOR Verknüpfung schon eine Fehlerkorrektur erhalten, oder 
wie kann ich die machen?

Hier mal die Matrix hierzu:
1
  check[1] = 0b1100011011;  // 0x31B
2
  check[2] = 0b1110001111;  // 0x38F
3
  check[3] = 0b1010100111;  // 0x2A7
4
  check[4] = 0b0011110111;  // 0x0F7
5
  check[5] = 0b0111101110;  // 0x1EE
6
  check[6] = 0b1111011100;  // 0x3DC
7
  check[7] = 0b1000000001;  // 0x201
8
  check[8] = 0b0110111011;  // 0x1BB
9
  check[9] = 0b1101110110;  // 0x376
10
  check[10] = 0b1101010101;  // 0x355
11
  check[11] = 0b1100010011;  // 0x313
12
  check[12] = 0b1110011111;  // 0x39F
13
  check[13] = 0b1010000111;  // 0x287
14
  check[14] = 0b0010110111;  // 0x0B7
15
  check[15] = 0b0101101110;  // 0x16E
16
  check[16] = 0b1011011100;  // 0x2DC
17
  check[17] = 0b0000000001;  // 0x001
18
  check[18] = 0b0000000010;  // 0x002
19
  check[19] = 0b0000000100;  // 0x004
20
  check[20] = 0b0000001000;  // 0x008
21
  check[21] = 0b0000010000;  // 0x010
22
  check[22] = 0b0000100000;  // 0x020
23
  check[23] = 0b0001000000;  // 0x040
24
  check[24] = 0b0010000000;  // 0x080
25
  check[25] = 0b0100000000;  // 0x100
26
  check[26] = 0b1000000000;  // 0x200

Schnipsel zur Berechnung:
1
    for (i = 0; i < 26; i++)
2
    {  if ((RDS.empfang >> i) & 0b01)
3
      {  RDS.ergebnis ^= check[i + 1];
4
      }
5
    }

von Olli (Gast)


Lesenswert?

Hallo,
wie genau bekomme ich raus wo der MUX In vom TDA7330 am Radio 
angeschlossen werden muss?
Hat jemand dieses Projekt schon Erfolgreich fertiggestellt?
Gruss

von Bernhard S. (bernhard)


Lesenswert?


von Bernhard S. (bernhard)


Lesenswert?

@Florian

>Ich werde aus diesen Specs nicht schlau :-( hat jemand schon fertigen
>code für die Synchronisation und Decodierung der Gruppen und Blöcke?

Hier findest Du eine mögliche Lösung für die Synchronisation bzw. 
Prüfbitberechnung.

Beitrag "RDS CRC Prüfbit Berechnung"

Bernhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.