| INDEX... |
|
|
|
|
|
|
|
|
Obwohl das Ding in meiner Eigenbau-Stereoanlage wunderbar geht, ist
alles folgende ohne Gewähr:
Pinbelegung: (Achtung: bis 31.3.99 waren noch zwei (harmlose) Typos in der Belegung)
Zählrichtung beginnt bei der Seite des HF-Antennen-Eingangs:
| Pin | Signal |
| 3 | +33V in |
| 6 | GND |
| 9 | GND |
| 10 | +12V |
| 11 | SDA in (s.u.) |
| 12 | SCLK in |
| 13 | GND |
| 14 | +5V |
| 19 | +12V |
| 20 | FBAS out |
| 23,24 | GND |
| 27 | NF1 out |
| 28 | Mute in (offen lassen) |
| 29 | NF2 out |
| 30 | GND |
An FBAS hat man das Video-Signal, an NF1 das Mono-Signal, damit an NF2
was rauskommt, muß man einen Widerstand auf der Platine ändern(???),
dann hat man aber nur 2-Kanal-Ton, für Stereo braucht man noch einen
Extra-Chip (zB. TDA 8415, nur ein Quarz und per I2C steuerbar).
Die Ansteuerung des Tuners erfolgt über das "übliche" I2C-Protokoll (SDA: Daten, SCLK: Schiebetakt).
SDA braucht einen Pullup (ca. 1K) nach +5V, dann Diode zum O-Port (Anode
zu SDA)

Die 5V/12V können von einem 7805/7812 geliefert werden, die +33V (nicht so kritisch, aber über 37V funktioniert die PLL nicht mehr vernünftig) habe ich mit einem Schaltregler TL497 aus 5V erzeugt:

(Ja, ich weiß, der TL497 könnte auch selber regeln, eine
ZD33 ist aber einfacher. Eigentlich sollte noch ein 100pF-C an Pin 3 für
den Oszillator, es geht aber so auch ;-)
Die Ansteuerungsgrundlage ist das serielle Ausgeben eines Bytes:
Assembler Code für 68030:
; Gibt 1 Byte (in d0) auf I2C aus (oberstes Bit zuerst)
i2c_dataout:
; int val
moveq #7,d1
; 8 bit ausgeben
.loop:
bsr i2c_clk0
; zuerst immer SCLK=0
btst d1,d0
beq.s .set0
; Wenn Bit #d1 in d0 '0' ist, springe
bsr i2c_data1
; SCKL=0, SDA=1
bra.s .next
.set0:
; oder
bsr i2c_data0
; SCKL=0, SDA=0
.next:
bsr i2c_clk1
; SCLK=1
bsr i2c_clk0
; SCLK=0
dbra d1,.loop
; 8 Bits reintaktem
bsr i2c_data0
; SDA=0
bsr i2c_clk0
; SCLK=0
bsr i2c_clk1
; SCLK=1
rts
Für 68000-Unkundige: beq "branch if equal", bsr "branch to subroutine", dbra "decrement and branch if not zero".
Da das Ansteuern von SDA/SCLK systemspezifisch ist, habe ich das hier weggelassen.
Das SCLK-Wackeln nach dem 8ten Bit ist unbedingt nötig! Da muß das angesprochene Device sein "0"-Acknowledge auf SDA geben (kann man anschauen, ist aber egal, daher aber die Diode, sonst gibts eine Kollision). Die Subroutinen haben eine Warteschleife von ca. 10-100uS, SCLK darf so max. 100-200kHz haben.
Die Ausgabe eines Steuerwortes val (16bit) auf die I2C-Adresse adr (8Bit)
geht in C so:
(i2c_datax()/i2c_clkx() setzen die jeweiligen Signale auf x)
void i2c_out(int adr,int val)
{
i2c_data1();i2c_clk1();
// Startbit
i2c_data0();
i2c_dataout(adr);
// Adresse
i2c_dataout(val>>8);
// Obere 8 Bit
i2c_dataout(val);
// Untere 8 Bit
i2c_data0();
i2c_clk1();i2c_data1();
i2c_clk0();i2c_clk1();
// Stopbit
}
Der TSA5511 fühlt sich immer bei Adresse 0xC2 angesprochen. Nach
der 8bit-Adresse bekommt der 5511 auch noch 16bit (2*8) Daten, entweder
die PLL-Einstellung (Bit15=0) oder Kontrollinfos (Bit15=1, Frequenzband
etc.)
Die Ausgabe der Frequenz freq (in 62.5kHz-Schritten) geht dann so
(inkl. Auswahl des richtigen Bandes):
#define UHFMIN (int)(460000.0/62.5)
#define VHF3MIN (int)(160000.0/62.5)
void tuner_set_tv(int prog)
{
int freq,tnctrl;
freq=stb->tuner_info[prog].freq;
// frequ: PLL-Teilerfaktor (s.u.)
if (freq>UHFMIN)
tnctrl=1;
// UHF
else if (freq>VHF3MIN)
tnctrl=2;
// VHF III
else
tnctrl=4;
// VHF I
i2c_out(0xc2,0x80f0+tnctrl);
// Selektion des richtigen
// Frequenzbandes
i2c_out(0xc2,freq);
// Ausgabe der Frequenz
}
Zur Berechnung der PLL-Einstellung aus der üblichen Kanalnummer (0-99, wobei die Sonderkanäle S1-S20 von 80-99 gehen):
int channel_to_div(int c)
{
if ((c>=91)&&(c<=99))
c=4320+112*(c-91);
if ((c==0)||(c==100))
c=4320+112*9;
if ((c>=5)&&(c<=12))
c=3424+112*(c-5);
if ((c>=21)&&(c<69))
c=8160+128*(c-21);
if ((c>=81)&&(c<=90))
c=2304+112*(c-81);
if ((c>=1)&&(c<=4))
c=1280+112*(c-1);
return c;
}
(Ob und wie man die Hyperbandkanäle S21... einstellen kann, habe ich noch ausprobiert.)
Die Frequenz, die man einstellt, liegt 38.5MHz (1te ZF) über der eigentlich gewünschten Frequenz.
Also zuerst mit channel_to_div den PLL-Teiler ausrechnen, dann mit set_tuner_tv setzen.
Damit sollte es eigentlich machbar sein, dem Tuner ein Bild zu entlocken.
PS: Eine Menge Tuner arbeiten mit I2C, recht viele haben sogar kompatible
PLL-Chips (zB. SDA3302, wird von Grundig gern benutzt).
| Georg Acher |
Last Update: 2000-09-30
|