FAKEDOMAIN.DE

Ich habe mal wieder ein altes Projekt ausgegraben und endlich mal weitergemacht. Es handelt sich um die Sony Ericsson MMR-70 FM-Transmitter die es sehr günstig in der Bucht gibt. Auf dem Modul ist ein FM-Sender mit analogem Stereoeingang und dazu ein Mega32 zur Ansteuerung via I2C. Nachdem ich mich mal mit Fummeldraht das Modul an den ISP und an die serielle Schnittstelle angeschlossen habe, habe ich mal im Internet rumgesucht was es so gibt. Aber ausser einem groben BASCOM-Code und diversen C-Libs mit Fehlern gabs nix. Also habe ich mich mal hingesetzt und ne Lib geschrieben. Damit lassen sich die diversen Funktionen des FM-Transmitter einstellen und steuern.
Daszu gehören die Einstellung der Frequenz, Sendeleistungs, Lautstärke, Mute, RDS und andere. Mit RDS kann man, ein entsprechndes Radio vorausgesetzt, den Namen mit 8 Stellen und Radiotext mit 64 Zeichen übertragen. Gedacht war es mal um einen Musik-/Infoplayer mit Infotext zu basteln. Und so brauch ich meine alten Radios nicht zu entsorgen wenn ich Musik aus dem Netz hören will. So wie das Projekt FM-Berry das macht. Nur bei mir am Linuxrechner mit serieller Schnittstelle.

Soweit klappt auch alles wunderbar, nur einen kleinen Schönheitsfehler gibt es. Beim Anlegen der Versorgungspannung startet die RDS Übertragung nicht. Der FM-Chip löst keine Interrupts aus. Mach ich dann allerdings einen Reset auf dem Mega und er initialisert neu, dann legt er los. Die Interruptaufrufe werden übrigens durch Flackern der LED auf dem Modul angezeigt. Ich habe diesen Fehler noch nicht gefunden, scheint irgendwie mit der Initialisierung zu tun zu haben. Aber der Rest klappt soweit. Also wenn jemand solche Module hat, hier ist die Library dazu. Ach ja, die serielle Schnittstelle ist auf dem Modul etwas seltsam verschaltet. Ich habe die Zusatzbauteile ausgelötet, mit mit einem RS232-USB-TTL-Wandler dann direkt an TXD und RXD des Prozessors gehangen. ISP sind über Testpins zugänglich.
Folgende Kommandos sind implementiert:
'# Frequenz berechnen und in Register abspeichern
Sub Calc_frequenz()

'# Initialisieren
Sub Ns741_init()

'# Chip ON/OFF
Sub Ns741_on(byval Onoff As Byte)

'# Sendeleistung 0-3 = 0,5mW, 0,8mW, 1mW, 2mW
Sub Ns741_hfpower(byval Level As Byte)

'# Frequenz einstellen
Sub Ns741_set_frequenz(byval Frequenz As Word)

'# Audio gain 0-6 = -9dB - +9db in 3dB Schritten
Sub Ns741_volume(byval Gain As Byte)

'# ALC
Sub Ns741_alc(byval Onoff As Byte)

'# Input gain -9dB on/off
Sub Ns741_input_gain(byval Onoff As Byte)

'# Stereo on/off
Sub Ns741_stereo(byval Onoff As Byte)

'# Mute on/off
Sub Ns741_mute(byval Onoff As Byte)

'# RDS on/off
Sub Ns741_rds_enable(byval Onoff As Byte)

'# RDS-Name setzen
Sub Ns741_rds_set_progname(byval Rds_name As String)

'# Radiotext formatieren
Sub Ns741_rds_set_radiotext(byval Rds_text As String)

'# Routine zum Schreiben aller Register in NS741
Sub Ns741_write_a(byval Adresse As Byte , Byval Anzahl As Byte)

'# Routine zum Schreiben von zwei Bytes an Adresse in NS741, für RDS_int
Sub Ns741_write2(byval Adresse As Byte , Byref Wert1 As Byte , Byref Wert2 As Byte)

'# Routine zum Schreiben eines Bytes an Adresse in NS741
'# Schreiben darf nicht durch Interrupt unterbrochen werden, daher
'# werden die für den Zeitraum deaktiviert
Sub Ns741_write(byval Adresse As Byte , Byval Wert As Byte)

'# Speichern der Register im EEPROM
Sub Save_regs

'# Lesen der Register aus EEPROM
Sub Read_regs

'### Interrupt-Routine zur Übertragung der RDS-Daten
Sub Rds_int
Und wenn ich den Fehler gefunden hab, gibts Nachschlag.

MMR70 FM-Sender

(C) Joachim Fossie Bär Reiter 2009