FM-Radio KT0837 am I2C-Bus
Es geht
um dieses Radio, eine Beilage der Kinderzeitschrift "Tiere, Freunde fürs
Leben". Als ich davon erfahren habe bin ich gleich zum Bahnhof
gefahren und konnte tatsächlich zwei solche Hefte bekommen. Das Radio ist
bemerkenswert gut. Mit der Senderwahltaste kann man wahlweise durch kurzes
Antippen einen Suchlauf zum nächst höheren Sender starten oder durch langen
Tastendrucke alle Kanäle durchstimmen. Die Laut/Leise-Tasten reagieren nicht
auf Dauerdruck, sondern man muss mehrmals drücken um die Lautstärke zu verstellen.
Das ist auch nötig, weil die Startlautstärke viel zu hoch ist.
Die
Platine stimmt relativ genau mit dem Schaltplan im Datenblatt
überein. Besonders spannend sind die nicht benutzen Pins D1 und
D2, die laut Datenblatt einen I2C-Bus darstellen.
Also
Kabel dran und ausprobieren! Drei Adern werden gebraucht: Pin8 GND
(sw), Pin5 D2 (br) und Pin4 D1 (rt). Die
I2C-Leitungen wurden willkürlich auf PB0 (SCL) und PB2 (SDA)
gelegt. Außerdem habe ich zwei Pullups mit 10 k eingebaut. Der Test
lief auf dem STK500, weil ich da Vcc leicht auf 3 V einstellen konnte.
Um im Sockel steckte gerade ein Mega168, den habe ich deshalb
verwendet.
Die erste
korrekte Verbindung habe ich erst nach einigem Probieren hinbekommen. Eine
Schwierigkeit war, dass ich zuerst D1 und D2 falsch zugeordnet hatte. Dann habe
ich einfach mal SDA und SCL getauscht. Die zweite Schwierigkeit war die
Geschwindigkeit. Am Oszilloskop waren seltsame Signale zu sehen, die mir so
aussahen, als würde der Chip versuchen den Bus zu bremsen. Deshalb habe ich den
I2C-Bus besonders langsam laufen lassen und dazu zum ersten mal überhaut das
Bascom-Kommando Config I2ddelay verwendet.
Config
Scl =
Portb.0
'D1, Pin4
Config Sda =
Portb.2
'D2, Pin5
Config I2cdelay = 40
Jetzt funktioniert es. Im
Register &H13 (dez. 19) findet man die aktuelle Frequenz. Die
Umrechnung geht aus dem Datenblatt hervor. Durch weitere Versuche habe
ich feststellen können, dass insgesamt 20 Register vorhanden sind, die
man auslesen kann. Hier die Inhalte, jeweils als Highbyte und
Lowbyte.
1 240 240
2 98 4
3 89 240
4 64 15
5 0 0
6 0 0
7 38 0
8 248 0
9 5 17
10 4 64
11 103 232
12 112 0
13 0 1
14 0 0
15 10 0
16 0 0
17 183 4
18 204 72
19 1 240
20 132 58
Umgekehrt
hatte ich keinen Erfolg damit, etwas in die Register zu schreiben. Aber beim
Auslesen konnte ich immerhin erkennen, dass im Register 4 die aktuelle Lautstärke
steht. Und damit konnte dann ein einfaches Programm geschrieben werden, das
die Frequenz (in 10-kHz-Einheiten) und die Lautstärke (0...15) ausliest und
seriell mit 9600 Baud an ein Terminal sendet. Wie man sieht läuft da gerade
WDR3 (95,1 MHz) mit voller Lautstärke.
'KT0837, Frequenz und Lautstärke auslesen
$regfile = "m168def.dat"
$crystal = 11059200
$baud = 9600
$hwstack = 16
$swstack = 32
$framesize = 32
Dim R As Byte
Dim Hi As Byte
Dim Lo As Byte
Dim F As Word
Dim L As Word
Declare Sub Read_reg()
Config
Scl =
Portb.0
'D1
Config Sda =
Portb.2
'D2
Config I2cdelay = 40
I2cinit
Do
R =
&H13
'Freqeunz
Read_reg
F = Hi * 256
F = F + Lo
F = F * 5
F = F + 6400
Print F;
Print " ";
R =
&H04
'Lautstärke
Read_reg
L = Lo
Print L
Waitms 1000
Loop
Sub Read_reg()
I2cstart
I2cwbyte &H6E
I2cwbyte R
I2cstart
I2cwbyte &H6F
I2crbyte Hi , Ack
I2crbyte Lo , Nack
I2cstop
End Sub
End