'  Programme en PicBasic pour programmer le module Comtech TX2400
'  avec affichage de la fréquence sur un LCD en mode 4-bit.
'Fmin =2000 MHz,  F max= 2650 MHz 
'Sélection du pas 125, 250, 500, 1000, 10 000 kHz
'Mémorisation de la fréquence par bouton poussoir 
' deux VFO sélectionnables par Port A3
'Version pour LCD 1 ligne de 2x8 caractères

'			*** Copyright - F6CSX - Juillet 2002 - février 2003 ***

' **  DÉFINITION HARDWARE (CONFIGURATION COMME F1BIU, COMPATIBLE CI DE F6KIO):

'       LCD    	 PIC
'       ------	   	--------
'       DB4     	PortB.4
'       DB5   	  	PortB.5
'       DB6     	PortB.6
'       DB7     	PortB.7
'       RS      		PortB.1 
'       E       		PortB.3
'       RW      	PortB.2
'       Vdd     	5 volts
'       Vss     	Ground
'       Vo      		potentiometre de 10K  
'       

' ** DÉCLARATION DE LA CONFIGURATION HARD    
    

	DEFINE LCD_DREG	PORTB	'Selection du port B
	DEFINE LCD_DBIT 4	'Selection de RB4 à RB7
	DEFINE LCD_RSREG PORTB	'RS sur port B
	DEFINE LCD_RSBIT 1	'RS sur RB1
	DEFINE LCD_EREG	PORTB
	DEFINE LCD_EBIT 3	'E sur RB3
	DEFINE LCD_BITS 4		'Mode 4 bits
	DEFINE LCD_LINES 2	'2 lignes de 8 caractères

	DEFINE I2C_SCLOUT 1
	
' ** DÉFINITION DES ENTREES - SORTIES

' Sorties I2C
	SCL   	var     	PORTB.1        	 ' SCL sur RB1 (pin 7)
	SDA	var	PORTB.0		' SDA sur RB0 (pin 6)

'Boutons
	MEMO	var	PORTA.2		' Bouton de mémorisation sur RA2 (pin 1)
	UP	var	PORTA.0		'augmente la fréquence (sur RA0)
	DOWN	var	PORTA.1		'diminue la fréquence (sur RA1)
	CH_PAS	var	PORTA.4		'Change le pas du synthé (sur RA4) 
	 SEL	var	PORTA.3		'Choix VFO A ou B (sur RA3)

	INPUT	UP			'Up et Down sont des entrées
	INPUT	DOWN
	INPUT	MEMO
	INPUT	CH_PAS
	INPUT	SEL
	
' ** DÉCLARATION DES VARIABLES

b1	var 	BYTE
b2	var 	BYTE
b3	var 	BYTE
b5	var	BYTE
b6	var	BYTE	
b7	var	BYTE

F1	var	WORD
F2	var	WORD
F3	var	WORD
	
W1	var	BYTE
W2	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
	
'*** DONNEES INITIALES ***	
	
	ADDR1=$C2		'adresse I2C du SDA5055
	PLLBASE=16000		'début à 2000 MHz : 2200 / 0,125 = 17600
	PAS = 1			' pas de 125 kHz par défaut
	PAUSE 100
	LOW PORTB.2		'Met RB2 = R/W  à 0
	LCDOUT $FE, 1   		' Clear LCD screen
        	LCDOUT "TX ATV 2" 	' affiche  numéro de version  pendant 1 seconde
        	LCDOUT $FE,$C0
        	LCDOUT ".3GHz v1" 
        	W1=0
        	W2="A"
        	PAUSE 1000   

	EEPROM 0,[$A0,$09,$00,$0A]		'données initiales  TMP =2464  ($9A0) correspond à F = 2308 MHz
					'	          TMP = 2560 ($A00) correspond à 2320 MHz
' Le point de départ est 2000 MHz donné par PLLBASE. On rajoute un décalage de 125kHz * TMP
'TMP  est sur 16 bits, donc 65535 fréquences possibles.
'	
	'*** LECTURE DU DECALAGE TMP ***
 
 LECTURE:
 	
	READ  W1,TMP_LO		'lit les 8 bits de poids faible
	READ  W1+1,TMP_HI	'lit les 8 bits de poids fort


			' *** DÉBUT DU PROGRAMME ***

MAIN:	
	PLL = PLLBASE + TMP
	I2CWRITE SDA,SCL,ADDR1,[HI,LO,$8E]	  'Envoi des données au module  			
	
	GOSUB	 CALCUL		'calcule la fréquence pour l'affichage
	GOSUB AFFICHAGE	'affiche la fréquence
	PAUSE 500
	

			'*** BOUCLE PRINCIPALE ***

BOUCLE:	 
		BUTTON SEL,0,255,0,b6,1,VFO_A	'surveille le bouton SEL: 0=VFO A
		BUTTON SEL,1,255,0,b7,1,VFO_B	' 		  1= VFO B
	
		BUTTON UP,0,10,2,b1,1,MONTE	'surveille le bouton UP
		BUTTON DOWN,0,10,2,b2,1,DESCEND	'surveille le bouton DOWN
		BUTTON MEMO,0,255,0,b5,1,STORE	'surveille le bouton MEMO
		BUTTON CH_PAS,0,255,0,b3,1,	CHOIX	'surveille le bouton PAS		
		PAUSE 100			'pause de 0.1s
		GOTO BOUCLE

VFO_A:		'Change  de VFO 
		W1=0
		W2="A"
		GOTO LECTURE
		
VFO_B:
		W1=2		
		W2="B"
		GOTO LECTURE


MONTE:		'** AUGMENTE LA FRÉQUENCE DE 1 PAS

		TMP = TMP + PAS
		IF TMP > 5200 THEN TMP = 0	'Fmax = 2650 MHz
		GOTO MAIN
		
DESCEND:	'** DIMINUE LA FREQUENCE DE 1 PAS

		IF TMP<PAS THEN RAZ_TMP
		IF TMP = 0 THEN TOP
		TMP = TMP - PAS
		GOTO MAIN
		
TOP:		TMP=5200
		GOTO MAIN
		
RAZ_TMP:	TMP = 0
		GOTO MAIN
		
CHOIX:		'** CHOIX DU PAS	
	
		IF PAS = 80 THEN SAUTE
		IF PAS = 8 THEN DIX_MEGA
		PAS = PAS*2
		GOSUB AFFICHE_PAS
		GOSUB CALCUL
		GOSUB AFFICHAGE	'affiche la fréquence
		GOTO BOUCLE
		
SAUTE:		PAS = 1
		GOSUB AFFICHE_PAS
		GOSUB CALCUL
		GOSUB AFFICHAGE	'affiche la fréquence
		GOTO BOUCLE

DIX_MEGA:	'Pas de 10 MHz
		PAS = 80
		GOSUB AFFICHE_PAS
		GOSUB CALCUL
		GOSUB AFFICHAGE	'affiche la fréquence
		GOTO BOUCLE
		
CALCUL:		' ** CALCUL DE LA FREQUENCE
	
		F1= PLL-16000		'retranche 2GHz 		 
		F2=F1/8			'donne les MHz
		F3=125*(F1//8)		'donne les kHz
		RETURN

AFFICHAGE:	
        		LCDOUT $FE, 1   		' Clear LCD screen	
		LCDOUT #2		'affiche le 2 des Giga
		LCDOUT DEC3 F2		'affiche les autres digits		
		LCDOUT "."		'affiche la virgule
		LCDOUT DEC3 F3		'affiche les kHz
		LCDOUT $FE,$C0		
		LCDOUT " MHz "
		LCDOUT W2		'affiche A ou B selon le VFO utilisé
		RETURN	

AFFICHE_PAS:	'Affichage du pas

		LCDOUT $FE, 1   		' Clear LCD screen
		LCDOUT "Pas de "
		LCDOUT $FE,$C0
		LCDOUT # 125*PAS
		LCDOUT " kHz"
		PAUSE 1500
		RETURN
		
'*** MEMORISATION DE LA FRÉQUENCE

STORE:				
		WRITE W1, TMP_LO		'Stocke les 8 bits de poids faible de TMP dans l'EEPROM à l'adresse 0
		WRITE W1+1, TMP_HI		'Stocke les 8 bits de poids fort de TMP dans l'EEPROM à l'adresse 1	
		LCDOUT $FE, 1
		LCDOUT "MEMORISE"
		LCDOUT $FE,$C0
		LCDOUT " sur "
		LCDOUT W2
		PAUSE 1500
		GOSUB CALCUL		'recalcule la fréquence
		GOSUB AFFICHAGE	
		GOTO BOUCLE

