;== DOPPLER DF PAR JACQUES BRODEUR == VE2EMM ======================== REV. 1
;Free use granted to HAM RADIO OPERATORS only for HAM RADIO purpose.
;Please mention VE2EMM when using it. It is my only reward.
;No resale permitted.
;
; DOPPLER DF, CONTROLE PAR PIC 16C72
;
; Liste des entrees/sorties du microcontrolleur
;
; 8 sorties lampes affichage I B0-B7
; 4communs lampes affichage I C4-C7
; 4 sorties antennes I C0-C3
; 1 Entree analogue CAL I A0 ;Direction des lampes
; 1 Entree analogue SIGLVL I A1 ;Niveau du signal
; 3 Sorties filtre digital ROANOKE I A2-A4
; 1 entree signal de phase PHASE/ I A5
;
;--------------------------------------------------------------------------------
;
LIST P=16C72
RADIX HEX
INCLUDE P16C72.INC
__CONFIG _HS_OSC&_PWRTE_ON&_CP_OFF&_WDT ON& BODEN_ON
;
;--------------------------------------------------------------------------------
; ALLOCATION DES MEMOIRES, VALEURS ET BITS
;
CBLOCK 0X20
STA_W ;STACK POUR LE W
STA_STATU ;STACK POUR LE STATUS
ROSE ;COMPTEUR DE DEGRES
DIR_1 ;DIRECTION MOYENNE DE LA PHASE
DIR_2 ;DIRECTION DE LA PHASE
ECAR
DIRECTION ;POUR AFFICHER
MEMTMP1 ;Memoire temporaire tout usage
MEMTMP2
DRAPEAU ;Flags
;b0=lecture de la direction deja faite
;b1=SIGLVL overload
;b2=Demander une conversion de SIGLVL
;b3=SIGLVL recepteur silentieux
PHASAGE ;Deplacement de la direction (CAL)
SIGLVL ;Niveau du signal au filtre
TIMR1 ;pour le clignoteur 180 degree
TIMR2 ;Pour le clignoteur squelch
BIT ;Memoire pour la bit a clignoter
ENDC
;
;---DEBUT DU PROGRAMME----------------------------------------------------------------
;
ORG 0X000
GOTO INIT
;
;-------------------------------------------------------------------------------------
;===INTERRUPTION =========================================================
;
ORG 0X004
MOVWF STA_W ;PUSH le reg W
SWAPF STATUS,W ;PUSH le reg STATUS
MOVWF STA_STATU
MOVLW D'178' ;178 pour 20 mHz pour 500Hz
MOVWF TMR0 ;RESET TMR0
;
;---CHANGER D'ANTENNE-------------------------------
;
MOVF ROSE,W ;CHANGER LES CONDENSATEURS DU FILTRE DIGITAL
MOVWF PORTA ;bits 2,3,4
ANT1 MOVLW D'0' ;ANTENNE 1
XORWF ROSE,W ;TESTER POUR 0 degree
BNZ ANT2
BCF PORTC,0 ;Activer L'antenne 1
NOP
BSF PORTC,3 ;Deconnecter l'antenne 4
ANT2 MOVLW D'8' ;ANTENNE 2
XORWF ROSE,W ;TESTER POUR 90 degrees
BNZ ANT3
BCF PORTC,1 ;Activer L'antenne 2
NOP
BSF PORTC,0 ;Deconnecter l'antenne 1
ANT3 MOVLW D'16' ;ANTENNE 3
XORWF ROSE,W ;TESTER POUR 180 degrees
BNZ ANT4
BCF PORTC,2 ;Activer L'antenne 3
NOP
BSF PORTC,1 ;Deconnecter l'antenne 2
ANT4 MOVLW D'24' ;ANTENNE 4
XORWF ROSE,W ;TESTER POUR 270 degrees
BNZ TESTER
BCF PORTC,3 ;Activer L'antenne 4
NOP
BSF PORTC,2 ;Deconnecter l'antenne 3
;
;---TESTER LE SIGNAL------------------------------------
;
TESTER BTFSS DRAPEAU,3 ;Si SIGLVL < SQUELCH clignoter lentement
;l'affichage
GOTO AFF_OVERL ;SIGLVL au dessus du SQUELCH
BTFSS TIMR2,0 ;SIGLVL sous le SQUELCH *******
GOTO AFFICHER ;Allumer la lampe
MOVLW 0XFF ;Eteindre la lampe *
MOVWF PORTB
GOTO AVANCER ; * * * * *
AFF_OVERL BTFSS DRAPEAU,1 ;Tester pour OVERLOAD du niveau de signal
GOTO PHASE ;Afficher la direction * * * *
BTFSS TIMR1,6 ;Clignote rapidement la lampe OVERLOAD, 180 deg.
GOTO CLI_ON
MOVLW D'32' ;Lampe eteinte
MOVWF DIRECTION
GOTO AFFICHER ;Afficher la direction
CLI_ON MOVLW D'16' ;Lampe allumee
MOVWF DIRECTION
GOTO AFFICHER ;Continuer * * * * * * *
;
;--LIRE LA PHASE ------------------------------------------
;
PHASE ;Tester pour 1 changement par revolution
BTFSS PORTA,5 ;Lire la PHASE
GOTO LIREPHASE ;0=lire
BCF DRAPEAU,0 ;1=ne pas lire
GOTO AVANCER
LIREPHASE BTFSC DRAPEAU,0 ;Deja lu si 1, Lire si 0
GOTO AVANCER ;Terminer direction est deja lu
MOVF ROSE,W ;Ramasser la direction de ce cycle
MOVWF DIR_2 ;DIR_2=Direction presente -- DIR_1=Direction precedente
BSF DRAPEAU,0 ;Indique que la lecture est faite, bit a 1
;
:---CALCULER LA MOOYENNE DE 2 RETOURS-
MOVF DIR_2,W ;Dir_2 doit etre plus grand que DIR_1
SUBWF DIR_1,W
BTFSS STATUS,C
GOTO CALCUL ;Si DIR_1 plus petit que DIR_2
MOVF DIR_l, W ;Echanger DIR 1 et DIR 2
MOVWF MEMTMP1
MOVF DIR_2,W
MOVWF DIR_1
MOVF MEMTMP 1,W
MOVWF DIR_2
CALCUL MOVF DIR 1,W ;ECAR = DIR_2 - DIR_1
SUBWF DIR_2,W
MOVWF ECAR
CLRC ;DIR_1 = (ECAR / 2) + DIR_1
RRF ECAR,W
ADDWF DIR 1,F
MOVLW D'16' ;IF ECAR <16 THEN LECT_FAITE ELSE
SUBWF ECAR,W
BNC CAL
SUITE MOVLW D'16' ;Si DIR_1 < 16
SUBWF DIR_1, W
BNC ADD 16
MOVLW D'16' ;IF NOT DIR_1 = DIR_1 - 16
SUBWF DIR_1,F
GOTO CAL
ADD16 MOVLW D'16' ;IF DIR_1 < 16 THEN DIR_1 = DIR_1 + 16
ADDWF DIR_1,F
;
;---CALIBRER----------------------------------------------------------------
;
CAL MOVF PHASAGE,W ;Ajouter la calibration
ADDWF DIR 1,W
MOVWF DIRECTION
MOVLW D'32'
SUBWF DIRECTION,W
BC SOUSTRAIRE ;Si 32 et plus soustraire
GOTO AFFICHER
SOUSTRAIRE MOVLW D'224' ;Soustraire 32
ADDWF DIRECTION,F
;
;---AFFICHAGE--------------------------------------------------------------
;
AFFICHER MOVLW 0X02 ;Aller a la page 0x200
MOVWF PCLATH
CLRC ;Afficher les lampes de direction
RLF DIRECTION,W
CALL LAMPES
MOVWF PORTB ;*****Cathode des lampes
RLF DIRECTION,W ;Chercher les anodes
ADDLW 0X01
CALL LAMPES
MOVWF MEMTMP1 ;*****Sauver les anodes des lampes
CLRF PCLATH
MOVF PORTC,W
ANDLW B'00001111' ;Charger les antennes
IORWF MEMTMP1,W ;Ajouter les lampes
MOVWF PORTC ;*****Mise a jour du port C
;
;---AVANCER LE COMPTEUR----------------------------------------
;
AVANCER INCF ROSE,F ;AVANCER LE COMPTEUR
MOVLW D'32'
SUBWF ROSE,W ;TESTER Si COMPTE MAXIMUM
BNC POP ;ARRETER LE COMPTEUR A 31
CLRF ROSE ;Commencer a 0
BSF DRAPEAU,2 ;Commander une conversion du SIGLVL
INCF TIMR1,F
SKPNZ
INCF TIMR2,F
;
;---TERMINER----------------------------------------------------------------
;
POP BCF 1NTCON,T0IF ;Rappeler lE FLAG TOIF de L'OVERFLOW
;DE TMRO
SWAPF STA_STATU,W ;Restorer le reg STATUS
MOVWF STATUS
SWAPF STA_W,F ;Restorer le reg W
SWAPF STA_W,W
RETFIE
;
;===================================================================================
;--- INITIALISATION ET LECTURE DE LA CALIBRATION------------------------------------
;
INIT CLRF PORTA
CLRF PORTB
CLRF PORTC
;Charger la calibration de l'affichage
BSF STATUS,RP0 ;Page 1
MOVLW B'00000100'
MOVWF ADCON1 ;Analogue AN0 AN1 AN3
BCF STATUS,RP0 ;Page 0
MOVLW B'11000001' ;Clock RC, convertir AN0
MOVWF ADCON0 ;
MOVLW D'60'
MOVWF MEMTMP1
WAIT DECFSZ MEMTMP 1,F
GOTO WAIT ;Stabiliser l'entree
BSF ADCON0,GO ;Demarrer le convertisseur A/N
ANCONVER BTFSC ADCON0,GO ;Si 0, terminee
GOTO ANCONVER ;Attendre la fin de conversion
MOVF ADRES,W
MOVWF PHASAGE ;Sauver la calibration
CLRC
RRF PHASAGE,F ;127 max
CLRC
RRF PHASAGE,F ;67 max
CLRC
RRF PHASAGE,F ;31 compte max
;
;---Operation normale------------------------------------------------------
;
CLRF ADCON0
BSF STATUS,RP0 ;Page 1
; MOVLW B'00000110' ;RA TOUT DIGITAL
; MOVWF ADCON1
MOVLW B'00100011' ;0-1,5 entrees 2-4 sorties PORTA
MOVWF TRISA
MOVLW B'00000000' ;Tout en sortie PORTB
MOVWF TRISB
MOVLW B'00000000' ;Tout en sortie PORTC
MOVWF TRISC
MOVLW B'11010001' ;OPTION TOCS=internal CLK, PRE=/2, PSA=TMR0
MOVWF OPTION_REG
MOVLW B'10100000' ;1NTCON GIE T0IE
MOVWF 1NTCON
BCF STATUS,RP0 ;Page 0
MOVLW D'00' ;Conditions de depart des memoires
MOVWF ROSE
MOVWF DIR_1
MOVWF DIR_2
MOVWF DIRECTION
MOVLW 0X0F ;Deconnecter les antennes
MOVWF PORTC
MOVLW B'00000001'
MOVWF DRAPEAU
MOVLW D'178'
MOVWF TMR0
;
;---BOUCLE PRINCIPALE-----------------------------------------------
;
PRINC CLRWDT
BTFSS DRAPEAU,2 ;Temps de faire une conversion?
GOTO PRINC ;Non
BCF DRAPEAU,2 ;Oui
MOVLW B'11001001' ;Clock RC, convertir AN1
MOVWF ADCON0 ;
MOVLW D'60'
MOVWF MEMTMP2
WAIT1 DECFSZ MEMTMP2,F
GOTO WAIT1 ;Stabiliser l'entree
BSF ADCON0,GO ;Demarrer le convertisseur A/N
ANCONVER1 BTFSC ADCON0,GO ;Si 0, terminee
GOTO ANCONVER1 ;Attendre la fin de conversion
MOVF ADRES,W ;
MOVWF SIGLVL ;0 a 256 = 0 a 5 volts
MOVLW D'115' ;Test de bas niveau 2.2 VOLTS
SUBWF SIGLVL,W
BNC SQUELCH ;Signal faible
BCF DRAPEAU,3 ;Signal plus grand que le minimum
GOTO TESTOVERL
SQUELCH BSF DRAPEAU,3 ;Pour eteindre l'affichage
TESTOVERL MOVLW D'170' ;(256/5V)*3.4V=174 (Niveau de crete)
SUBWF SIGLVL,W
BNC SIGBON ;Enlever le flag
BSF DRAPEAU,1 ;Indication de OVERLOAD
GOTO PRINC ;Attendre
SIGBON BCF DRAPEAU,1 ;Pas de OVERLOAD SIGLVL bon
GOTO PRINC
;
;---LAMPES-------------------------------------------------------------------
;
ORG 0X200
LAMPES ADDWF PCL,F
RETLW B'11111110' ;D1 0
RETLW B'00010000' ;L1
RETLW B'11111101' ;D2 1
RETLW B'00010000' ;L1
RETLW B'11111011' ;D3 2
RETLW B'00010000' ;L1
RETLW B'11110111' ;D4 3
RETLW B'00010000' ;L1
RETLW B'11101111' ;D5 4
RETLW B'00010000' ;L1
RETLW B'11011111' ;D6 5
RETLW B'00010000' ;L1
RETLW B'10111111' ;D7 6
RETLW B'00010000' ;L1
RETLW B'01111111' ;D8 7
RETLW B'00010000' ;L1
RETLW B'11111110' ;D1 8
RETLW B'00100000' ;L2
RETLW B'11111101' ;D2 9
RETLW B'00100000' ;L2
RETLW B'11111011' ;D3 10
RETLW B'00100000' ;L2
RETLW B'11110111' ;D4 11
RETLW B'00100000' ;L2
RETLW B'11101111' ;D5 12
RETLW B'00100000' ;L2
RETLW B'11011111' ;D6 13
RETLW B'00100000' ;L2
RETLW B'10111111' ;D7 14
RETLW B'00100000' ;L2
RETLW B'01111111' ;D8 15
RETLW B'00100000' ;L2
RETLW B'11111110' ;D1 16
RETLW B'01000000' ;L3
RETLW B'11111101' ;D2 17
RETLW B'01000000' ;L3
RETLW B'11111011' ;D3 18
RETLW B'01000000' ;L3
RETLW B'11110111' ;D4 19
RETLW B'01000000' ;L3
RETLW B'11101111' ;D5 20
RETLW B'01000000' ;L3
RETLW B'11011111' ;D6 21
RETLW B'01000000' ;L3
RETLW B'10111111' ;D7 22
RETLW B'01000000' ;L3
RETLW B'01111111' ;D8 23
RETLW B'01000000' ;L3
RETLW B'11111110' ;D1 24
RETLW B'10000000' ;L4
RETLW B'11111101' ;D2 25
RETLW B'10000000' ;L4
RETLW B'11111011' ;D3 26
RETLW B'10000000' ;L4
RETLW B'11110111' ;D4 27
RETLW B'10000000' ;L4
RETLW B'11101111' ;D5 28
RETLW B'10000000' ;L4
RETLW B'11011111' ;D6 29
RETLW B'10000000' ;L4
RETLW B'10111111' ;D7 30
RETLW B'10000000' ;L4
RETLW B'01111111' ;D8 31
RETLW B'10000000' ;L4
RETLW B'11111111' ; 32 Toutes les lampes eteintes
RETLW B'00000000' ;
;
;===========================================================================
;
END