RDS mit dem SI4735 und Mega88/Mega32

 

Für den  SI4735 gibt es schon Programmbeispiele für den  Mega32 und für das  Mega88 im CC2-Board. Die Verwendung von RDS wurde mit einem Delphi-Beispiel demonstriert. Was noch fehlte war die Auswertung der RDS-Daten mit einem Mikrocontroller. Jetzt habe ich die Delphi-Lösung in Bascom portiert. Es ging leichter als ich dachte. 

Hier die Lösung für den ATM18 von ComputerClub2 und Elektor. Achtung, zu der Schaltung im Elektor-Artikel gibt es zwei Korrekturen:  Pin 6 des Radiomoduls gehört an Masse, und  der 32-kHz Ausgang ist tatsächlich PD7,  PD6 ist die I2C-Datenleitung SDA.

(SI4735 am ATM18)

Download: Bascom-Beispiel mit RDS (SI4735ATM18RDS.zip, 8 KB)

' *********** RDS Erweiterung ATM18 *************
Sub Init_rds()
I2cstart
I2cwbyte 34
I2cwbyte &H12
I2cwbyte &H00
I2cwbyte &H15
I2cwbyte &H02
I2cwbyte &H00
I2cwbyte &H01
I2cstop
End Sub


Sub Fm_rds_status()
I2cstart
I2cwbyte 34
I2cwbyte &H24
I2cwbyte &H00
I2cstop
I2cstart
I2cwbyte 35
I2crbyte Status , Ack
I2crbyte R1 , Ack
I2crbyte R2 , Ack
I2crbyte R3 , Ack
I2crbyte R4 , Ack
I2crbyte R5 , Ack
I2crbyte R6 , Ack
I2crbyte R7 , Ack
I2crbyte R8 , Ack
I2crbyte R9 , Ack
I2crbyte R10 , Ack
I2crbyte R11 , Ack
I2crbyte R12 , Ack
I2crbyte R13 , Nack
I2cstop
End Sub


Sub Rds()
For Nr = 1 To 15
Get_int_status
If Status = 1 Then
Fm_rds_status
If R3 > 0 Then 'neue Daten?
Bled = R12 And 3
Service = R6 And 248
If Service = 0 Then '0A, Tuning Information
If Bled = 0 Then
Pos = R7 And 3
Pos = Pos * 2
Pos = Pos + 1
Tx = Chr(r10)
Tx = Tx + Chr(r11)
Lcdpos = Pos : Lcdline = 2 : Lcd_pos
Lcdtext = Tx : Lcd_text
End If
End If
If Service = 32 Then '2A, Radiotext
Pos = R7 And 15
Pos = Pos * 4
Pos = Pos + 1
Lcdtext = Chr(r8)
Lcdtext = Lcdtext + Chr(r9)
Lcdtext = Lcdtext + Chr(r10)
Lcdtext = Lcdtext + Chr(r11)
If Pos < 20 Then
Lcdpos = Pos : Lcdline = 3 : Lcd_pos
Lcd_text
Else
Pos = Pos - 20
Lcdpos = Pos : Lcdline = 4 : Lcd_pos
If Pos < 18 Then Lcd_text
End If
End If
If Service = 64 Then '4A, Time
Utcoffset = R11 And 31
Utcoffset = Utcoffset / 2
Lo = R11 / 64
Hi = R10 And 15
Hi = Hi * 4
Minuten = Hi + Lo
Lo = R10 / 16
Hi = R9 And 1
Hi = Hi * 16
Stunden = Hi + Lo
If R11.5 = 1 Then
Stunden = Stunden - Utcoffset
Else
Stunden = Stunden + Utcoffset
End If
Tx = Str(stunden)
If Stunden < 10 Then
Tx = "0" + Tx
End If
Lcdtext = Tx + ":"
Tx = Str(minuten)
If Minuten < 10 Then
Tx = "0" + Tx
End If
Lcdpos = 9 : Lcdline = 2 : Lcd_pos
Lcdtext = Lcdtext + Tx : Lcd_text
End If
End If
End If
Next Nr
End Sub


RDS-Beispiel für das ES-M32



Das LCD auf dem ES-M32 ist üblicherweise zweizeilig und wird anders angesteuert als beim ATM18. Im Beispiel wird die Stationskennung und die Uhrzeit ausgegeben. Es stehen vier Tastschalter zur Verfügung, deshalb wurde auch Kurzwelle mit bedient.  S1 bedient die UKW-Abstimmung, S2 die für Kurzwelle.

Download: Bascom-Beispiel für ES-M32 (SI4735_4_ESM32.zip, 7 KB)


Config Scl = Porta.1
Config Sda = Porta.2
I2cinit
Cursor Off

Am = 1
Am_start

Do
Waitms 1
T = T + 1
If T = 1000 Then T = 0
If T = 900 Then
If Am = 0 Then
Rds
Fm_rsq_status
Else
Am_tune_status
'Am_rsq_status
End If
End If
If S1 = 0 Then
If Am = 0 Then 'T1: FM
T2 = 0
Waitms 5 'Entprellung
Do
Waitms 1
T2 = T2 + 1
Loop Until S1 = 1
If T2 < 200 Then 'T1 kurz
Fm_seek_freq_up
Locate 2 , 1
Lcd " "
Else 'T1 lang
Fm_seek_freq_down
Locate 2 , 1
Lcd " "
End If
Waitms 500
Fm_tune_status
Else
Am = 0
T = 0
Power_down
Waitms 10
Fm_start
End If
End If

If S2 = 0 Then 'T2: AM
If Am = 1 Then
T2 = 0
Waitms 5 'Entprellung
Do
Waitms 1
T2 = T2 + 1
Loop Until S2 = 1
If T2 < 200 Then 'T2 kurz
Am_seek_freq_up
Else 'T2 lang
Am_seek_freq_down
End If
Waitms 500
Am_tune_status
Else
Am = 1
T = 0
Power_down
Waitms 10
Am_start

End If
End If

If S3 = 0 Then 'T3: leiser
Vol = Vol - 1
If Vol < 10 Then Vol = 10
Waitms 50
Rx_volume
End If

If S4 = 0 Then 'T4: lauter
Vol = Vol + 1
If Vol > 63 Then Vol = 63
Waitms 50
Rx_volume
End If
Loop