l'auteur Le radiogoniomètre à effet Doppler (2)
par Yves Oesch HB9DTX

Copyright: L'auteur se réserve tous les droits de reproduction (article) ou de commercialisation de ce projet. Par conséquent, toute publication (même partielle) et toute utilisation dans un but lucratif sont interdites sans son autorisation.

D'autre part, n'ayant plus touché à ce projet depuis le printemps 1999, je n'assure aucun support pour ce projet. Les schémas, croquis et le code source assembleur sont à prendre "tel quel", sans garantie.

Précédent: Le radiogoniomètre à effet Doppler (1)


1. La partie "schémas"

Le schéma bloc

Schéma système

Schéma 1: Commutation des antennes (PDF, 27 kB)

Schéma 2: Complément de la commutation d'antennes (PDF, 20 kB)

Schéma 3: Coeur du montage, avec le microprocesseur PIC (PDF, 31kB)

Schéma 4: Affichage circulaire à LED (PDF, 31 kB)

 

2. La partie "programme"

 Fichier source assembleur  (5.5 kB)
 Headerfile (fourni par Microchip, 5kB)

Plan mémoire du PIC 16C84

Adresse

Adresse

Variable

Remarque

(Déc)

(Hex)



12

0C

W_TEMP

Utilisée pour la sauvegarde du contexte

13

0D

COP_TMR0

Copie de TMR0 au moment de l'interuption pour passage par zéro sur flanc négatif du signal FM démodulé (signal Doppler)

14

0E

NO_ANT

Numéro de l'antenne virtuelle actuelle (entre 0 et 16) alors qu'il n'y a que 8 antennes réelles

15

0F

NO_SEGMENT

Entre 2 antennes virtuelle, indique si l'on se trouve dans la première ou la deuxième moitié de l'intervalle

16

10

COP_NO_ANT

Copie du NO_ANT au moment du passage par zéro du signal FM

17

11

INTERMEDI

Utilisé pour le calcul du NO_SEGMENT

18

12

HORLOGE

Un seul bit utilisé, pour indiquer l'état du signal d'horloge

19

13

NO_LED

Numéro de la LED à allumer pour indiquer la direction d'incidence de l'onde (direction de l'émetteur)

20

14

STATUS_TEMP

Utilisé lors de la sauvegarde du contexte

21

15

DIVERS_BITS

Un seul bit utilisé (NEW_MES = bit0) pour indiquer la présence d'une nouvelle mesure disponible pour le calcul de la direction

22

16

DUREE_ATT1

Utilisé pour les boucles d'attente à l'initialisation du microcontrôleur

23

17

DUREE_ATT2

Utilisé pour les boucles d'attente à l'initialisation du microcontrôleur

24

18



25

19



26

1A



27

1B



28

1C



29

1D



30

1E



31

1F



32

20



33

21



34

22



35

23



36

24



37

25



38

26



39

27



40

28



41

29



42

2A



43

2B



44

2C



45

2D



46

2E



47

2F







 

Header file (assembleur)

LIST
; P16C84.INC Standard Header File, Version 1.00 Microchip Technology, Inc.
NOLIST

; This header file defines configurations, registers, and other useful bits of
; information for the PIC16C84 microcontroller. These names are taken to match
; the data sheets as closely as possible.

; Note that the processor must be selected before this file is
; included. The processor may be selected the following ways:

; 1. Command line switch:
; C:\ MPASM MYFILE.ASM /PIC16C84
; 2. LIST directive in the source file
; LIST P=PIC16C84
; 3. Processor Type entry in the MPASM full-screen interface
;==========================================================================
;
; Revision History
;
;==========================================================================
;Rev: Date: Reason:
;1.00 10/31/95 Initial Release
;==========================================================================
;
; Verify Processor
;
;==========================================================================
IFNDEF __16C84
MESSG "Processor-header file mismatch. Verify selected processor."
ENDIF
;==========================================================================
;
; Register Definitions
;
;==========================================================================
W EQU H'0000'
F EQU H'0001'

;----- Register Files------------------------------------------------------
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
EEDATA EQU H'0008'
EEADR EQU H'0009'
PCLATH EQU H'000A'
INTCON EQU H'000B'

OPTION_REG    EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
EECON1 EQU H'0088'
EECON2 EQU H'0089'

;----- STATUS Bits --------------------------------------------------------

IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'

;----- INTCON Bits --------------------------------------------------------

GIE EQU H'0007'
EEIE EQU H'0006'
T0IE EQU H'0005'
INTE EQU H'0004'
RBIE EQU H'0003'
T0IF EQU H'0002'
INTF EQU H'0001'
RBIF EQU H'0000'

;----- OPTION Bits --------------------------------------------------------

NOT_RBPU EQU H'0007'
INTEDG EQU H'0006'
T0CS EQU H'0005'
T0SE EQU H'0004'
PSA EQU H'0003'
PS2 EQU H'0002'
PS1 EQU H'0001'
PS0 EQU H'0000'

;----- EECON1 Bits --------------------------------------------------------

EEIF EQU H'0004'
WRERR EQU H'0003'
WREN EQU H'0002'
WR EQU H'0001'
RD EQU H'0000'

;==========================================================================
;
; RAM Definition
;
;==========================================================================

__MAXRAM H'AF'
__BADRAM H'07', H'30'-H'7F', H'87'

;==========================================================================
;
; Configuration Bits
;
;==========================================================================

_CP_ON EQU H'3FEF'
_CP_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FFF'
_PWRTE_OFF EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LP_OSC EQU H'3FFC'
_XT_OSC EQU H'3FFD'
_HS_OSC EQU H'3FFE'
_RC_OSC EQU H'3FFF'

LIST

 

Le programme  (assembleur)

;****************************************************************************************
;*                                             *
;* prog.asm, version 2        par Yves OESCH, 15.01.98                 *
;*                                             *
;* Ce programme est utilisé par le PIC 16C84 dans le projet                 *
;* de radiogoniomètre à effet quasi Doppler.                         *
;* Il effectue les taches suivantes:                             *
;* - Génération de clock à 8 kHz à partir de l'horloge à 6.8025 MHz             *
;* - Mesure de l'instant du passage par zéro du signal démodulé             *
;* - Calcul du No de la LED à allumer pour indiquer la direction             *
;*                                             *
;****************************************************************************************
    LIST P=16C84, R=DEC             ;Type et base par défaut


    INCLUDE    "p16C84.inc"
W_TEMP        EQU    H'0C'         ;Sauvegarde du contexte
COP_TMR0    EQU    H'0D'         ;copie de TMR0 après un passage par 0
NO_ANT        EQU    H'0E'         ;Numéro de l'antenne virtuelle actuelle (0..15)
NO_SEGMENT    EQU    H'0F'         ;0..3, subdivision du no d'antenne
COP_NO_ANT    EQU    H'10'         ;copie de NO_ANT après pass/0
INTERMEDI    EQU    H'11'         ;résultat intermédiaire de calcul
HORLOGE        EQU    H'12'         ;bits d'horloge (8kHz)
NO_LED        EQU    H'13'         ;numéro de la LED à allumer
STATUS_TEMP    EQU    H'14'         ;sauvegarde du contexte
DIVERS_BITS    EQU    H'15'         ;diverses variables d'1 bit
DUREE_ATT1    EQU    H'17'         ;nombre de boucles d'attente avant initialisation
DUREE_ATT2    EQU    H'18'         ; (pour quartz 3 MHz: 16 et 17 respectivement)
DUREE_RST1    EQU    H'19'
DUREE_RST2    EQU    H'1A'

TMR0_INIT    SET    D'157'         ;Dépend de la fréquence horloge
DEMI        SET    D'50'         ;(255-TMR0_INIT) /2 arrondi
OPTION_INIT    SET    B'00001111'
INTCON_INIT    SET    B'10110000'
STATUS_INIT    SET    B'00000000'
TRISA_INIT    SET    B'00000000'
TRISB_INIT    SET    B'00000001'
PORTA_INIT    SET    B'00000000'
PORTB_INIT    SET    B'01000000'    ;tout à 0 sauf le reset de la tête d'antenne
NEW_MES        SET    H'0'
RESET_BIT    SET    D'6'
DUREE_ATT_INIT1    SET    D'255'         ;Nb de boucles d'attente 1: 200
DUREE_ATT_INIT2    SET    D'173'         ;Nb de boucles d'attente 2: 255
DUREE_ATT_RST1    SET    D'255'
DUREE_ATT_RST2    SET    D'75'
NO_SEGMENT_INIT    SET    H'FF'         ;equivaut à 0 si on ajoute 1 à la 1ere itération


    ORG    0
    GOTO    INITI

    ORG    4             ;Interuption    
    MOVWF    W_TEMP             ;Sauvegarde du contexte
    SWAPF    STATUS,W         ;    "
    BCF    STATUS,RP0         ;    "
    MOVWF    STATUS_TEMP         ;    "
   
    BTFSC    INTCON,INTF
    GOTO     PASS0

    MOVLW    TMR0_INIT         ;Interruption due au débordement de TMR0
    ADDWF    TMR0,1             ;(16 KHz:flanc montant et descendant à générer)
    COMF    HORLOGE,1         ;Change l'état de l'horloge
    MOVF    HORLOGE,0
    MOVWF    PORTA             ;Sort l'horloge sur le port a
    INCF    NO_ANT,1         ;Incrémente le no de l'antenne
    BTFSC    NO_ANT,4         ;réinitialise après 8 antennes
    CLRF    NO_ANT

    SWAPF    STATUS_TEMP,W         ;Rétablit le contexte
    MOVWF    STATUS             ;     "
    SWAPF    W_TEMP,F         ;    "
    SWAPF    W_TEMP,W         ;    "
    BCF    INTCON,T0IF         ;    "
    RETFIE

PASS0    MOVF    TMR0,0             ;Interruption due a un passage par 0
    MOVWF    COP_TMR0         ;copie TMR0 courant
    MOVF    NO_ANT,0         ;copie le no antenne courant
    MOVWF    COP_NO_ANT
    BSF    DIVERS_BITS,NEW_MES    ;Nouvelle mesure de direction disponible

    SWAPF    STATUS_TEMP,W         ;Rétablit le contexte
    MOVWF    STATUS             ;     "
    SWAPF    W_TEMP,F         ;    "
    SWAPF    W_TEMP,W         ;    "
    BCF    INTCON,INTF         ;    "
    RETFIE   

;-----------------------------------------------------------------------------
    ORG    50

INITI    BSF    STATUS,RP0         ;Passe en bank 1
    MOVLW    OPTION_INIT
    MOVWF    OPTION_REG
    MOVLW    TRISA_INIT
    MOVWF    TRISA
    MOVLW    TRISB_INIT
    MOVWF    TRISB
    MOVLW    STATUS_INIT
    MOVWF    STATUS
   
    CLRF    TMR0
    BCF    DIVERS_BITS,NEW_MES    ;Pas encore de passage / 0
    CLRF    COP_TMR0
    CLRF    NO_ANT
    CLRF    NO_SEGMENT
    CLRF    COP_NO_ANT
    CLRF    HORLOGE
    CLRF    PORTA
    CLRF    NO_LED
    BSF    PORTB,RESET_BIT         ;coupe l'alim de la tête d'antenne
       


                    ;Initialise le nombre de boucles a attendre
                    ;pour permettre à l'alim de tomber

WAIT2    MOVLW    DUREE_ATT_INIT1        
    MOVWF    DUREE_ATT1        
WAIT1    CLRF    TMR0             ;remet à 0 TMR0 pour éviter interruption
    DECFSZ    DUREE_ATT1,1
    GOTO WAIT1

    DECFSZ    DUREE_ATT2,1
    GOTO WAIT2

   

    BCF    PORTB,RESET_BIT         ;remet l'alim de la tête d'antenne


   

                    ;Initialise le nombre de boucles a attendre
                    ;pour permettre à l'alim de se stabiliser
                    ;avant de recommencer à compter
RST2    MOVLW    DUREE_ATT_RST1        
    MOVWF    DUREE_RST1        
RST1    CLRF    TMR0             ;remet à 0 TMR0 pour éviter interrupt
    DECFSZ    DUREE_ATT1,1
    GOTO     RST1

    DECFSZ    DUREE_ATT2,1
    GOTO     RST2

    MOVLW    INTCON_INIT         ;autorise les interuptions
    MOVWF    INTCON

    MOVLW    TMR0_INIT
    MOVWF    TMR0

;-----------------------------------------------------------------------------
; Début du calcul de direction proprement dit

DIRECT    MOVLW    NO_SEGMENT_INIT         ;Initialise N0_SEGMENT à zéro.
MOVWF    NO_SEGMENT        ;Attention au-1 car au minimum 1 incrément

ATTENTE    BTFSS    DIVERS_BITS,NEW_MES
    GOTO    ATTENTE

    MOVLW    TMR0_INIT         ;TMR0_INIT --> W
    SUBWF    COP_TMR0,0         ;COP_TMR0-TMR0_INIT --> W
    MOVWF    INTERMEDI         ;Garde l'intervalle "utile"
    MOVLW    DEMI             ;DEMI     --> W

CALCUL    INCF    NO_SEGMENT,1         ;Incrémente le no de segment
    SUBWF    INTERMEDI,1         ;Décrémente intermédi d'un DEMI
    BTFSC    STATUS,C         ;Teste si résultat >0
    GOTO    CALCUL

    RLF    COP_NO_ANT,0         ;Sinon, met les bits en forme
    ANDLW    B'00011110'         ;Division par 2 du no d'antenne, car compté au
    MOVWF    COP_NO_ANT         ;flanc montant et descendant du signal
                    ;commandant la commutation des antennes
    MOVF    NO_SEGMENT,0
    ADDWF    COP_NO_ANT,1
    COMF    COP_NO_ANT,0         ;A faire si LED tournent dans le mauvais sens

    ANDLW    B'00011111'
    MOVWF    NO_LED
    RLF    NO_LED,1
    MOVF    NO_LED,0
    MOVWF    PORTB
    BCF    DIVERS_BITS,NEW_MES
    GOTO    DIRECT

    END