Exemple de programme Pic pour piloter un Nokia620 / TMF1 / Talkman


Avec les valeurs calculées avec le script Java un décalage de 6.25Khz apparaît..... les calculs semblent bons pourtant !
Certainement une erreur dans le soft... :-(  mais j'ai pas trouvé, d'ou l'ajout d'un pas 'en plus' sur _Atx et _Arx pour faire le compte...
Vous pouvez récupérer l'archive avec le source et le fichier .obj
Voir aussi la page 'Nokia' avec une version d'affichage à LCD

;Programme de pilotage de deux synthétiseurs MB1501 pour Nokia Talkman,
;TMF1 ou nokia620 d'après différentes sources de Victor F1BIU
;Utilisant un pic 16f84, pas de 6.25Khz avec oscillateur de référence 12.8Mhz.
;16 canaux avec 4 cavaliers (A,B,C,D) pour utilisation en simplex.
;fi à 21.4Mhz, battement infradyne.
;PLL Rx chargé au debut, PLL Tx décalé sur 442Mhz en Rx pour ne pas brouiller.
;oscillateur du pic par un circuit rc.
;Obligation de couper/alimenter le pic pour la prise en compte d'un nouveau canal.
;
; A compiler avec SPASM.EXE taper : 'spasm nok_simp.src'
;
; - f5soh@bigfoot.com - http://f5soh.free.fr/ - 02/04/2000
;----------------------------------------------------------
;  D   C   B   A        Pll tx      Pll rx       Qrg Rx
;----------------------------------------------------------
;  0   0   0   0       432.6500 411.2500 (432.6500)
;  0   0   0   1       432.6625 411.2625 (432.6625)
;  0   0   1   0       432.6750 411.2750 (432.6750)
;  0   0   1   1       433.2250 411.8250 (433.2250)
;  0   1   0   0       433.2375 411.8375 (433.2375)
;  0   1   0   1       433.2500 411.8500 (433.2500)
;  0   1   1   0       433.2625 411.8625 (433.2625)
;  0   1   1   1       433.2750 411.8750 (433.2750)
;----------------------------------------------------------
;  1   0   0   0       433.2875 411.8875 (433.2875)
;  1   0   0   1       433.3000 411.8900 (433.3000)
;  1   0   1   0       433.3125 411.9125 (433.3125)
;  1   0   1   1       433.3250 411.9250 (433.3250)
;  1   1   0   0       433.3375 411.9375 (433.3375)
;  1   1   0   1       433.3500 411.9500 (433.3500)
;  1   1   1   0       433.3625 411.9625 (433.3625)
;  1   1   1   1       433.3750 411.9750 (433.3750)
;---------------------------------------------------------------------------

                DEVICE  PIC16F84,RC_OSC,WDT_OFF,PWRT_OFF,PROTECT_OFF

                id     '1BIU'

                org     0Ch

nb_clocks       DS      1
Count0          DS      1
Count1          DS      1
temp            DS      1
temp1           DS      1

prediv_ref0     DS      1
prediv_ref1     DS      1

_Atx            DS      1
Nlsbtx          DS      1
Nmsbtx          DS      1

_Arx            DS      1
Nlsbrx          DS      1
Nmsbrx          DS      1

_Adecal         DS      1
Nlsbdecal       DS      1
Nmsbdecal       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)

_5v_tx           =    RB.4     ;sortie +5v Tx pour alim ampli/commutation, broche 10

enabletx         =    RB.3     ;sortie enableTx, broche 9 du pic.
data             =    RB.2     ;sortie datas,  broche 8 du pic.
clock            =    RB.1     ;sortie clock,  broche 7 du pic.
enablerx         =    RB.0     ;sortie enableRx, broche 6 du pic.

;-----------------------------------------------------------------------------------
; début du programme principal

                org    0
Start
                mov    !RA,#00011111b  ;RA0 à RA4 = entrées
                mov    !RB,#00000000b  ;RB0 à RB7 = sorties.
                mov    RB,#000h        ;les sorties à 0 au début.
                mov    count0,#0
                mov    count1,#0

                mov    prediv_ref0,#00000000b  ;2048 pour pas de 6.25Khz, lsb
                mov    prediv_ref1,#00100000b  ;suite msb osc réf = 12.8Mhz
                                               ;mot de 6 bits, 2 lsb ignorés.

                mov   Nmsbdecal,#002h          ;canal Tx pendant le Rx (simplex)
                mov   Nlsbdecal,#028h          ; (442Mhz sans commutation PA)
                mov   _Adecal,#041h
 

;lecture des entrées RA0 , RA1 , RA2 , RA3
;                     1     2     4     8 => valeur binaire => canal
;renvoi sur les valeurs Nlsb??, Nmsb?? 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 canaux
; +1 sur _Atx et _Arx par rapport au calcul. Sinon décalage de -6.25Khz ????
; C'est pour avoir la qrg ok ...... Bref, c'est bon comme ça !

:c0m             mov   Nmsbtx,#002h  ; 432.650 Mhz
                 mov   Nlsbtx,#01Ch
                 mov   _Atx,#069h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#009h
                 jmp   :apres

:c1m             mov   Nmsbtx,#002h  ; 432.6625 Mhz
                 mov   Nlsbtx,#01Ch
                 mov   _Atx,#06Bh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#00Bh
                 jmp   :apres

:c2m             mov   Nmsbtx,#002h  ; 432.675 Mhz
                 mov   Nlsbtx,#01Ch
                 mov   _Atx,#06Dh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#00Dh
                 jmp   :apres
 

:c3m             mov   Nmsbtx,#002h  ; 433.225Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#045h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#065h
                 jmp   :apres
 

:c4m             mov   Nmsbtx,#002h  ;433.2375Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#047h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#067h
                 jmp   :apres

:c5m             mov   Nmsbtx,#002h  ; 433.250Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#049h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#069h
                 jmp   :apres
 

:c6m             mov   Nmsbtx,#002h  ;433.2625Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#04Bh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#06Bh
                 jmp   :apres
 

:c7m             mov   Nmsbtx,#002h  ;433.275Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#04Dh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#06Dh
                 jmp   :apres

;-----------------------------------------------------------------------------
:c0p             mov   Nmsbtx,#002h  ;433.2875Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#04Fh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#06Fh
                 jmp   :apres
 

:c1p             mov   Nmsbtx,#002h  ;433.300Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#051h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#071h
                 jmp   :apres
 

:c2p             mov   Nmsbtx,#002h  ;433.3125Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#053h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#073h
                 jmp   :apres
 

:c3p             mov   Nmsbtx,#002h  ;433.325Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#055h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#075h
                 jmp   :apres
 

:c4p             mov   Nmsbtx,#002h  ;433.3375Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#057h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#077h
                 jmp   :apres
 

:c5p             mov   Nmsbtx,#002h  ;433.350Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#059h
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#079h
                 jmp   :apres
 

:c6p             mov   Nmsbtx,#002h  ;433.3625Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#05Bh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#07Bh
                 jmp   :apres
 

:c7p             mov   Nmsbtx,#002h  ;433.375Mhz
                 mov   Nlsbtx,#01Dh
                 mov   _Atx,#05Dh
                 mov   Nmsbrx,#002h
                 mov   Nlsbrx,#002h
                 mov   _Arx,#07Dh
                 jmp   :apres

;----------------------------------------------------------------------------
:apres
                setb   _5v_tx  ;envoi d'un niveau haut bref à la mise sous tension
                call   tempo        ;sur la broche 10 du pic (Led Tx)
                clrb   _5v_tx
                call   tempo_lente    ; attente pour l'alimentation des Pll's
                call   tempo_lente
                call   envoi_vers_pll_ref_rx
                call   envoi_vers_pll_div_princ_rx
                jnb    ptt, :tx ;si broche ptt=0 goto :tx
:rx
                clrb   _5v_tx         ;coupure du PA
                call   envoi_vers_pll_ref_tx
                call   envoi_vers_pll_div_princ_txdecal   ;décalage Vco sur 442Mhz
                jmp    :rx_loop
:rx_loop
                jnb    ptt, :tx
                jmp    :rx_loop
:tx
                call   envoi_vers_pll_ref_tx
                call   envoi_vers_pll_div_princ_tx
                call   tempo  ; 24ms d'attente pour verrouillage PLL
                setb   _5v_tx  ; commutation du PA
                jmp    :tx_loop
: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 pll Tx

envoi_vers_pll_ref_tx
                clrb    data             ;sw = 0, prediv =128
                nop
                setb    clock
                nop
                clrb    clock
                nop

                mov nb_clocks,#6
                mov     temp,prediv_ref1  ;envoi 6bits msb prédiv référence
:rotationAT     movb    data,temp.7
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationAT

                mov nb_clocks,#8
                mov     temp,prediv_ref0  ;envoi 8bits lsb prédiv référence
:rotationBT     movb    data,temp.7
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationBT
                nop
                nop
                setb    data             ;envoi bit C de contrôle à 1
                nop
                setb    clock
                nop
                clrb    clock
                nop
                setb    enabletx         ;envoi de l'enable après les 16 bits.
                nop
                nop
                clrb    enabletx
                nop
                nop
                clrb    data          ; les 3 fils du pll retombent a 0.
                nop
                nop
                ret

;envoi taux de division référence pll Rx

envoi_vers_pll_ref_rx
                clrb    data             ;sw = 0, prediv =128
                nop
                setb    clock
                nop
                clrb    clock
                nop

                mov nb_clocks,#6
                mov     temp,prediv_ref1  ;envoi 6bits msb prédiv référence
:rotationAR     movb    data,temp.7
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationAR

                mov nb_clocks,#8
                mov     temp,prediv_ref0  ;envoi 8bits lsb prédiv référence
:rotationBR      movb    data,temp.7
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationBR
                nop
                nop
                setb    data            ;envoi bit C de contrôle à 1
                nop
                setb    clock
                nop
                clrb    clock
                nop
                setb    enablerx         ;envoi de l'enable après les 16 bits.
                nop
                nop
                clrb    enablerx
                nop
                nop
                clrb    data          ; les 3 fils du pll retombent a 0.
                nop
                nop
                ret

;-------------------------------------------------------------------------
;-------------------------------------------------------------------------
;envoi taux de division principale vers pll Tx

envoi_vers_pll_div_princ_tx
                mov nb_clocks,#3
                mov     temp,Nmsbtx     ;envoi 3bits poids faible du msb
:rotationDT     movb    data,temp.2     ;5 bits msb ignorés
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationDT
 

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

                mov nb_clocks,#7
                mov     temp,_Atx     ;envoi 7bits prédivision modulus
:rotationFT     movb    data,temp.6
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationFT

                clrb    data             ;envoi bit C de contrôle à 0
                setb    clock
                nop
                clrb    clock
                nop
                clrb    data
                nop
                setb    enabletx        ;envoi de l'enable après les 19 bits.
                nop
                nop
                clrb    enabletx
                nop
                clrb    data          ; les 3 fils du pll retombent à 0.
                nop
                nop
                ret

;envoi taux de division principale vers pll Rx

envoi_vers_pll_div_princ_rx
                mov nb_clocks,#3
                mov     temp,Nmsbrx     ;envoi 3bits poids faible du msb
:rotationDR     movb    data,temp.2     ;5 bits msb ignorés
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationDR
 

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

                mov nb_clocks,#7
                mov     temp,_Arx     ;envoi 7bits prédivision modulus
:rotationFR     movb    data,temp.6
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationFR

                clrb    data             ;envoi bit C de contrôle à 0
                setb    clock
                nop
                clrb    clock
                nop
                clrb    data
                nop
                setb    enablerx        ;envoi de l'enable après les 19 bits.
                nop
                nop
                clrb    enablerx
                nop
                clrb    data          ; les 3 fils du pll retombent à 0.
                nop
                nop
                ret

;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
; décalage PLL Tx sur 442Mhz pendant la réception
;
envoi_vers_pll_div_princ_txdecal
                mov nb_clocks,#3
                mov     temp,Nmsbdecal  ;envoi 3bits poids faible du msb
:rotationDD     movb    data,temp.2     ;5 bits msb ignorés
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationDD
 

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

                mov nb_clocks,#7
                mov     temp,_Adecal     ;envoi 7bits prédivision modulus
:rotationFD     movb    data,temp.6
                setb    clock
                nop
                clrb    clock
                nop
                rl temp
                djnz   nb_clocks,:rotationFD

                clrb    data             ;envoi bit C de contrôle à 0
                setb    clock
                nop
                clrb    clock
                nop
                clrb    data
                nop
                setb    enabletx        ;envoi de l'enable après les 19 bits.
                nop
                nop
                clrb    enabletx
                nop
                clrb    data          ; les 3 fils du pll retombent à 0.
                nop
                nop
                ret
;---------------------------------------------------------------------------
tempo_lente
                 mov     Count1,#255
:lop2            mov     Count0,#255       ;tempo_lente
:Loop2           djnz    Count0,:Loop2
                 djnz    Count1,:Lop2
                 ret
;---------------------------------------------------------------------------
tempo
                 mov     Count1,#160
:lop3            mov     Count0,#200       ;tempo de 24 ms
:Loop3           djnz    Count0,:Loop3
                 djnz    Count1,:Lop3
                 ret
;---------------------------------------------------------------------------



Retour page MB1501