'=============================================================================
' ** 21-05-2005 SinSh v_2.x
' FIRMWARE per TRX ATV 
'=============================================================================
'SinSh_21 oggi 15-09-05
'    Quando premo il pusante P2 o P3 con il dial si variano le memorie
'
'SinSh_2c oggi 20-06-05
' Quando la frequenza di RX (senza OL "dirette") è > di 2150 Mhz sottraggo 
'  la media frequenza e invio se è < di 2150 sommo la media frequenza e invio
'  prima si faceva solo la somma.
' Scegliendo nel SETUP come indiriizzo I2CBUS TCA la sintonia pilota solo RX,
'  comandi e display è uguale alla vecchia sintonia con in più le 10 memorie
' Aggiunto controllo su I2cbus se RX=TX non si esce dal setup
' Tolto il il ritorno dopo 12 sec di inattività da TX > RX (richiesta ROM-IGE)
'
'
'SinSh_13 oggi 09-06-05
' Anche con shift messo il ! che indica PLL error del TX, occorre mettere un filo 
'  tra il pin  28 del PLL MC145151 Motorola e il pin 4 della PIC lasciando i 
'  componenti gia presenti R=10Kohm e C=0,1 microF ( erano il reset per F84)
' Risolto il problema del pullup su SCL ora non serve.
'
'
'SinSh_12 oggi 07-06-05
' Sistemato problema durate SUTUP1 con OL- non si vedeva se PULS o DIAL 
'  pur cambiandoli si vedeva solo con OL+
'
'SinSh_11:  oggi 26-05-2005
' Cambiato scritta mh in Mh
' Filtrato con contatore del PLL di TX e messo e il ! dietro a Mh
' Aggiunta la funzione OL+  OL-  per i convertitori che lavorano per sottrazione 
'  tipicamente la banda 2Ghz (con OL- 3Ghz)
'
'SinSh_10:  oggi 21-05-2005
'*Programma in PicBasic PROTON+ per pilotare un RX in I2CBUS e un TX in I2CBUS
'  oppure uno shift register 74hc595 per adattarlo al vecchio TX con PLL parallelo
'
' Visualizzazione delle frequenze e parametri su LCD 2x16 
' Media Frequenza del ricevitore fissa a 479.5 MHz
' Variazione frequenza a passi selezionabili di 250,500,1000,10000 kHz
' Memorizzazione delle Frequenze e dati in EEPROM premendo i tasti relativi
' Selezione dell'ingresso A-B e banda N-W per i moduli RX che lo prevedono
' Limiti di frequenza di RX e di Tx programmabili
' Valore programmabile di funzione OL per quando si riceve con convertitore 
'  esterno  tipo LNB per i 10Ghz o ....
' All'accensione il programma parte con i valori memorizzati nella cella 0
'  che diventa cosi la memoria preferenziale
'
'=============================================================================
' posizione_ pulsanti:
' P1 - P2 - P3 (DOWN - UP) 
' VFO - MEM . PAS DIAL
'
' si può scegliere se funzionare con pulsanti o dial vedi SETUP
'=============================================================================
'=============================================================================

STARTP:	
	Device	16F628A
	Declare XTAL=4
	Config INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,LVP_OFF,CP_OFF,BODEN_ON,MCLRE_OFF
	
	Declare LCD_DTPIN PORTB.4		   'Selezione della porta B
	Declare LCD_ENPIN PORTA.3
	Declare LCD_RSPIN PORTA.2 
	Declare LCD_LINES 4
	
' Uscite I2C su modulo COMTECH
	
	Declare SDA_PIN PORTA.0             ' I2Cbas il dato lavora in Open-collettor
	Declare SCL_PIN PORTA.1             ' il 
    Declare BUS_SCL On                  ' dichiaro che SCL lavori in Push-Pull 
 

	DOWN	 VAR	PORTB.0             ' Tasto Frequenza DOWN 
	UP	  	 VAR	PORTB.3				' Tasto Frequenza UP 
	CH_PAS   VAR	PORTB.2				' Tasto Cambio passo di sintesi 
	MEMO  	 VAR	PORTB.1				' Tasto Memorizzazione 
	VFO_TR	 VAR	PORTA.4				' Tasto cambio VFO
	                                    
    PLLOK	 VAR	PORTA.7				' Uscita PLL TX is OK=1
	

' ** DICHIARAZIONE DELLE VARIABILI
  TASTI_L      VAR Byte                 ' TASTO FILTRATO A TRE + AUTOREPEAT
  TASTI_A	   VAR Byte					'er verificare ...
  TASTI_SA	   VAR Byte					'er verificare ...
  TASTI_P	   VAR Byte					' TASTO PREMUTO
  TASTI_S	   VAR Byte					' Tasto premuto rirardato
  GIRO		   VAR Byte					'filtro sui tasti
  GIROX 	   VAR Byte					'
  C_DIAL	   VAR Byte					'
  DIAL_PUL	   VAR Byte					'
    Dim DIA_PUL   As DIAL_PUL.0		    ' =1 PULSANTI  =0 DIAL
    Dim OL_P_M    As DIAL_PUL.1		    ' =1 NEGATIVO  =0 POSITIVO
    Dim SPE_GES   As DIAL_PUL.2		    ' =1 SPECIALE  =0 NORMALE  DEI PULSANTI O DIAL
    

  Dim F_TASTI  As Byte				    ' Gestione tastiera
    Dim CAM_STA   As F_TASTI.0		    ' =1 Cambio stato passare per rilascio tasti
    Dim TAS_A_0   As F_TASTI.1		    ' =1 al rilascio tasti_a=0
    Dim GIR_X_0   As F_TASTI.2		    ' =1 non incrementare GIROX 
    Dim GIR_N_0   As F_TASTI.3		    ' =1 
	
   FREQ_RX      VAR Word				' valore frequenza ricezione
   FREQ_TX		VAR	Word				' valore frequenza trasmissione
                                        
   FRE_TMP		VAR Word				' temporanea per display 
   FRE_LNB		VAR Word				' valore frequenza osci. LNB
   LNB_ONF	VAR Byte				' 

   CH_MEM		VAR Byte				' puntatore alla memoria
   STATO		VAR	Byte				' in che funzione si è
   PAS			VAR	Byte                '1=125kHz, 2=250kHz,  4=500kHz, 8=1MHz

   FLAG_ER		VAR Byte				' REGISTRO FLAG VARIE
   CNT_PLL      VAR Byte                ' FILTRO PER IL PLL
 
   ADD_RX		VAR Byte				'indirizzo I2C di RX
   ADD_TX		VAR Byte				'indirizzo I2C di TX
   PORTX		VAR Byte				'Ausiliario per input A/B -N/W
   
   TEMP_1W		VAR Word				'Celle temporanea per calcolo
   TEMP_2W      VAR Word
   TEMP_1B		VAR Byte
   TEMP_2B		VAR Byte

   Dim SET_FRE[4] As Word			   ' ARRAY DI SETUP FABBRICA
     Dim  Rx_Min 	As SET_FRE#0				'frequenza RX min 
     Dim  Rx_Max 	As SET_FRE#1				'frequenza RX max
     Dim  Tx_Min 	As SET_FRE#2				'frequenza RX min 
     Dim  Tx_Max 	As SET_FRE#3				'frequenza RX max

   STA_MIX	VAR Byte					'
  
    Symbol CHP_GRX  =%11001110			' serve al TSA di RX
    Symbol CHP_GTX  =%11001110			' serve al TSA di TX
	
	Symbol CH_MAX	=9					' numero di memorie MAX
	Symbol MEDIA_FRE=(479.5*8)			'Valore media frequenza =479.500 MHZ
	Symbol FREQ_SCA=(2150*8)			'Valore dovo la media viene sottratta =2150 MHZ
	

	Symbol COLPI=45						' filtri
	Symbol COLP_S=50					'
	
	Symbol GIE INTCON.7					' Global Interrupt Enable 

'==========================================================
'**  Inizzializzazione dati e variabili
'==========================================================				
	           		                    'inizzializzo le celle eeprom	   
    EData 9920,9904,0,1                 'memorie RTX 0 " Tx Rx px lnb "
    EData 9920,9908,0,0                 'memorie RTX 1  
    EData 9920,9912,0,1                 'memorie RTX 2
    EData 9920,9916,0,0                 'memorie RTX 3
    EData 9920,9920,0,0                 'memorie RTX 4
    EData 9920,9924,0,1                 'memorie RTX 5
    EData 9920,9928,0,0                 'memorie RTX 6
    EData 9920,9932,0,0                 'memorie RTX 7
    EData 9920,9936,0,1                 'memorie RTX 8
    EData 9920,9940,0,0                 'memorie RTX 9
	
    EData 8000,9600,0,0                 'memorie RTX 10
    EData 8000,9600,0,0                 'memorie RTX 11
    EData 0,0,0,0,0,0,0,0               'da 72 --- 79
		
	EData 9400,$C6,$C0,1                'DA 80--84 LNB-RX-TX-DIAL
	EData 8,0,0                         'DA 85--87 PASSO,

	EData 6400							'88,89 RX min - HEX 58-59 (valore 800*8)
	EData 16800							'90,91 Rx max - HEX 5A-5B (valore 2100*8)

	EData 8000							'92,93 TX min  in HEX 5C-5D (valore 1000*8)
	EData 12000							'94,95 Tx max  in HEX8 5E-5F (valore 1500*8)
					
'==========================================================
'**  Inizzializzazione dati e variabili                  **
'==========================================================				

	GoTo  INIT	
	ON_INTERRUPT RD_DIAL	
'==========================================================
'** gestione interrup per il dial
'==========================================================				
;
RD_DIAL:                                ; Gestione a interrup dell'ecoder dial
	btfsc	PORTB,0                     ; ad ogni sull'ingresso del pulsante UP 
	GoTo	RD_DIAL1					; scatta l'interrup e eseguo questa routin

	btfss	PORTB,3		;
	bsf	C_DIAL,0
	btfsc	PORTB,3		;
	bsf	C_DIAL,1	;

RD_DIAL1:
	movlw	%00010000'	;
	movwf	INTCON		;
	Context Restore						' Restore the registers and exit the interrupt 

;=======================================================
'=======================================================				
INIT:   
   GIE = 0 								' Turn off global interrupts 
   ALL_DIGITAL =TRUE					' Uscite tutte digitali 
   TRISA=%01110000						' B'11110000 definisco i pin 
   TRISB=%00001111                      ' in e out
   OPTION_REG= %00000000                ' 
   INTCON=%00010000                     ' interrup RB0 Abilitato 

	PORTX=0								' sistemo_inizzializzo le variabili
	STATO=0								' STATO=0
	CH_MEM=0							'puntatore memorie =1
    STA_MIX=0                           ' 
    F_TASTI=1		                    '

	FREQ_RX   =ERead 0					'leggo la frequenza in memoria 0
	FREQ_TX   =ERead 2
	PORTX	  =ERead 4					'uscita portx ingresso A/B, banda N/W
	LNB_ONF =ERead 5					' stato LNB
	
	FRE_LNB   =ERead 80					'leggo la frequenza dell'LNB
	ADD_RX	  =ERead 82                 'indirizzo I2C del Chip PLL  SDA5055
	ADD_TX	  =ERead 83                 '
	DIAL_PUL  =ERead 84                 '
	PAS       =ERead 85    		    	' Recupero dalla memoria il passo

	Rx_Min  =ERead 88                   'frequenza RX min 
	Rx_Max  =ERead 90					'frequenza RX max

	Tx_Min =ERead 92					'frequenza TX min
	Tx_Max =ERead 94					'frequenza TX max
	
	GIE = 1 							' Turn on global interrupts 

'==========================================================
'**  Scritta di benser_vito
'==========================================================				

	GoSub I2C_TX						'Trasmissione IICbus TX
	GoSub SHIFT_TX                      'Trasmissione per shift register

	DelayMS 100                         ' ritardo
	GoSub LCD_INIZ                      ' inizzializzo LCD
	Print $FE,$01 :DelayMS 50           '
	Print $FE,$80, "Saluti da IW2KGH"	'scritta di benvenuto
	Print $FE,$C0, "ATV  SinSh V_21 "	'
    DelayMS 1800   	                	'Tiena la scritta visibile per x tempo	

	If VFO_TR=0 Then GoTo SETUP			' se premuto P1 vado in SETUP
	If CH_PAS=0 Then GoTo SETUP_P		' Se premuto P3 vado in SETUP_P frequenza min e max
	GoTo STATO_01						'
	
'=========================================================
'**  INIZIO PROGRAMMA *** 
'=========================================================				

MAIN_S:
    Set CAM_STA                         ' forzo cambio stato per rilascio tasti	

MAIN_X:									
    GoSub I2C_TX                        ' mando dati a trasmettitore
	GoSub LCD_PRINT						' Display informazioni                                 
    Print $FE,$C0                       ' mi posiziono sulla seconda riga per le info
    GoSub I2C_RX	                    ' mando dati a Ricevitore
	GoSub KEYB                          'Verifico se tasti premuti

'==========================================================
' Se premuto pulsante memoria Con dial varia le memorie             
'==========================================================				

    If (TASTI_P & $14)=0 Then GoTo MAIN_1
	If TASTI_L.0=1 Then GoSub CH_SALE    ' UP     - 
	If TASTI_L.1=1 Then GoSub CH_SCENDE  ' DOWN   -
    GoTo STATO_0X
    
MAIN_1:	
	Branch STATO,[STATO_0,STATO_1]	 	'Vado ad eseguire lo stato corrente
		
'==========================================================
' Varia freq di RX, Passo,...               -- FREQ RX --
'==========================================================				
STATO_0: 
    If DIAL_PUL.2=1 Then GoTo GES_SPE   ' se sono in condizione speciale vado a ..
	If TASTI_L.0=1 Then GoTo RX_SALE    ' UP     - 
	If TASTI_L.1=1 Then GoTo RX_SCENDE  ' DOWN   -

	If TASTI_A=8 Then GoTo STATO_11      'P1_ -rilasciandolo vado in stato TX

STATO_0X:
    If TASTI_A=16 Then Inc LNB_ONF       'P2_   -rilasciandolo sommo o no OL
	If TASTI_A=4 Then GoTo CAMBIO_PAS    'P3_   -cambio passo per variare la frequenza

	If TASTI_S=4 Then GoSub CH_SCENDE    'P3 -   mantenendolo premuto CAMBIO MEMORIA +
    If TASTI_S=16 Then GoSub CH_SALE     'P2 -   mantenendolo premuto CAMBIO MEMORIA -
	If TASTI_S=20 Then GoTo C_STORE      'P2_P3 - mantenendoli premuti  MEMORIZZO 
	If TASTI_L=20 Then Set TAS_A_0       'P2_P3 - setto di non agire sul rilascio tasti

    If TASTI_L=12 Then GoTo C_BANDA      'P1_P3   - premendoli vado CAMBIO N/W 
    If TASTI_L=24 Then GoTo C_INPUT      'P1_P2   - premendoli vado cambio A/B

 	If TASTI_P=28 Then GoTo STARTP       ' P1_P2_P3 - reset o restart

   If ADD_TX=$CA Then GoTo MAIN_X

    bcf DIAL_PUL,2                       '  verifico se sono in condizione
	If LNB_ONF.0=0 Then                  '  speciale cioè se sono senza OL (diretta)
      If TASTI_S=8 Then                  ' e con tasto P1 premuto se si setto per 
        If GIROX>90 Then                 ' comandi speciali.
          Set DIAL_PUL.2
          STATO=0
        EndIf
      EndIf
    EndIf
         
	GoTo MAIN_X                         ' rimango nello stesso stato

STATO_01:
	STATO=0                              'set stato che andrò ad eseguire
	GoTo MAIN_S                          '
'==========================================================
'**  Modifica la frequenza di TX,           -- FREQ TX --     
'==========================================================				
STATO_1: 	
	If TASTI_L.0=1 Then GoSub TX_SALE    'UP     -
	If TASTI_L.1=1 Then GoSub TX_SCENDE  'DOWN   - 

	If TASTI_A=8 Then GoTo STATO_01      'P1_ -rilasciandolo vado in stato Rx
    GoTo STATO_0X                        '

STATO_11:
        If ADD_TX=$CA Then GoTo MAIN_X
        STATO=1                           'set stato che andrò ad eseguire
		GoTo MAIN_S                       '	
'========================================================
'**  Modifica la frequenza di TX E DI rx CONTEMPORANEA      
'========================================================				
GES_SPE: 	
	If TASTI_L.0=1 Then GoSub TX_SALE     'UP     -  stato speciale gestione
	If TASTI_L.1=1 Then GoSub TX_SCENDE   'DOWN   - 
    FREQ_RX=FREQ_TX                       ' gestione di RX agganciata a TX
    GoTo STATO_0X                         '

'==========================================================
'**  visualizza,legge e memorie             -- MEMORIA -- 
'==========================================================
C_STORE:
        F_TASTI=F_TASTI | %00000010       ' Azzero TASTI_A
    If GIROX < 100 Then GoTo MAIN_X       ' se i pulsanti sono premuti per piu di
        Print $FE,$C0," Store Eseguito "  ' all'ora eseguo lo store e
        GoSub STORE                       ' metto in memoria corrente i dati

C_STORE_1:
		GoSub KEYB                        ' Verifico se tasti premuti
        If TASTI_P<>0 Then GoTo C_STORE_1 ' se tasti rilasciati esco
        GoTo MAIN_X                       ' se premuti rimango
				
'==========================================================
'**  Cambio parametri     A/B       -- SET -- 
'========================================================== 
C_INPUT:
        PORTX=PORTX ^ $80                ' giro il bit che sceglie input
        F_TASTI=F_TASTI | %00000110      ' Azzero TASTI_A - GIROX
        GoTo MAIN_X                      '

'==========================================================
'**  Cambio parametri     N/W     -- SET -- 
'==========================================================
C_BANDA:
        PORTX=PORTX ^ $01                ' giro il bit che sceglie la banda
        F_TASTI=F_TASTI | %00000110      ' Azzero TASTI_A - GIROX
        GoTo MAIN_X                      '

'==========================================================
'** Fase di setup iniziale per LNB e....
'==========================================================	
SETUP:
       Set CAM_STA                       '
SETUP1:
	   Print $FE,$C0                     '
	   Print "R",HEX ADD_RX," "          '
       Print "T",HEX ADD_TX," "             'serve per impostare i parametri
	   Print "OL"                        ',DEC FRE_LNB," "		 

       If DIAL_PUL.1=0 Then Print "+":Else :Print "-" '

       TEMP_1W=FRE_LNB:GoSub DISPLA      '
	   Print $FE,$80,"Fun "              '

	   If DIAL_PUL.0=1 Then               ' sistemata visualizzazione DIAL-PULS
          Print "DIAL "                   ' anche con OL- guardando il bit 
       Else                               ' e non se > o = al valore 0
          Print "PULS "                   '
       EndIf                              '
         	   
		GoSub KEYB                       'Verifico se tasti premuti
        TEMP_1B=1
		If TASTI_P.4=1 Then TEMP_1B=20   '
		If TASTI_L.0=1 Then FRE_LNB=FRE_LNB+TEMP_1B  	  'DOWN   -
		If TASTI_L.1=1 Then FRE_LNB=FRE_LNB-TEMP_1B 	  'UP     -

		If TASTI_A=8 Then GoTo LNB_MEMx	                  'P1_ -
		If TASTI_A=16 Then GoSub RX_ADD	                  'P2_   -
		If TASTI_A=4 Then GoSub TX_ADD	                  'P3_ -

		If TASTI_L=20 Then DIAL_PUL=DIAL_PUL^$01	      'P2-P3 -

        If TASTI_S=4 Then
        DIAL_PUL=DIAL_PUL^$02                             'P2_   -rilasciandolo cambio memoria
        F_TASTI=F_TASTI | %00000110                       ' Azzero TASTI_A - GIROX
        EndIf

		PAUSE 10
	    GoTo SETUP1

LNB_MEMx:
		If ADD_RX=ADD_TX Then GoTo SETUP1                 ' controllo su I2Cbus che siano
		If ADD_RX=$C2 Then 
          If ADD_TX<$C8 Then GoTo SETUP1                 ' controllo su I2Cbus che siano
        EndIf 
         GoTo LNB_MEM	                                  ' diversi altrimenti non esco


RX_ADD:
	  ADD_RX=ADD_RX+2
;      IF ADD_RX=$C4 THEN ADD_RX=$C6        ' solo RC0 RC2 RC6
      If ADD_RX>$C6 Then ADD_RX=$C0        ' solo RC0 RC2 RC4 RC6
	  Return
TX_ADD:
	  ADD_TX=ADD_TX+2:If ADD_TX=$C2 Then ADD_TX=$C6        ' ruoto fra TC0-TC6-TC8-TCA
      If ADD_TX>$CA Then ADD_TX=$C0                        '
	  Return

'==========================================================
'** Fase di setup valori minimi e massimi ...
'==========================================================
SETUP_P:
       GoSub KEYB                                   'Verifico se tasti premuti
	   Print $FE,$80
	   Print "RX_ ",Dec Rx_Min,"  ",Dec Rx_Max,"  "
	   Print $FE,$C0
	   Print "TX_ ",Dec Tx_Min,"  ",Dec Tx_Max,"  "

      If STA_MIX>3 Then STA_MIX=0
	  If STA_MIX=0 Then TEMP_2B=$88
	  If STA_MIX=1 Then TEMP_2B=$8F
	  If STA_MIX=2 Then TEMP_2B=$C8
	  If STA_MIX=3 Then TEMP_2B=$CF
	  Print $FE,TEMP_2B,"*"

        TEMP_1B=8
		If TASTI_P.4=1 Then TEMP_1B=80
		If TASTI_L.0=1 Then GoSub INCRE               'DOWN   -
		If TASTI_L.1=1 Then GoSub DECRE 			    'UP     -
		If TASTI_L.2=1 Then Inc STA_MIX:				'P3_ -
		If TASTI_L.3=1 Then GoTo STO_MIX				'P1_ -

		DelayMS 30
	    GoTo SETUP_P
INCRE:
    SET_FRE[STA_MIX]=SET_FRE[STA_MIX]+ TEMP_1B 
	Return

DECRE:
    SET_FRE[STA_MIX]=SET_FRE[STA_MIX]- TEMP_1B 
	Return
		
STO_MIX:
        EWrite 88,[Rx_Min]		   					'frequenza RX min 
		EWrite 90,[Rx_Max]							'frequenza RX max
                                                    
		EWrite 92,[Tx_Min]							'frequenza TX min
		EWrite 94,[Tx_Max]							'frequenza TX max
		GoTo STATO_01
'==========================================================
'** Varia la frequenza TX da inviare al PLL
'==========================================================
	  
RX_SALE:                                            '** AUMENTO DELLA FREQUENZA RX 
      If DIAL_PUL.1=1 Then 
        If LNB_ONF.0=1 Then GoTo RX_SCENDE_1
      EndIf

RX_SALE_1:                                            '** AUMENTO DELLA FREQUENZA RX 
		FREQ_RX=FREQ_RX+PAS							'di 1 PASSO ( quello impostato )
        If FREQ_RX>Rx_Max Then FREQ_RX=Rx_Min
		GoTo MAIN_X
		
RX_SCENDE:                                          '** DIMINUZIONE DELLA FREQUENZA RX 
      If DIAL_PUL.1=1 Then
        If LNB_ONF.0=1 Then GoTo RX_SALE_1
      EndIf

RX_SCENDE_1:
		FREQ_RX=FREQ_RX-PAS							'di 1 PASSO ( quello impostato )    
		If FREQ_RX<Rx_Min Then FREQ_RX=Rx_Max
		GoTo MAIN_X

'==========================================================
'** Varia la frequenza TX da inviare al PLL
'==========================================================
		
TX_SALE:											'** AUMENTO DELLA FREQUENZA TX 
		FREQ_TX=FREQ_TX+PAS							'di 1 PASSO ( quello impostato )
        If FREQ_TX>Tx_Max Then FREQ_TX=Tx_Min
		Return
		
TX_SCENDE:                                          '** DIMINUZIONE DELLA FREQUENZA TX 
		FREQ_TX=FREQ_TX-PAS							'di 1 PASSO ( quello impostato )     
		If FREQ_TX<Tx_Min Then FREQ_TX=Tx_Max
		Return
		
''==========================================================
'** Varia il puntatore alla memoria dove Wr o Rd
'==========================================================

CH_SALE:                                            'Inc puntatore alla memoria
'    	set CAMBIOSTATO.0							'per azzerare le variabili dei tasti
        Set CAM_STA

		Inc CH_MEM
        If CH_MEM >9 Then CH_MEM=0
        GoTo RECALL
		
CH_SCENDE:                                          'Dec puntatore alla memoria
'    	set CAMBIOSTATO.0							'per azzerare le variabili dei tasti
        Set CAM_STA
		Dec CH_MEM
		If CH_MEM>10 Then CH_MEM=9
        GoTo RECALL

'==========================================================
'** CAMBIO DEL PASSO da sommare alla frequenza
'==========================================================	
CAMBIO_PAS:                                         ' Cambio il passo da sommare
		PAS = PAS*2									' alla frequenza
		If PAS>80 Then PAS=2
		If PAS>8 Then PAS=80
		GoTo MAIN_X
		
'==========================================================
'***      Print info sul DISPLAY 
'==========================================================
		
LCD_PRINT:
LCD_RIG_1:
	FRE_TMP=FREQ_RX									'Preparo la freq di RX per DSP
	TEMP_1W=(FRE_TMP/8)

	If LNB_ONF.0=1 Then
      If DIAL_PUL.1=0 Then 
        TEMP_1W=TEMP_1W+FRE_LNB                     'Sommo  LNB + frequ
       Else	
       TEMP_1W=FRE_LNB-TEMP_1W
       EndIf					                    'Sottraggo LNB - frequ
	EndIf
		
	Print $FE,$80,"R",Dec CH_MEM
	If STATO=0 Then Print "*" :Else :Print " "		' asterisco in funzione di..
	GoSub DISPLA
	GoSub DISPLA_1
					
    If FLAG_ER.4=1 Then 
      Print " ? "
    ElseIf FLAG_ER.5=1 Then 
      Print " ! "
	Else 
      Print "Mh "   
     EndIf
	
LCD_RIG_11:	
	If PORTX.7=0 Then Print "A":Else :Print "B"		' Ingresso A - B
	If PORTX.0=0 Then Print "N":Else :Print "W"		' Banda N=stretta o W=larga

'========================================================
LCD_RIG_2:
    Print $FE,$C0
 	FRE_TMP=FREQ_TX									'Preparo la freq di TX per DSP
	TEMP_1W=(FRE_TMP/8)
    
   If ADD_TX=$CA Then GoTo SOLO_RX
	Print "T",Dec CH_MEM
	If STATO=1 Then 
       Print "*" 
     ElseIf DIAL_PUL.2=1 Then 
        Print "*"
     Else 
        Print " "
     EndIf
 
	GoSub DISPLA
	GoSub DISPLA_1

    If FLAG_ER.0=1 Then Print " ?":Else :Print "Mh"   
    If FLAG_ER.1=1 Then Print "!":Else :Print " "

LCD_RIG_21:
	If PAS=2 Then Print ".2"
	If PAS=4 Then Print ".5"
	If PAS=8 Then Print " 1"
	If PAS=80 Then Print "10"

'==========================================================
LCD_RIG_3:

    Return

    Print $FE,$94
    Print " ",HEX2 TASTI_P," ",HEX2 TASTI_L," ",HEX2 TASTI_S," ",HEX2 GIROX
	Return	
'==========================================================    
'==========================================================
SOLO_RX:
    Print "Set "
    If TASTI_P.3=0 Then
       Print "  OL   SP "
    Else
       Print " A/B  N/W "
    EndIf      
    GoTo LCD_RIG_21
'==========================================================    
DISPLA:
	   	If TEMP_1W<1000 Then Print " "
		If TEMP_1W<10000 Then Print " "
		Print Dec TEMP_1W
		Print ".",
		Return
		
DISPLA_1:		
		TEMP_1W=(((FRE_TMP//8)/2)*25)
		If TEMP_1W>0 Then Print Dec TEMP_1W,
		If TEMP_1W=0 Then Print "00",
		Return

'==========================================================
'***      MEMORIZZA E LEGGE DALLA EEPROM 
'==========================================================
STORE:
	    GoSub PUNT_AD		
	    EWrite TEMP_2B,[FREQ_RX,FREQ_TX,PORTX,LNB_ONF]   'Frequenza in EEPROM indirizzo X
		EWrite 85,[PAS]							         ' memorizzo il passo

RECALL:
        Set TAS_A_0                                       '
	    GoSub PUNT_AD                                     '
	    FREQ_RX = ERead TEMP_2B						      'Leggo la frequenza in EEPROM
		FREQ_TX = ERead (TEMP_2B+2)                       ' e i vari parametri
		PORTX= ERead (TEMP_2B+4)                          '
		LNB_ONF = ERead (TEMP_2B+5)
		Return

PUNT_AD:
		TEMP_2B=(CH_MEM*6)                               ' calcolo il puntatore alla memoria 
		Return                                           ' corrente e lo metto in TEMP_2B

LNB_MEM:                                                 ' Store in EEprom dei dati impostati
		EWrite 80,[FRE_LNB]								 ' frequenza LNB,
		EWrite 82,[ADD_RX]								 ' indirizzo del ricevitore IC2
		EWrite 83,[ADD_TX]								 ' indirizzo del trasmettitore IC2
		EWrite 84,[DIAL_PUL]							 ' variabile se in uso DIAL o PULSANTI
		GoTo STATO_01

'==========================================================
'***    Tasmissione IIC al tuner o PLL 
'==========================================================
TRA_IIC:
I2C_RX:
	FLAG_ER=FLAG_ER & $0F
	BusIn ADD_RX,[TEMP_2B]								 ' Lettura per il PLL
	If PP4.0=1 Then Set FLAG_ER.4:GoTo I2C_RX1			 ' Non è stato ricevuto ACK
	If TEMP_2B.6=0 Then Set FLAG_ER.5  					 ' Verifica se PLL agganciato
I2C_RX1:		
    If FREQ_RX > FREQ_SCA Then                           ' se la frequenza è > di 2150 
       TEMP_1W=FREQ_RX-MEDIA_FRE                         ' sottraggo la media frequenza
    Else
       TEMP_1W=FREQ_RX+MEDIA_FRE                         ' se <  somma la media frequenza 
   	EndIf
       				 		  
	BusOut ADD_RX,[TEMP_1W,CHP_GRX,PORTX]   			 ' trasmettere al PLL del tuner di RX
	BStop
	Return
;=========================================================
I2C_TX:
	FLAG_ER=FLAG_ER & $F0

    If ADD_TX=$CA Then Return                            ' Sistema senza trasmettitore
    If ADD_TX=$C8 Then GoTo SHIFT_TX                     ' Sistema TX con PLL parallelo Shift 

	BusIn ADD_TX,[TEMP_2B]							 	 ' Lettura per il PLL TX
	If PP4.0=1 Then Set FLAG_ER.0:Clear CNT_PLL		   	 ' Non è stato ricevuto ACK
	If TEMP_2B.6=0 Then	Inc CNT_PLL:Else :Clear CNT_PLL   ' Verifica se PLL agganciato
    If CNT_PLL>20 Then Set FLAG_ER.1: Dec CNT_PLL        ' 					 
	
	TEMP_1W=FREQ_TX		  							   	 ' Trasmissione dati al PLL 
	BusOut ADD_TX,[TEMP_1W,CHP_GTX,PORTX]				 ' per TX
'I2C_TX1: 
   Set PLLOK	
   BStop
   Return
;==========================================================
;==========================================================
SHIFT_TX:
   BStop
   PORTA.0=1                                            '
   TRISA=%01110000										 ;B'01110000
    					 
    TEMP_1W=0   

    btfsc FREQ_TX,4        ' .... .... ...X ....
	bsf   TEMP_1W,0        ' .... .... .... ...X

    btfsc FREQ_TX,5        ' .... .... ..X. ....
	bsf   TEMP_1W,1        ' .... .... .... ..X.
	
    btfsc FREQ_TX,6        ' .... .... .X.. ....
	bsf   TEMP_1W,2        ' .... .... .... .X..
	
    btfsc FREQ_TX,7        ' .... .... X... ....
	bsf   TEMP_1W,3        ' .... .... .... X...
	
    btfsc FREQ_TXH,0       ' .... ...X .... ....
	bsf   TEMP_1W,4        ' .... .... ...X ....
	
    btfsc FREQ_TXH,1       ' .... ..X. .... ....
	bsf   TEMP_1W,5        ' .... .... ..X. ....
	
    btfsc FREQ_TXH,2       ' .... .X.. .... ....
	bsf   TEMP_1W,6        ' .... .... .X.. ....
	
    btfsc FREQ_TXH,3       ' .... X... .... ....
	bsf   TEMP_1W,7        ' .... .... X... ....
	
    btfsc FREQ_TX,2        ' .... .... .... .X..
	bsf   TEMP_1WH,0       ' .... ...X .... ....

    btfsc FREQ_TX,3        ' .... .... .... ..X.
	bsf   TEMP_1WH,1       ' .... ..X. .... ....

    For TEMP_1B=1 To 16 Then
      PORTA.1=0
      rlf TEMP_1W,1
      rlf TEMP_1WH,1
      btfsc STATUS,0
      bsf PORTA.0
      btfss STATUS,0
      bcf PORTA.0
      PORTA.1=1
    Next TEMP_1B  
  
    PORTA.7=0
    DelayUS 12
    PORTA.7=1

   BStop
   Return

'==========================================================
'Lettura tasti con filtro e auto_repeat
'==========================================================
KEYB:
    DelayMS 5
	TASTI_L=0                             				    ' lettura dei TASTI ed in funzione
	If DIAL_PUL.0=0 Then 				 					'Funzione DIAL se scelto
    	If UP=0 Then SetBit TASTI_L,0					    ' di quale tasto è premuto setto il
	    If DOWN=0 Then SetBit TASTI_L,1						' bit corrispondente nella variabile TASTI_L
	EndIf  
	If CH_PAS=0 Then SetBit TASTI_L,2
	If VFO_TR=0 Then SetBit TASTI_L,3
	If MEMO=0 Then SetBit TASTI_L,4
	
	If CAM_STA=1 Then GIRO=0:GIROX=0:TASTI_P=0	            'Se è cambiato stato devo passare per
	TASTI_A=0
    If TASTI_L = 0 Then                                     'rilascio dei tasti e azzero i filtri giro
      GIRO=0:GIROX=0
	   If TAS_A_0=1 Then TASTI_SA=0		                    'Se è cambiato stato devo passare per
      F_TASTI= %00000000
      TASTI_A=TASTI_SA
      TASTI_SA=0
    EndIf			 
	If GIR_X_0=1 Then GIROX=0		                        'Se è cambiato stato devo passare per

KEYB_1:	
	If TASTI_L <> TASTI_P Then GIRO=0:GIROX=0      		     ' controllo dei tasti premuti
	TASTI_P = TASTI_L : TASTI_L = 0:TASTI_S=0			     ' e viene applicato il filtro
	Inc GIRO
    Inc GIROX   			  					         ' antirimbalzo, inoltre se mantenuto premuto
  	If GIRO = 3 Then TASTI_L =TASTI_P                   ' per un certo tempo inizia l'autorepeat
  	If GIRO > 3 Then TASTI_SA =TASTI_P                   ' per un certo tempo inizia l'autorepeat
  	If GIRO >COLPI Then TASTI_L =TASTI_P
  	If GIROX >COLP_S Then TASTI_S =TASTI_P
	If GIRO > COLPI Then GIRO=COLPI-1
	If GIROX > 250 Then GIROX=250

KEYB_2:
  If DIAL_PUL.0=1 Then                          'Funzione DIAL se scelto l'interrup
   TASTI_L=TASTI_L & %11111100                  ' setta la variabile C_DIAL e in funzione
   If C_DIAL=1 Then SetBit TASTI_L,0            ' di questo decido di simulare la pressione
   If C_DIAL=2 Then SetBit TASTI_L,1            '  sul tasto corrispondente INC o DEC
   C_DIAL=0                                     ' resetto la variabile per L'interrup
  EndIf  
   Return
'==========================================================
' Reset del LCD 
'==========================================================
LCD_INIZ:
	 Print $FE,$00                                       ' Tentativo di reset del Display
	 Print $FE,$20										 ' mandando i comandi di funzionamento
	 Print $FE,$28										 ' con 4 fili o bit inoltre
	 
	 Print $FE,$0C										 ' display on, cursore bloc,BLINK
	 Print $FE,$06										 ' display incremento, SHIFT "I/D-S"
	 Print $FE,$14										 ' cursor schift
	 Return

'==========================================================

End
' FINE  ------------------------------------
