FM-Radio KT0837 am I2C-Bus         


Elektronik-Labor  Projekte  AVR 



Siehe Labortagebuch: FM-Radio KT0837
  
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

 


Elektronik-Labor  Projekte  AVR