mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RDS-Empfang


Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Florian,

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

Gruß Andreas

Autor: Florian Maier (Gast)
Datum:

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

Gruß, Florian

Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: hebel23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe Nagel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Florian Maier (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kapuchy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Take a look at rds.c:
#define XTAL_CPU 4332000

So it should be a 4.332 MHz crystal.

Autor: asdf-fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas H. (hebel23)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: asdf-fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas H. (hebel23)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: asdf-fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tio (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas H. (hebel23)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tio (Gast)
Datum:

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


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

Autor: Olli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bernhard S. (bernhard)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.