'=============================================================================
' ** 21-11-2006 SinSh v_4.x
' FIRMWARE per TRX ATV 
'=============================================================================
'SinSh_40 oggi 15-01-07
'    Il pin_15 RA6, è stato invertito rispetto alla versione 4.0 ora,
'    uscita =1 quando con OL inserito
'    uscita =0 quando con OL è escluso
'    questo serve per pilotare un relè tramite un transistor, che mette o 
'    toglie la tensione al LNB. 
'
'SinSh_40 oggi 15-12-06
'    Sul pin 18 i2scl con OL inserito o  Sul pin 1  con OL disinserito "DIRETTA"
'    viene misurato il livello di tensione e visualizzato sostituendolo a Mhz, 
'    oppure sulla seconda riga quando non si è in variazione dei parametri TX
'    utilizzato un circuito adattatore connesso al segnale AGC si realizza uno 
'    smiter con indicazione reletiva al segnale ricevuto in RX. 
'    Per visualizzare o spegnere lo smiter sulla riga 2, pigiare brevemente e
'    contemporaneamente P2-P3.
'
'    Il pin_15 RA6, da un'uscita per pilotare un relè direttamente.
'    uscita =0 quando con OL inserito
'    uscita =1 quando con OL è escluso
'    questo serve per pilotare un relè che mette o toglie la tensione al LNB. 
'
'SinSh_31 oggi 1-09-06
'    Visualizzazione della frequenza di trasmissione x1 / x2 / x3 /x4, in funzione
'    di quanto impostato nel SETUP.  Serve per chi utilizza un duplicatore o xx per
'    trasmettere in particolare per i sistemi ripetitori 
'
'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 indirizzo 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 lo scambio automatico, 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
'=============================================================================
' ** 21-6-2006 
'
'                          --------------
'      Lcd RS  RA2 --< >  |1           18|  < >-- RA1  I2C clock
'      Lcd EN  RA3 --< >  |2           17|  < >-- RA0  I2C data
'    puls VFO  RA4 --< >  |3           16|  < >-- RA7  PL shift register   
'              RA5 ---->  |4           15|  < >-- RA6  OLDIR  =1 OL inserito
'              Vss ---->  |5           14|  <---- Vdd  
'    puls DOWN RB0 --< >  |6           13|  < >-- RB7  lcd_dat
'    puls MEMO RB1 --< >  |7           12|  < >-- RB6  lcd_dat 
'    puls PASS RB2 --< >  |8           11|  < >-- RB5  lcd dat
'    puls  UP  RB3 --< >  |9           10|  < >-- RB4  lcd_dat
'                         --------------
'
'=============================================================================
'=============================================================================

STARTP:	
	Device	16F628
	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 Open-collettor
	Declare SCL_PIN PORTA.1             ' 
    Declare BUS_SCL On                  ' dichiaro che SCL lavori in Push-Pull 

    Symbol SDA PORTA.0
 

	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
	                                    
    OLDIR	 VAR	PORTA.6				' Uscita per pilotare Vcc LNB
	

' ** 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					'

  Dim X As Byte					'
  Dim SIG As Byte					'
  Dim ST_BAR As 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  (PUL O DIAL)

    Dim F_TX_2    As DIAL_PUL.4		'XXX    ' =1 display frequenza TX x 2
    Dim F_TX_4    As DIAL_PUL.5		'XXX    ' =1 display frequenza TX x 4
    

  Dim F_TASTI  As Byte				    ' Gestione tastiera
    Dim CAM_STA   As F_TASTI.0		    ' =1 Cambio stato fare 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
   Dim TX_LCD   As Byte            'XXX ' cella per valore di TX a display   

   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)			'soglia se sommare o sottrarre la media
	

	Symbol COLPI=45						' filtri
	Symbol COLP_S=50					'
	
    Symbol C2OUT = CMCON.7              ' Comparator 2 output
	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,1,0                         'DA 85--87 PASSO,TX_LCD

	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 HEX 5C-5D (valore 1000*8)
	EData 12000							'94,95 Tx max HEX 5E-5F (valore 1500*8)
					
'==========================================================
'**  Inizzializzazione dati e variabili                  **
'==========================================================				

	GoTo  INIT	
	ON_INTERRUPT RD_DIAL	
'==========================================================
'** gestione interrup per il dial
'==========================================================				
	GoTo  INIT	'XXX
	ON_INTERRUPT RD_DIAL	'XXX
'==========================================================
'** 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=%00110000						' B'11110000 definisco i pin 
   TRISB=%00001111                      ' in e out
   OPTION_REG= %00000000                ' 
   INTCON=%00010000                     ' interrup RB0 Abilitato 

	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
	TX_LCD    =ERead 86    'XXX		    ' ###1 Visualizzo il valore di tx per x
    ST_BAR    =ERead 87    'xxx         ' sitiazione display barre

	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
    Print $FE,$01 :DelayMS 50           '

    Print $FE,64,$00,$00,$1F,$1F,$1F,$1F,$00,$00 ' sono 8 caratteri add 0

	Print $FE,$80, "Saluti da IW2KGH"	'scritta di benvenuto
	Print $FE,$C0, "ATV SinSh V 4.1 "	'
    DelayMS 1800   	                	'Tiena la scritta visibile per x tempo	

	If VFO_TR=0 Then GoTo SETUP			' premuto P1 vado in SETUP
	If CH_PAS=0 Then GoTo SETUP_P		' premuto P3 vado in SETUP_P 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                       ' posiziono  seconda riga per le info
    GoSub I2C_RX	                    ' mando dati a Ricevitore
	GoSub KEYB                          'Verifico se tasti premuti
	GoSub SMITER                        '

'==========================================================
' 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 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 freq.

	If TASTI_S=4 Then GoSub CH_SCENDE    'P3 -   mantenendolo premuto MEMORIA +
    If TASTI_S=16 Then GoSub CH_SALE     'P2 -   mantenendolo premuto 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  set non agire su rilascio tasti
       Inc ST_BAR                        ' per il display a barre
    EndIf

    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è senza OL (diretta)
      If TASTI_S=8 Then                  ' e con tasto P1 premuto 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 pulsanti 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 "              '
	   Print $FE,$80,"Tx",DEC1 TX_LCD," " '###1

	   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                    'P3_  
        F_TASTI=F_TASTI | %00000110              ' Azzero TASTI_A - GIROX
        EndIf

        If TASTI_S=16 Then               'XXX        '###1
        TX_LCD=TX_LCD & %00000011        'XXX        'P2
        Inc TX_LCD                        'XXX       '
        F_TASTI=F_TASTI | %00000110       'XXX       ' Azzero TASTI_A - GIROX
        EndIf                             'XXX

		DelayMS 10
	    GoTo SETUP1

LNB_MEMx:
		If ADD_RX=ADD_TX Then GoTo SETUP1        ' controllo 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>$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,"  "


      TEMP_2B=$88
      STA_MIX = STA_MIX & %00000011
      If STA_MIX.0=1 Then TEMP_2B=TEMP_2B + $07
      If STA_MIX.1=1 Then TEMP_2B=TEMP_2B + $40

	  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  FREQUENZA RX 
      If DIAL_PUL.1=1 Then 
        If LNB_ONF.0=1 Then GoTo RX_SCENDE_1
      EndIf

RX_SALE_1:                                          
		FREQ_RX=FREQ_RX+PAS							'di 1 PASSO ( impostato )
        If FREQ_RX>Rx_Max Then FREQ_RX=Rx_Min
		GoTo MAIN_X
		
RX_SCENDE:                                          '* DIMINUZIONE 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 ( 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  FREQUENZA TX 
		FREQ_TX=FREQ_TX+PAS							'di 1 PASSO ( impostato )
        If FREQ_TX>Tx_Max Then FREQ_TX=Tx_Min
		Return
		
TX_SCENDE:                                          ' DIMINUISCE  FREQUENZA TX 
		FREQ_TX=FREQ_TX-PAS							'di 1 PASSO ( 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 CAM_STA                          'per azzerare le variabile tasti

		Inc CH_MEM
        If CH_MEM >9 Then CH_MEM=0
        GoTo RECALL
		
CH_SCENDE:                                   'Dec puntatore alla memoria
        Set CAM_STA                          'per azzerare le variabile tasti
		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 / 2                       'Preparo la freq di RX per DSP
	TEMP_1W=(FRE_TMP/4)

	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 "s",DEC2 SIG  
'      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 / 2                      'Preparo la freq di TX per DSP

    FRE_TMP = FRE_TMP * TX_LCD               '###1
	TEMP_1W=(FRE_TMP/4)

    If STATO=0 Then
    If ST_BAR.0=1 Then  GoTo BARRE
    EndIf  
    
   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=1 Then Print ".1"
	If PAS=2 Then Print ".2"
	If PAS=4 Then Print ".5"
	If PAS=8 Then Print " 1"
	If PAS=80 Then Print "10"
	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_1B=00
		If FRE_TMP.0=1 Then TEMP_1B=TEMP_1B + 25
		If FRE_TMP.1=1 Then TEMP_1B=TEMP_1B + 50
  
    	If TEMP_1B>0 Then Print DEC2 TEMP_1B,
		If TEMP_1B=0 Then Print "00",
		Return

'==========================================================
'***      MEMORIZZA E LEGGE DALLA EEPROM 
'==========================================================
STORE:
	    GoSub PUNT_AD                                    ' set alla memopria 		
	    EWrite TEMP_2B,[FREQ_RX,FREQ_TX,PORTX,LNB_ONF]   ' store dati in EEPROM
		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)                       ' puntatore alla memoria 
		Return                                   ' corrente metto in TEMP_2B

LNB_MEM:                                         ' Store in EEprom dei dati
		EWrite 80,[FRE_LNB]						 ' frequenza LNB,
		EWrite 82,[ADD_RX]						 ' indirizzo ricevitore IC2
		EWrite 83,[ADD_TX]                       ' indirizzo trasmettitore IC2
		EWrite 84,[DIAL_PUL]					 ' variabile se DIAL o PULSANTI
		EWrite 86,[TX_LCD]                       ' valore per Tx per il display
		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 < sommo media frequenza 
   	EndIf
       				 		  
	BusOut ADD_RX,[TEMP_1W,CHP_GRX,PORTX]      ' trasmettere al 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 PLL parallelo Shift 

	BusIn ADD_TX,[TEMP_2B]                 ' Lettura per il PLL TX
	If PP4.0=1 Then                        ' Non è stato ricevuto ACK
      Set FLAG_ER.0                        ' set BUS error per LCD
      Clear CNT_PLL	                       ' azzero contatore filtro
    EndIf
    
	If TEMP_2B.6=0 Then                    ' se PLL non agganciato
      Inc CNT_PLL                          ' incremento contatore filtro
    Else                                   ' 
      Clear CNT_PLL                        ' se agganciato azzero contatore 
    EndIf                                  '
 
    If CNT_PLL>20 Then Set FLAG_ER.1       ' per accendere il ! su display
    
'-------------------------------------------
    
    BusOut ADD_TX,[FREQ_TX,CHP_GTX,PORTX]		' Trasmissione dati al PLL 
    BStop                                       ' per TX
    Return

;==========================================================
SHIFT_TX:
   BStop
   TRISA=%01110000		   ' serve per mettere in push pull l'I2cbus
   PORTA.0=1               ' preparo i 16 bit seriali per il PLL
   TEMP_1W=0               ' li memorizzo in TEMP_1W leggendoli da freq tx

    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     ' routin che invia i 16 bit del registro
      PORTA.1=0                  ' TEMP_1W sull'uscita: 
      rlf TEMP_1W,1              ' 
      rlf TEMP_1WH,1             ' PORTA_0 è il DATO
      btfsc STATUS,0             ' PORTA_1 è il CLOK per leggere il dato
      bsf PORTA.0                '
      btfss STATUS,0             '
      bcf PORTA.0                '
      PORTA.1=1                  '
    Next TEMP_1B  
                                 '
    PORTA.7=0                    ' PORTA_7 è lo STROBE per cattarare i dati
    DelayUS 12                   ' alla fine dei 16 bit inviati con i 16 clok
    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 simula
    	If UP=0 Then SetBit TASTI_L,0         ' il quale tasto premuto setto il
	    If DOWN=0 Then SetBit TASTI_L,1		  ' bit 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 
	TASTI_A=0                                  ' passare per rilascio dei tasti
    If TASTI_L = 0 Then                        ' e azzero i filtri giro
      GIRO=0:GIROX=0
	   If TAS_A_0=1 Then TASTI_SA=0		       '  
      F_TASTI= %00000000                       ' 
      TASTI_A=TASTI_SA
      TASTI_SA=0
    EndIf			 
	If GIR_X_0=1 Then GIROX=0		           '

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 
  	If GIRO = 3 Then TASTI_L =TASTI_P          ' mantenuto premutoper un certo
  	If GIRO > 3 Then TASTI_SA =TASTI_P         ' 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 l'interrup setta
   TASTI_L=TASTI_L & %11111100         ' la variabile C_DIAL e si
   If C_DIAL=1 Then SetBit TASTI_L,0   ' simula la pressione del tasto
   If C_DIAL=2 Then SetBit TASTI_L,1   ' corrispondente INC o DEC
   C_DIAL=0                            ' reset variabile per interrup
  EndIf  
   Return

'==========================================================
SMITER:
 If LNB_ONF.0=1 Then
  CMCON=2                              '
  OLDIR=1                              ' serve per pilotare rele  Vcc LNB
  Else                                 '
  CMCON=10                             '
  OLDIR=0                              '
  EndIf                                '
                                       ' 
  TRISA=%00110110                      '  definisco i pin 
  For X=0 To 15
    VRCON= %10000000 + X               ' da 1,25Vcc a 3,75Vcc
    SIG=X
    DelayMS 1
    If C2OUT=1 Then
      GoTo SMITER_1
    EndIf
  Next X

SMITER_1:
  VRCON= %00000000
  CMCON=7
  TRISA=%00110000                      ' B'11110000 definisco i pin 
  Return

BARRE:
    Print "S"
  For X=1 To SIG
    Print $00
  Next
  For X=SIG To 16
    Print " "
  Next
  Return  

  
'SALUTO_1: CDATA $FE,$80,"Saluti da IW2KGH" ,0
'SALUTO_2: CData $FE,$C0,"ATV  SinSh V_31 " ,0
'STORE_1:  CData $FE,$C0," Store Eseguito " ,0
'==========================================================
End
' FINE  ------------------------------------
