'furanje SL1935 (Digi SAT-TV tuner sint) na I2C bus preko lpt porta
'd0 (pin 2) = scl   d1 (pin 3) = sda  s transistorskima inverterjema
'error (pin 15) = vhod

'preizkusena verzija     by s57uuu aug 2004

DIM bb(4)
cddd% = &HFF: cddg% = &HFD: cgdd% = &HFE: cgdg% = &HC
OUT &H378, cgdg%         'bus idle

adr = 1         '0=gnd,1=open,2=30k na + (0.4-0.6V),3=+
cp = 0          '0..3 charge pump current 155,330,690,1450uA
bp = 0          '0..1 base band path
buf = 0         '0..1  Buffered crystal reference output enable
tm = 0          '0..7  Test mode select  0=normal operation
rr = 1          '0..31 reference divider !!po tabeli!!  1= /4 (1MHz 4MHz xtal)
vco = 0         '0..1 VCO select  0=1400-2200  1=950-1500
p0 = 0          '0..1 izhod noga 34

bb%(0) = 192 + 2 * adr   'adr+write
bb%(1) = &H3             'N=1000   (1GHz za 1MHz ref)
bb%(2) = &HE8
bb%(3) = 128 + cp * 32 + rr
bb%(4) = tm * 32 + vco * 16 + bp * 8 + buf * 2 + p0

xtal = 4000000!
fref = xtal \ 4

zac:
CLS
PRINT : PRINT : PRINT : PRINT
PRINT "MENU:": PRINT
PRINT "1 - nastavljanje frekvence"
PRINT "4 - testiranje dinamike zanke (skakanje med dvema f)"
PRINT "5 - konec"

menu: INPUT men%
SELECT CASE men%
  CASE 1:       GOTO zanka1
  CASE 4:       GOTO zanka4
  CASE 5:       SYSTEM
  CASE ELSE:    GOTO menu
END SELECT

'zanka1:   nastavljanje frekvence z glavnim delilcem

zanka1:
INPUT "daj frekvenco v MHz! (0=konec)"; f
IF f = 0 THEN GOTO zac
n% = f * 1000000! / fref
bb%(1) = n% \ 256
bb%(2) = n% MOD 256
'PRINT bb%(1), bb%(2)           
IF f < 1400 THEN                 'izbira VCOja
  bb%(4) = bb%(4) OR 16
ELSE
  bb%(4) = bb%(4) AND 239
END IF
GOSUB prog3302
SLEEP 1
GOSUB beri1935
GOTO zanka1

zanka4:
INPUT "daj f1 in f2 (0,0=konec)"; f1, f2
zan4:
IF f1 = 0 THEN GOTO zac
n% = f1 * 1000000! / fref
bb%(1) = n% \ 256
bb%(2) = n% MOD 256
GOSUB prog3302
FOR caki = 1 TO 10000: NEXT caki
IF f2 = 0 THEN GOTO zac
n% = f2 * 1000000! / fref
bb%(1) = n% \ 256
bb%(2) = n% MOD 256
GOSUB prog3302
FOR caki = 1 TO 10000: NEXT caki
IF INKEY$ = "" THEN GOTO zan4
GOTO zanka4



'-----------------------------------------
prog3302:

OUT &H378, cgdd%: GOSUB delay        'start
OUT &H378, cddd%: GOSUB delay

FOR i% = 0 TO 4
  byt% = bb%(i%)
  bitw% = 128
  FOR j% = 7 TO 0 STEP -1
    IF byt% >= bitw% THEN   'bit = 1
      byt% = byt% - bitw%
      OUT &H378, cddg%: GOSUB delay
      OUT &H378, cgdg%: GOSUB delay
      OUT &H378, cddg%: GOSUB delay
    ELSE                        'bit = 0
      OUT &H378, cddd%: GOSUB delay
      OUT &H378, cgdd%: GOSUB delay
      OUT &H378, cddd%: GOSUB delay
    END IF
    bitw% = bitw% \ 2
  NEXT j%
  OUT &H378, cddg%: GOSUB delay              'ACK
  OUT &H378, cgdg%: GOSUB delay
  ack(i%) = (INP(&H379) AND 8) / 8
  OUT &H378, cddg%: GOSUB delay
NEXT i%
OUT &H378, cgdd%: GOSUB delay
OUT &H378, cgdg%: GOSUB delay                'idle

'FOR i% = 0 TO 4: PRINT "ACK("; i%; ")="; ack(i%): NEXT i%
FOR i% = 0 TO 4: IF ack(i%) = 1 THEN PRINT "Prog3302 no ACK"; i%
NEXT i%

RETURN

beri1935:

OUT &H378, cgdd%: GOSUB delay        'start
OUT &H378, cddd%: GOSUB delay
byt% = 192 + 2 * adr + 1          'address + read
bitw% = 128
FOR j% = 7 TO 0 STEP -1
  IF byt% >= bitw% THEN   'bit = 1
    byt% = byt% - bitw%
    OUT &H378, cddg%: GOSUB delay
    OUT &H378, cgdg%: GOSUB delay
    OUT &H378, cddg%: GOSUB delay
  ELSE                        'bit = 0
    OUT &H378, cddd%: GOSUB delay
    OUT &H378, cgdd%: GOSUB delay
    OUT &H378, cddd%: GOSUB delay
  END IF
  bitw% = bitw% \ 2
NEXT j%
OUT &H378, cddg%: GOSUB delay              'ACK
OUT &H378, cgdg%: GOSUB delay
ackn = (INP(&H379) AND 8) / 8
OUT &H378, cddg%: GOSUB delay
IF ackn = 1 THEN PRINT "Beri1935-1:  no ACK!!"
stat% = 0
FOR j% = 7 TO 0 STEP -1
  OUT &H378, cddg%: GOSUB delay
  OUT &H378, cgdg%: GOSUB delay
  stat% = stat% + ((INP(&H379) AND 8) / 8) * 2 ^ j%
  OUT &H378, cddg%: GOSUB delay
NEXT j%
OUT &H378, cddg%: GOSUB delay              'ACK
OUT &H378, cgdg%: GOSUB delay
ackn = (INP(&H379) AND 8) / 8
OUT &H378, cddg%: GOSUB delay
'IF ackn = 1 THEN PRINT "Beri1935-2:  no ACK!!"
OUT &H378, cddd%: GOSUB delay
OUT &H378, cgdd%: GOSUB delay
OUT &H378, cgdg%: GOSUB delay                'idle

PRINT "Status:  ";
IF (stat% AND 128) = 128 THEN PRINT "POR=1  ";  ELSE PRINT "POR=0  ";  '!!!!!
IF (stat% AND 64) = 64 THEN PRINT "LOCK=1" ELSE PRINT "LOCK=0"   '!!!!!

RETURN        'Beri1935

delay:
FOR mi = 1 TO 10: NEXT
RETURN


