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