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
Hi Florian, hab schon mal was in der Richtung gemacht: http://www.hebel23.de/projekte/radio/radio.htm Gruß Andreas
Heeey.. hätte nicht damit gerechnet! VIELEN DANK! Sieht ja sehr viel versprechend aus und spart mir sicher viel Arbeit :-) Gruß, Florian
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
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...
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
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
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
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
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
Nochmal Hallo #2, ich hab jetzt meine alte Calculate_Syndrome-Funktion anstatt deiner Assemblerroutine eingefügt... sollte eigentlich ja das gleiche passieren.... ;-) Gruß Florian
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
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
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
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.
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
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
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
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
Hi, super vielen vielen Dank, sehr lobenswert dokumentiert. Ich werds morgen genauer unter die Lupe nehmen, vielleicht kommt noch die eine oder andere Frage.
@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?
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
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 | }
|
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
Einige SI4735 RDS TWI I2C Beispiele in Assembler ATmega8 Beitrag "Si4735 RDS Radio UKW LW MW KW AM FM - TA TP AF GT TMC CT RT Pi PS ATmega8 Assembler"
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.