I want to start post about code for PIC uP (16F877) which would send data via I2C bus for programming TSA5511/5512 PLL IC, and frequency reading on LCD, and it will be suitable for 87 - 108MHz range, or even more, but that's lower part of problem. ;-)

So far now we have code which "Savnik" gave us....and is for same TSA PLL, but on range 1200 - 1600MHz and it has frequency step of 125KHz (0,125MHz), so here's the code:

Code:
'Fmin =1200 MHz, F max= 1650 MHz
' ** DECLARATION OF THE VARIABLES

b1 var BYTE
b2 var BYTE
b3 var BYTE
b5 var BYTE

F1 var WORD
F2 var WORD
F3 var WORD


ADDR1 VAR BYTE
TMP VAR WORD
TMP_LO VAR TMP.LOWBYTE
TMP_HI VAR TMP.HIGHBYTE
PLLBASE VAR WORD
PLL VAR WORD
LO VAR PLL.LOWBYTE
HI VAR PLL.HIGHBYTE
PAS VAR BYTE '1=125kHz, 2=250kHz, 4=500kHz, 8=1MHz

'*** INITIAL DATA ***

ADDR1=$C2 'adress I2C of SDA5055 (ADDR1=$C0 , adress I2C of TSA5511)
PLLBASE=9600 'beginning with 1200 MHz : 1200 / 0,125 = 9600
PAS = 1 'pas of 0.125 MHZ by defect
PAUSE 100
LCDOUT $FE, 1 ' Clear LCD screen
LCDOUT " PLL FM 88-108" ' post text during 1 second
LCDOUT $FE,$C0
LCDOUT " NIKOS"
PAUSE 1000

EEPROM 0,[$90,$01] 'initial data TMP = 400 ($190) corresponds to F = 1250 MHz


'The starting point is 1200 MHz given by PLLBASE. One adds a shift of 125kHz * TMP
'TMP is on 16 bits, therefore 65535 possible frequencies.
'
'*** READING OF THE DECALAGE TMP ***

READ 0,TMP_LO 'reads the 8 bits of weak weight
READ 1,TMP_HI 'reads the 8 bits of strong weight


' *** BEGINNING OF THE PROGRAM***

MAIN:
PLL = PLLBASE + TMP

I2CWRITE SDA,SCL,ADDR1,[HI,LO,$8E] 'Sending of the data to the module

GOSUB CALCUL 'calculate the frequency for posting
GOSUB AFFICHAGE 'post the frequency
PAUSE 500


'*** PRINCIPAL LOOP ***

BOUCLE:
BUTTON UP,1,10,2,b1,1,MONTE 'supervise the button UP
BUTTON DOWN,1,10,2,b2,1,DESCEND 'supervise the button DOWN
BUTTON MEMO,1,255,0,b5,1,STORE 'supervise the button MEMO
BUTTON CH_PAS,1,255,0,b3,1, CHOIX 'supervise the button PAS
PAUSE 100 'pauses of 0.1s
GOTO BOUCLE


MONTE: '** INCREASE THE FREQUENCY OF 1 PAS (STEP)

TMP = TMP + PAS
IF TMP > 3600 THEN TMP = 0 'Fmax = 1600 MHz
GOTO MAIN

DESCEND: '** DECREASE THE FREQUENCY OF 1 PAS (STEP)

IF TMP
IF TMP = 0 THEN TOP
TMP = TMP - PAS
GOTO MAIN

TOP: TMP=3600
GOTO MAIN

RAZ_TMP: TMP = 0
GOTO MAIN

CHOIX: '** CHOICE OF THE PAS (STEP)

IF PAS = 8 THEN SAUTE
PAS = PAS*2
GOSUB AFFICHE_PAS
GOSUB AFFICHAGE 'post the frequency
GOTO BOUCLE

SAUTE: PAS = 1
GOSUB AFFICHE_PAS
GOTO BOUCLE

CALCUL: ' ** CALCULATION OF THE FREQUENCY

F1= PLL-800 'cut off 1GHz
F2=F1/8 'give them MHz
F3=125*(F1//8) 'give them kHz
RETURN

AFFICHAGE:
LCDOUT $FE, 1 'Clear LCD screen
LCDOUT #1 'post the 1 of Giga
LCDOUT #F2 'post the other digits
LCDOUT "." 'post the comma
LCDOUT #F3 'post the Khz
LCDOUT " MHz "

So, this code which changed by "Jerson" and myself...is suitable to work on 87 - 108MHz....but problem is it has step of 125KHz (0,125MHZ) and we need to get frequency step of 100KHz, or even 50KHz..

To do that we must change TSA PLL XTAL to 3,2MHz and get 50KHz step, refer to datasheet, or by mine calculation maybee 6,4MHz XTAL will do good for 100KHz step??

Also mine question here is, does PIC XTAL effect on TSA XTAL??

So here's changed code for 87 - 108MHz with 0,125MHz steps:

Code:
   
   
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 0
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50



DEFINE I2C_SCLOUT 1    'Set serial clock to bipolar instead of open-collector 

	


' definition I2C communication
	SCL   	var     	PORTB.1        	 ' SCL on RB1  
	SDA	    var     	PORTB.0	      	 ' SDA on RB0 

'press:
	MEMO	var	PORTB.3		' 
	UP   	var	PORTB.4		' press for FREQ UP RB.4
	DOWN	var	PORTB.5		' press for FREQ DOWN RB.5


	
	INPUT	UP			'Up et Down sont des entrées
	INPUT	DOWN
	INPUT	MEMO



   
   
    'Fmin =88 MHz, F max= 108 MHz 
' ** DECLARATION OF THE VARIABLES

b1 var BYTE
b2 var BYTE
b3 var BYTE
b5 var BYTE

F1 var WORD
F2 var WORD
F3 var WORD


ADDR1        VAR BYTE
TMP          VAR WORD
TMP_LO       VAR TMP.LOWBYTE
TMP_HI       VAR TMP.HIGHBYTE
PLLBASE      VAR WORD
PLL          VAR WORD
LO           VAR PLL.LOWBYTE
HI           VAR PLL.HIGHBYTE
PAS          VAR BYTE '1=125kHz, 2=250kHz, 4=500kHz, 8=1MHz 

'*** INITIAL DATA *** 

ADDR1=$C2 'adress I2C of SDA5055 (ADDR1=$C0 , adress I2C of TSA5511)
PLLBASE=696  'beginning with 87 MHz : 87 / 0,125 = 696
PAS = 1 'step of 0.125 MHZ by default    ?????
PAUSE 100
LCDOUT $FE, 1 ' Clear LCD screen
LCDOUT " PLL FM 88-108" ' post text during 1 second
LCDOUT $FE,$C0 
LCDOUT " BT-20" 
PAUSE 1000 

EEPROM 0,[$90,$01] 'initial data TMP = PLLBASE  corresponds to F = 88 MHz


'The starting point is 88 MHz given by PLLBASE. One adds a shift of 125kHz * TMP
'TMP is on 16 bits, therefore 65535 possible frequencies.
' 
'*** READING OF THE DECALAGE TMP ***

READ 0,TMP_LO 'reads the 8 bits of weak weight
READ 1,TMP_HI 'reads the 8 bits of strong weight


' *** BEGINNING OF THE PROGRAM***

MAIN: 
PLL = PLLBASE + TMP

I2CWRITE SDA,SCL,ADDR1,[HI,LO,$8E] 'Sending of the data to the module 

GOSUB CALCUL 'calculate the frequency for posting
GOSUB AFFICHAGE 'post the frequency
PAUSE 500


'*** press routine ***

BOUCLE: 
BUTTON UP,0,10,2,b1,1,MONTE 'supervise the button UP
BUTTON DOWN,0,10,2,b2,1,DESCEND 'supervise the button DOWN
BUTTON MEMO,0,255,0,b5,1,STORE 'supervise the button MEMO
' only step size of 125KHz is handled
' BUTTON CH_PAS,1,255,0,b3,1, CHOIX 'supervise the button PAS 
PAUSE 100 'pauses of 0.1s
GOTO BOUCLE


MONTE: '** INCREASE THE FREQUENCY OF 1 PAS (STEP)

TMP = TMP + PAS
IF TMP > 168 THEN TMP = 0 'Fmax = 108 MHz  ---> (Fmax - Fmin) / 0,125   -> (108-87)/0,125  = 168
GOTO MAIN

DESCEND: '** DECREASE THE FREQUENCY OF 1 PAS (STEP)

IF TMP = 0 THEN TOP
TMP = TMP - PAS
GOTO MAIN

TOP: TMP=168   ' max reading in Tmp
GOTO MAIN


GOSUB AFFICHAGE 'post the frequency
GOTO BOUCLE


GOTO BOUCLE

CALCUL: ' ** CALCULATION OF THE FREQUENCY

F1 = PLL 'cut off 1GHz 
F2 = F1/8 'give them MHz
F3 = 125*(F1//8)


RETURN

AFFICHAGE: 
LCDOUT $FE, 1 'Clear LCD screen 
LCDOUT #F2 'post the other digits 
LCDOUT "." 'post the comma
LCDOUT #F3 'post the Khz
LCDOUT " MHz "

STORE:				
		WRITE 0, TMP_LO		
		WRITE 1, TMP_HI		
		GOTO BOUCLE
So I searching for anyone's help to change this to get steps of 100KHz (0,1MHz) and may it work in wider range, not only in 87 - 108MHz.....

Regards,

Marin