; Version 1.0 - Source Parallax - Cs3 UHF version packet
; Programme de pilotage d'un synthétiseur NJ8822
;
; Utilisant un pic16f84, pas de 12.5Khz avec oscillateur de référence 6.4Mhz.
; (En fait l'oscillateur 12.8Mhz est divisé par deux sur la carte HF)
; Fref = 12.5KHz (fréquence de boucle)
; diviseur par 64 'SP8718'
; fi à 45Mhz, battement infradyne.
;
; 'R' sur 11 bits = Fosc /(2 x Fcomp) = 6400/(2x12.5) = 512
; Changement de fréquence avec 'M' (10bits) et 'A'(7bits)
; oscillateur du pic par un circuit rc.
;
; 8 canaux avec sélection via 4 cavaliers, la prise en compte du canal se fait
; à la mise sous tension du pic.
; Le passage en émission est dépendant du verrouillage du Pll pour éviter les splatters. (cmd_em)
;
; A compiler avec SPASM.EXE taper : 'spasm cs3pkt70.src'
;
; Ce fichier est volontairement commenté.
; 73 de Laurent - f5soh@bigfoot.com - http://f5soh.free.fr/ - 21 novembre 2000 -
; 
; * Bugs dans la boucle Tx / erreur sur référence - 11 juin 2001 - F5IX/F5SOH
;-------------------------------------------------------------------------
;  D   C   B   A       	Qrg tx       Qrg Rx
;----------------------------------------------------------
;  0   0   0   0      	432.675	     432.675   ; voie simplex UHF @ F5KBS
;  0   0   0   1      	430.400	     439.800
;  0   0   1   0      	430.425	     439.825
;  0   0   1   1      	430.450      439.850
;  0   1   0   0      	430.475      439.875   ; pas de 430.500 / 439.900 (voie uhf de La Reole)
;  0   1   0   1      	430.525      439.925
;  0   1   1   0      	430.550      439.950
;  0   1   1   1      	430.575      439.975
;----------------------------------------------------------
;  1   0   0   0      	439.800      430.400
;  1   0   0   1      	439.825      430.425
;  1   0   1   0      	439.850      430.450
;  1   0   1   1     	439.875      430.475    ; pas de 439.900 / 430.500 (voie uhf de La Reole)
;  1   1   0   0      	439.925      430.525
;  1   1   0   1      	439.950      430.550
;  1   1   1   0      	439.975      430.575
;  1   1   1   1      	437.000      437.000     ; besoin d'un autre canal ???
;---------------------------------------------------------------------------
                DEVICE  PIC16F84,RC_OSC,WDT_OFF,PWRT_OFF,PROTECT_OFF

                id     '5SOH'

                org     0Ch


Count0          DS      1
Count1          DS      1
temp            DS      1
temp1           DS      1
temp2           DS      1
pa              DS      1

nb_clocks       DS      1

prediv_ref0     DS      1
prediv_ref1     DS      1

_A              DS      1
Mmsb            DS      1
Mlsb            DS      1

_Arx            DS      1
Mlsbrx          DS      1
Mmsbrx          DS      1

_Atx            DS      1
Mlsbtx          DS      1
Mmsbtx          DS      1

;A              equ   RA.0  ;broche 17 du pic, r de 5.6k de rappel à 5v
;B              equ   RA.1  ;broche 18 du pic, r de 5.6k de rappel à 5v
;C              equ   RA.2  ;broche  1 du pic, r de 5.6k de rappel à 5v
;D              equ   RA.3  ;broche  2 du pic, r de 5.6k de rappel à 5v

ptt             equ   RA.4  ;broche 3 du pic, r de 5k6 de rappel à 5v (1=rx 0=tx)

lock_detect     equ   RB.4  ;broche 10 du pic, r de 5k6 de rappel  à 5v (0=lock ok)
cmd_em	        equ   RB.3  ;broche 9 du pic (mise à la masse pour passage en Tx)

;I/O pour le PLL NJ8822
clock            =    RB.0  ;sortie clock,  broche 6 du pic.
data             =    RB.1  ;sortie datas,  broche 7 du pic.
enable           =    RB.2  ;sortie enable, broche 8 du pic.

; début du programme principal

                org    0
Start
                mov    !RA,#00011111b  ; RA0 à RA4 = entrées
                mov    !RB,#00010000b  ; RB0 à RB7 = sorties. (RB4 entrée)
                mov    RB,#000h        ; les sorties à 0 au début.
                mov    count0,#0
                mov    count1,#0
                mov    prediv_ref0,#00000000b  ; 256 pour pas de 12.5Khz, lsb
                mov    prediv_ref1,#00100000b  ; suite msb osc réf = 12.8Mhz/2
                                               ; mot de 3 bits, 5 lsb ignorés.
;----------------------------------------------------------------------------
;lecture des entrées RA0 , RA1 , RA2 , RA3
;                     1     2     4     8 => valeur binaire => canal
;renvoie sur les valeurs Mlsb??, Mmsb?? et _A?? du canal correspondant

                  mov   temp1,RA
                  and   temp1,#00001111b
                  cje   temp1,#0, :c0m
                  cje   temp1,#1, :c1m
                  cje   temp1,#2, :c2m
                  cje   temp1,#3, :c3m
                  cje   temp1,#4, :c4m
                  cje   temp1,#5, :c5m
                  cje   temp1,#6, :c6m
                  cje   temp1,#7, :c7m

                  cje   temp1,#8, :c0p
                  cje   temp1,#9, :c1p
                  cje   temp1,#10, :c2p
                  cje   temp1,#11, :c3p
                  cje   temp1,#12, :c4p
                  cje   temp1,#13, :c5p
                  cje   temp1,#14, :c6p
                  cje   temp1,#15, :c7p
                  jmp   :apres
;---------------------------------------------------------------------------
; caractéristiques des canaux
; exemple pour le canal 0, A,B,C,D à la masse :
; 432.675 Tx :
; 432675 / 12.5 = 34614   et  34614 / 64 = 540,84375
; 540 = 021C (hexa) soit msb = 002h et lsb = 01Ch
; 0.84375 x 64 = 54 soit _A = 036h (hexa)
;
; idem pour la fréquence Rx en infradyne soit 387.675Mhz qui donne Mmsbrx = 001h, Mlsbrx = 0E4h
;  et _Arx = 026h
;Les bonnes valeurs sont à recalculer suivant les besoins.
;
:c0m             mov   Mmsbtx,#002h		; 432.675 Mhz (voie users simplex)
                 mov   Mlsbtx,#01Ch
                 mov   _Atx,#036h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E4h
                 mov   _Arx,#026h
                 jmp   :apres

:c1m             mov   Mmsbtx,#002h		; Tx 430.400 Rx 439.800 Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#000h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#020h
                 jmp   :apres

:c2m             mov   Mmsbtx,#002h		; Tx 430.425 Rx 439.825 Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#002h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#022h
                 jmp   :apres


:c3m             mov   Mmsbtx,#002h		; Tx 430.450 Rx 439.850 Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#004h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#024h
                 jmp   :apres


:c4m             mov   Mmsbtx,#002h		; Tx 430.475 Rx 439.875Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#006h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#026h
                 jmp   :apres

:c5m             mov   Mmsbtx,#002h		; Tx 430.525 Rx 439.925Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#00Ah
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#02Ah
                 jmp   :apres


:c6m             mov   Mmsbtx,#002h		; Tx 430.550 Rx 439.950 Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#00Ch
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#02Ch
                 jmp   :apres


:c7m             mov   Mmsbtx,#002h		; Tx 430.575 Rx 439.975 Mhz
                 mov   Mlsbtx,#01Ah
                 mov   _Atx,#00Eh
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EDh
                 mov   _Arx,#02Eh
                 jmp   :apres

;-----------------------------------------------------------------------------
:c0p             mov   Mmsbtx,#002h		; Tx 439.800 Rx 430.400 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#030h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#030h
                 jmp   :apres


:c1p             mov   Mmsbtx,#002h		; Tx 439.825 Rx 430.425 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#032h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#032h
                 jmp   :apres


:c2p             mov   Mmsbtx,#002h		; Tx 439.850 Rx 430.450 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#034h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#034h
                 jmp   :apres


:c3p             mov   Mmsbtx,#002h		; Tx 439.875 Rx 430.475 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#036h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#036h
                 jmp   :apres


:c4p             mov   Mmsbtx,#002h		; Tx 439.925 Rx 430.525 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#03Ah
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#03Ah
                 jmp   :apres


:c5p             mov   Mmsbtx,#002h		; Tx 439.950 Rx 430.550 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#03Ch
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#03Ch
                 jmp   :apres


:c6p             mov   Mmsbtx,#002h		; Tx 439.975 Rx 430.575 Mhz
                 mov   Mlsbtx,#025h
                 mov   _Atx,#03Eh
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0E1h
                 mov   _Arx,#03Eh
                 jmp   :apres


:c7p             mov   Mmsbtx,#002h		; Tx 437.000 Rx 437.000
                 mov   Mlsbtx,#022h
                 mov   _Atx,#010h
                 mov   Mmsbrx,#001h
                 mov   Mlsbrx,#0EAh
                 mov   _Arx,#000h
                 jmp   :apres

;----------------------------------------------------------------------------

:apres		call   tempo_lente
               	call   tempo_lente

:rx		setb   cmd_em
    	        mov    Mmsb,Mmsbrx
		mov    Mlsb,Mlsbrx
		mov    _A,_Arx
               	call   envoi_vers_pll_div_princ
               	call   envoi_vers_pll_ref
		mov    Mmsb,Mmsbtx   		; après envoi des données Rx, chargement des variables
		mov    Mlsb,Mlsbtx 		; pour le Tx afin de gagner un peu de temps....
		mov    _A,_Atx

:rx_loop        jnb    ptt, :tx			; attente du Ptt pour
                jmp    :rx_loop			; envoi des données Tx

:tx             call   envoi_vers_pll_div_princ
                call   envoi_vers_pll_ref


:lock_tx        snb    lock_detect        	;si pas lock tx, attente passage du Trx en émission.
                jmp    :lock_tx			;si lock_tx, cette instruction est sautée et passage en Tx
                clrb    cmd_em
:tx_loop        jb      ptt, :rx     		;si broche ptt=1 retour en rx
                jmp     :tx_loop


; fin programme principal
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
;envoi taux de division référence 3bits MSB (5bits) ignorés puis 8bits
envoi_vers_pll_ref
                mov     nb_clocks,#3
                mov     temp,prediv_ref1  ;envoi 3bits msb prédiv référence
:rotationA      movb    data,temp.7
                nop
                setb    clock
                nop
                nop
                nop
                clrb    clock
                rl      temp
                djnz    nb_clocks,:rotationA

                mov 	nb_clocks,#8
                mov     temp,prediv_ref0  	;envoi 8bits lsb prédiv référence
:rotationB      movb    data,temp.7
                nop
                setb    clock
                nop
                nop
                nop
                clrb    clock
                rl 	temp
                djnz   	nb_clocks,:rotationB
                clrb    data
                nop
                clrb    clock
                nop
                clrb    enable
                ret
;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
;envoi taux de division principale 10bits (2msb + 8lsb)
envoi_vers_pll_div_princ
                clrb    enable
                clrb    clock
                clrb    data
                nop
                mov 	nb_clocks,#7
                mov     temp,_A       		;envoi 7bits prédivision modulus
:rotationF      movb    data,temp.6
                nop
                setb    clock
                nop
                setb    enable
                nop
                nop
                clrb    clock
                rl 	temp
                djnz   	nb_clocks,:rotationF

                mov 	nb_clocks,#2
                mov     temp,Mmsb       	;envoi 2bits poids faible du msb
:rotationD      movb    data,temp.1     	;6 bits msb ignorés
                nop
                setb    clock
                nop
                nop
                nop
                clrb    clock
                rl 	temp
                djnz   	nb_clocks,:rotationD

                mov 	nb_clocks,#8
                mov     temp,Mlsb    		;envoi 8bits lsb division principale
:rotationE      movb    data,temp.7
                nop
                setb    clock
                nop
                nop
                nop
                clrb    clock
                rl 	temp
                djnz   	nb_clocks,:rotationE

;                clrb    data
;                nop
;                setb    clock
;                nop
;                clrb    enable
;                clrb    clock
                 ret
;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
tempo_lente
                 mov     Count1,#255
:lop2            mov     Count0,#255       	;tempo_lente
:Loop2           djnz    Count0,:Loop2
                 djnz    Count1,:Lop2
                 ret
;---------------------------------------------------------------------------
tempo
                 mov     Count1,#20
:lop3            mov     Count0,#60       	;tempo rapide
:Loop3           djnz    Count0,:Loop3
                 djnz    Count1,:Lop3
                 ret
;---------------------------------------------------------------------------
