Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
[Realisation] Gestion à distance d'un rotor d'antenne Radio
[Realisation] Gestion à distance d'un rotor d'antenne Radio
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Hello tous,
Ca prend un peu de temps parce que je mène plein de projets en même temps mais çà finit quand même par avancer.
Boitier câblé, la face avant imposant certaines dimensions avec toutes les commandes je me suis retrouvé pas mal de place libre à l'intérieur. J'en ai profité pour caser deux préamplis HF que j'avais dans mes tiroirs depuis pas mal de temps, rien à voir avec les PIC mais l'occasion a fait le larron. Cette antenne étant destinée à faire uniquement de la réception je vais l'augmenter en antenne active.
Le rotor qui sera placé sur son mât dans le grenier est aussi assemblé. Il comporte tout le système de rotation et une plaque qui recevra l'antenne boucle avect le système de commande du condensateur variable d'adaptation antenne:
Les deux parties sont reliées par un câble de 10m qui traversera la cloison, le boitier dans la station radio et l'ensemble mât/rotor/antenne dans le grenier.
Les essais sur table sont concluants, petite vidéo:
https://www.youtube.com/embed/NIfrhpU6WHk
Les fichiers .ASM:
Le fichier init:
Le fichier main:
Le fichier routines communes:
Le fichier tempos:
Le fichier routines Affichage:
Le fichier LCD_18F.inc
Le fichier LCD_18F_8Mhz.asm
Ca prend un peu de temps parce que je mène plein de projets en même temps mais çà finit quand même par avancer.
Boitier câblé, la face avant imposant certaines dimensions avec toutes les commandes je me suis retrouvé pas mal de place libre à l'intérieur. J'en ai profité pour caser deux préamplis HF que j'avais dans mes tiroirs depuis pas mal de temps, rien à voir avec les PIC mais l'occasion a fait le larron. Cette antenne étant destinée à faire uniquement de la réception je vais l'augmenter en antenne active.
Le rotor qui sera placé sur son mât dans le grenier est aussi assemblé. Il comporte tout le système de rotation et une plaque qui recevra l'antenne boucle avect le système de commande du condensateur variable d'adaptation antenne:
Les deux parties sont reliées par un câble de 10m qui traversera la cloison, le boitier dans la station radio et l'ensemble mât/rotor/antenne dans le grenier.
Les essais sur table sont concluants, petite vidéo:
https://www.youtube.com/embed/NIfrhpU6WHk
Les fichiers .ASM:
Le fichier init:
Code : Tout sélectionner
;**********************************************************************************************
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f4525 ; processeur utilisé
#include <p18f4525.inc> ; Définitions des constantes
#include <LCD_18F.inc> ; définitions des constantes LCD
;**********************************************************************************************
CONFIG OSC = INTIO67 ; Oscillateur interne 8MHz
CONFIG IESO = OFF ; Oscillateur secondaire refusé (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = ON ; Mclr configuré comme entrée
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = OFF ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
;****************************** assignations *****************************************
; commandes rotor
#define pous1 PORTA,0 ; poussoir rotor direct
#define pous2 PORTA,1 ; poussoir rotor inverse
#define pous3 PORTB,5 ; poussoir CV lent
#define pous4 PORTB,4 ; poussoir CV lent
#define pous5 PORTA,5 ; poussoir CV rapide
#define pous6 PORTA,4 ; poussoir CV rapide
#define PinLimiteRotor PORTB,3 ; fourche optique rotor limite
#define PinAngleRotor PORTB,2 ; fourche optique rotor angle
#define PinLimiteCV PORTB,1 ; fourche optique CV
#define Clk LATE,1 ; clock PAP CV
#define Cw LATE,2 ; dir PAP CV
#define H2 PORTC,1 ; Pont en H rotor
#define H1 PORTC,0 ; Pont en H rotor
#define Sens Rotor,0 ; sens de rotation du disque
#define AA_old Rotor,7 ;
;****************************** variables *************************************
CBLOCK H'0'
ENDC
CBLOCK H'80'
wreg_temps
status_temps
bsr_temps
Reg_1 :1
Reg_2 :1
Reg_3 :1
Rotor :1
Compteur :1 ; comptage des degrés
CompteurCV :1 ; comptage des pas du CV
ptrPas :1 ; compteur 16pas
tampon ; registre à tout faire
LcdLigne :1
LcdColonne :1
dividende16 :2
diviseur16 :2
quotient16 :2
reste16 :2
valeur1 :2
valeur2 :16
ptr :1
ptr2 :1
digit0 :1
digit1 :1
digit2 :1
ENDC
;**************************** adresse de depart après reset **********************************
ORG H'0'
goto init
;********************************* interruption haute priorité *********************************
ORG H'8'
retfie
;********************************* interruption basse priorité *********************************
ORG H'18'
movff STATUS,status_temps ; sauve STATUS register
movff WREG,wreg_temps ; sauve registe de travaille
movff BSR,bsr_temps ; sauve le BSR registe
movff bsr_temps,BSR ; restore BSR
movff wreg_temps,WREG ; restore registe de travail
movff status_temps,STATUS ; restore STATUS
retfie
;**********************************************************************************************
init
movlw B'01110011'
movwf OSCCON ; oscillateur à 8 Mhz
movlw B'00001111'
movwf ADCON1 ; mode analogique
clrf TRISA
movlw B'11111111'
movwf TRISA
movlw b'11111111'
movwf TRISB
clrf LATB
movlw b'00000000'
movwf TRISC
clrf LATC
movlw b'00000000'
movwf TRISD
clrf LATD
movlw b'00000000'
movwf TRISE
clrf LATE
;bra init_Antenne
bcf H1
bcf H2
; parce qu'on ne s'en servira pas
clrf dividende16+1
clrf diviseur16+1
clrf quotient16+1
clrf reste16+1
movlw d'10'
movwf diviseur16 ; il restera toujours à 10
init_LCD
LCD_INIT ; initialisation du LCD
;bra init_Antenne
call tempo1500ms
LCD_CURSEUR_OFF
LCD_CLEAR
call tempo100ms
call AffSplatch
LCD_CLEAR
nop
nop
; goto main
Le fichier main:
Code : Tout sélectionner
#include <Init Loop.asm>
; ------------- POM de l'antenne avant utilisation
init_Antenne
clrf Compteur ; RAZ du compteur
clrf Rotor
clrf CompteurCV
clrf ptrPas
bcf H1
bcf H2
call Affiche_POM
POM_Antenne
call tournePOM
bsf AA_old ; AA_old =1
btfsc PinLimiteRotor
bra POM_Antenne
call RazPontH
; ------------- On ramène le CV en position fermée
POM_CV
call tournePOMcv
btfss PinLimiteCV
bra POM_CV
call Affiche_Azimut
;*************************************** Main *******************************************************
main
;call ClsFleche
call RazPontH
nop
;call Affiche_donnees
nop
; ************** gestion poussoirs rotation antenne
poussoir_direct
btfsc pous1 ; 0 si appuyé, 1 inactif
bra poussoir_inverse
call tourneDirect
bra main
poussoir_inverse
btfsc pous2
bra poussoir_CV_direct_Lent
call tourneInverse
bra main
; ************** gestion poussoirs rotation CV
poussoir_CV_direct_Lent
btfsc pous3
bra poussoir_CV_inverse_Lent
call tourneCVdirectLent
bra main
poussoir_CV_inverse_Lent
btfsc pous4
bra poussoir_CV_direct_Rapide
call tourneCVinverseLent
bra main
poussoir_CV_direct_Rapide
btfsc pous5
bra poussoir_CV_inverse_Rapide
call tourneCVdirectRapide
bra main
poussoir_CV_inverse_Rapide
btfsc pous6
bra main
call tourneCVinverseRapide
bra main
;*************************************** Includes fichiers annexes *******************************************************
#include <RoutinesCommunes.asm> ; procédures communes
#include <routinesAffichage.asm> ; procédures affichage LCD
#include <tempos.asm> ; procédures temporisations
#include <LCD_18F_8Mhz.asm> ; include affichage LCD
end
Le fichier routines communes:
Code : Tout sélectionner
;**********************************************************************************************
;************ Routines Communes ********************************************************
;**********************************************************************************************
;***************
tournePOM
bcf H1 ; pont H
bsf H2 ; pont H
return
;***************
tournePOMcv
bcf Cw
bsf Clk
call tempo250µs
bcf Clk
call tempo250µs
return
;***************
RazPontH
bcf H1 ; pont H
bcf H2 ; pont H
return
;***************
tourneCVdirectLent
btfsc PinLimiteCV
clrf CompteurCV
; ouverture du CV
call Affiche_donnees_CV
;test de la limite d'ouverture maxi
movff CompteurCV,tampon
movlw d'180'
subwf tampon
btfsc STATUS,Z
return
; --------------
bsf Cw
bsf Clk
call tempo5ms
call tempo5ms
call tempo5ms
call tempo5ms
bcf Clk
call tempo5ms
call tempo5ms
call tempo5ms
call tempo5ms
; on incrémente CompteurCV seulement tous les 16 pas
incf ptrPas
movff ptrPas,tampon
movlw d'16'
subwf tampon
btfss STATUS,Z
return
clrf ptrPas
incf CompteurCV
incf CompteurCV
return
;***************
tourneCVinverseLent ; fermeture du CV
btfsc PinLimiteCV
clrf CompteurCV
call Affiche_donnees_CV
btfsc PinLimiteCV
return
bcf Cw
bsf Clk
call tempo5ms
call tempo5ms
call tempo5ms
call tempo5ms
bcf Clk
call tempo5ms
call tempo5ms
call tempo5ms
call tempo5ms
; on décrémente CompteurCV seulement tous les 16 pas
movf ptrPas,f ; ptrPas=0 ?
btfsc STATUS,Z
bra decCVL ; oui, on sort
decf ptrPas
return
decCVL decf CompteurCV
decf CompteurCV
movlw d'16'
movwf ptrPas
return
;***************
tourneCVdirectRapide ; ouverture du CV
btfsc PinLimiteCV
clrf CompteurCV
call Affiche_donnees_CV
;test de la limite d'ouverture maxi
movff CompteurCV,tampon
movlw d'180'
subwf tampon
btfsc STATUS,Z
return
; --------------
bsf Cw
bsf Clk
call tempo5ms
bcf Clk
call tempo5ms
; on incrémente CompteurCV seulement tous les 16 pas
incf ptrPas
movff ptrPas,tampon
movlw d'16'
subwf tampon
btfss STATUS,Z
return
clrf ptrPas
incf CompteurCV
incf CompteurCV
return
;***************
tourneCVinverseRapide ; fermeture du CV
btfsc PinLimiteCV
clrf CompteurCV
call Affiche_donnees_CV
btfsc PinLimiteCV
return
bcf Cw
bsf Clk
call tempo5ms
bcf Clk
call tempo5ms
; on décrémente CompteurCV seulement tous les 16 pas
movf ptrPas,f ; ptrPas=0 ?
btfsc STATUS,Z
bra decCV ; oui, on sort
decf ptrPas
return
decCV decf CompteurCV
decf CompteurCV
movlw d'16'
movwf ptrPas
return
;***************
tourneInverse
call comptageAngle
call Affiche_donnees_Rotor
btfss PinLimiteRotor ; retour à l'origine départ ?
bra finInverse ; si oui on sort
bsf Rotor,0 ; réglage en sens inverse pour de décomptage
bcf H1 ; pont H=0
call tempo5ms
bsf H2 ; pont H=1
call tempo5ms
btfss pous2 ; test appui poussoir
bra tourneInverse ; on continue tant qu'il est pressé
bcf H2 ; sinon on sort et RAZ du pont H
return
finInverse
bcf H2
clrf Compteur ; puisqu'on est revenu à l'origine, raz compteur
return
;***************
tourneDirect
call comptageAngle
call Affiche_donnees_Rotor
movff Compteur,tampon ; on vérifie
movlw d'172' ; mem1 (savoir si mem2>=mem1)
subwf tampon,w ; mem2
btfsc STATUS,Z ; si mem2=mem1 on sort
return
btfsc STATUS,C ; si mem2>mem1 on sort
return
bcf Rotor,0 ; réglage en sens direct pour le comptage
bsf H1 ; pont H =1
call tempo5ms
bcf H2 ; pont H =0
call tempo5ms
btfss pous1 ; test appui poussoir
bra tourneDirect ; on continue tant que'il est pressé
bcf H1 ; sinon on sort et RAZ du pont H
return
;***************
comptageAngle
btfsc PinAngleRotor
bra setAA
call tempo5ms
btfss AA_old
bra razRotor7
testSens
bcf AA_old
btfsc Sens
bra decSens
incSens incf Compteur
incf Compteur
incf Compteur
incf Compteur
bra correctionZero
decSens decf Compteur
decf Compteur
decf Compteur
decf Compteur
bra correctionZero
setAA bsf AA_old
bra correctionZero
razRotor7
bcf AA_old
correctionZero
btfss PinLimiteRotor
clrf Compteur
return
;***************
conversion_ascii_Rotor
; digit0
movff Compteur,tampon ;243
movff Compteur,ptr ;243
movff tampon,dividende16 ;243
call division16
movff quotient16,WREG ;24
mullw d'10'
movff PRODL,WREG ;240
subwf ptr,f ;3
movlw d'48'
addwf ptr,f ;51
movff ptr,digit0
; digit1
movff quotient16,tampon
movff quotient16,ptr
movff tampon,dividende16 ;243
call division16
movff quotient16,WREG ;24
mullw d'10'
movff PRODL,WREG ;240
subwf ptr,f ;3
movlw d'48'
addwf ptr,f ;51
movff ptr,digit1
; digit2
movff quotient16,tampon
movff quotient16,ptr
movff tampon,dividende16 ;243
call division16
movff quotient16,WREG ;24
mullw d'10'
movff PRODL,WREG ;240
subwf ptr,f ;3
movlw d'48'
addwf ptr,f ;51
movff ptr,digit2
return
;***************
conversion_ascii_CV
; digit0
movff CompteurCV,tampon ;243
movff CompteurCV,ptr ;243
movff tampon,dividende16 ;243
call division16
movff quotient16,WREG ;24
mullw d'10'
movff PRODL,WREG ;240
subwf ptr,f ;3
movlw d'48'
addwf ptr,f ;51
movff ptr,digit0
; digit1
movff quotient16,tampon
movff quotient16,ptr
movff tampon,dividende16 ;243
call division16
movff quotient16,WREG ;24
mullw d'10'
movff PRODL,WREG ;240
subwf ptr,f ;3
movlw d'48'
addwf ptr,f ;51
movff ptr,digit1
; digit2
movff quotient16,tampon
movff quotient16,ptr
movff tampon,dividende16 ;243
call division16
movff quotient16,WREG ;24
mullw d'10'
movff PRODL,WREG ;240
subwf ptr,f ;3
movlw d'48'
addwf ptr,f ;51
movff ptr,digit2
return
;********************************************************************
; Division sur entiers 16bits _ F6FCO
; Il faut préalablement déclarer les variables ci-dessous sur 16 bits
; dividende16, diviseur16, quotient16, reste16, valeur1 et valeur2 sur 16bits
;
; poids faible dans dividende16
; poids fort de la valeur à diviser dans dividende16+1,
;
; poids faible dans diviseur16
; poids fort du diviseur dans diviseur16+1
;
; Le résultat sera dans quotient16 et quotient16+1
; Le reste sera dans reste16 et reste16+1
;
; Cette division utilise la routine soustraction16
;
;********************************************************************
division16
; on vérifie si c'est une division par zéro, si c'est le cas on charge le dividende dans le quotient.
; dividende/0=dividende, pas cohérent mathématiquement mais nécessaire dans le projet en cas de ligne
; horizontale (Y=0) ou verticale (X=0).
movf diviseur16,diviseur16
btfss STATUS,Z
bra div16
div_zero movf diviseur16+1,diviseur16+1
btfsc STATUS,Z
bra div_quot
div16 ; on initialise quotient=0
clrf quotient16
clrf quotient16+1
; reste=dividende
movff dividende16,reste16
movff dividende16+1,reste16+1
div16_1 movf reste16+1,w
subwf diviseur16+1,w
; test si poids fort reste>diviseur ?
btfss STATUS,C
bra div16_3
; test si poids fort reste=diviseur ? sinon on sort
div16_4 bz div16_2
findiv16 return
div16_2 ; test si poids faible reste>=diviseur
movff reste16,WREG
subwf diviseur16,w
btfss STATUS,C
bra div16_3
bz div16_3
bra findiv16
div16_3 ; reste=dividende-diviseur
nop
movff reste16,valeur1
movff reste16+1,valeur1+1
movff diviseur16,valeur2
movff diviseur16+1,valeur2+1
call soustraction16 ; résultat dans valeur1, valeur1+1
movff valeur1+1,reste16+1
movff valeur1,reste16
; quotient +1
bcf STATUS,C
movlw 1
addwf quotient16
; on additionne le carry dans le poids fort
movf STATUS,C
andlw 0x1
addwf quotient16+1
bra div16_1
div_quot ; en cas de division par zéro on charge le dividende dans le quotient
movff dividende16,quotient16
movff dividende16+1,quotient16+1
return
;********************************************************************
; Soustraction sur entiers 16bits -F6FCO- *
; Il faut préalablement déclarer des variables sur 16 bits *
; valeur1:2 - valeur2:2 *
; *
; nombre fort: *
; valeur1: poids faible *
; valeur1+1: poids fort *
; *
; nombre faible à soustraire : *
; valeur2: poids faible *
; valeur2+1: poids fort *
; *
; Appeler la procédure soustraction16 et le résultat de *
; valeur1-valeur2 sur 16bits sera dans les 2 octets de valeur1 *
;********************************************************************
soustraction16
movf valeur2,w
subwf valeur1
movf valeur2+1,w
subwfb valeur1+1
movf valeur2+2,w
subwfb valeur1+2
return
Le fichier tempos:
Code : Tout sélectionner
;*********************************** routines tempos ****************************************
tempo250µs
; Délai 250 Cycles de la machine
; Durée du délai 250 microsecond
; Fréquence de l'oscillateur 4 MHZ
movlw .83
movwf Reg_1,1
decfsz Reg_1,F,1
bra $-2
return
tempo5ms
; Délai 5 000 Cycles de la machine
; Durée du délai 5 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .125
movwf Reg_1,1
movlw .7
movwf Reg_2
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
return
tempo100ms
; Délai 20 000 Cycles de la machine
; Durée du délai 10 millisecond
; Fréquence de l'oscillateur 8 MHZ
movlw .248
movwf Reg_1,1
movlw .26
movwf Reg_2
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
nop
return
tempo500ms
; Délai 500 000 Cycles de la machine
; Durée du délai 500 millisecond
; Fréquence de l'oscillateur 4 MHZ
movlw .85
movwf Reg_1,1
movlw .138
movwf Reg_2
movlw .3
movwf Reg_3
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
decfsz Reg_3
bra $-.10
return
tempo1500ms
; Délai 3 000 000 Cycles de la machine
; Durée du délai 1500 millisecond
; Fréquence de l'oscillateur 8 MHZ
movlw .13
movwf Reg_1,1
movlw .57
movwf Reg_2
movlw .16
movwf Reg_3
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
decfsz Reg_3
bra $-.10
nop
nop
return
tempo1s
; Délai 20 000 Cycles de la machine
; Durée du délai 10 millisecond
; Fréquence de l'oscillateur 8 MHZ
movlw .248
movwf Reg_1,1
movlw .26
movwf Reg_2
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
nop
return
;**********************************************************************************************
Le fichier routines Affichage:
Code : Tout sélectionner
AffSplatch
LCD_LIGNE 1
LCD_COLONNE 6
LCD_AFF_DATAS 'L'
LCD_AFF_DATAS 'O'
LCD_AFF_DATAS 'O'
LCD_AFF_DATAS 'P'
LCD_LIGNE 2
LCD_COLONNE 5
LCD_AFF_DATAS '-'
LCD_AFF_DATAS 'F'
LCD_AFF_DATAS '6'
LCD_AFF_DATAS 'F'
LCD_AFF_DATAS 'C'
LCD_AFF_DATAS 'O'
LCD_AFF_DATAS '-'
call tempo1500ms
return
Affiche_POM
LCD_LIGNE 1
LCD_COLONNE 4
LCD_AFF_DATAS ' '
LCD_LIGNE 1
LCD_COLONNE 4
LCD_AFF_DATAS 'o'
LCD_AFF_DATAS 'r'
LCD_AFF_DATAS 'i'
LCD_AFF_DATAS 'g'
LCD_AFF_DATAS 'i'
LCD_AFF_DATAS 'n'
LCD_AFF_DATAS 'e'
LCD_AFF_DATAS 's'
LCD_LIGNE 2
LCD_COLONNE 4
LCD_AFF_DATAS 's'
LCD_AFF_DATAS 'y'
LCD_AFF_DATAS 's'
LCD_AFF_DATAS 't'
LCD_AFF_DATAS 'e'
LCD_AFF_DATAS 'm'
LCD_AFF_DATAS 'e'
return
Affiche_Azimut
LCD_CLEAR
LCD_LIGNE 1
LCD_COLONNE 1
LCD_AFF_DATAS 'A'
LCD_AFF_DATAS 'z'
LCD_AFF_DATAS 'i'
LCD_AFF_DATAS 'm'
LCD_AFF_DATAS 'u'
LCD_AFF_DATAS 't'
LCD_AFF_DATAS ':'
LCD_LIGNE 2
LCD_COLONNE 5
LCD_AFF_DATAS 'C'
LCD_AFF_DATAS 'V'
LCD_AFF_DATAS ':'
call tempo1500ms
return
Affiche_donnees_Rotor
call conversion_ascii_Rotor
LCD_LIGNE 1
LCD_COLONNE 9
movff digit2,WREG
call LCD_aff_datas
movff digit1,WREG
call LCD_aff_datas
movff digit0,WREG
call LCD_aff_datas
return
Affiche_donnees_CV
call conversion_ascii_CV
LCD_LIGNE 2
LCD_COLONNE 9
movff digit2,WREG
call LCD_aff_datas
movff digit1,WREG
call LCD_aff_datas
movff digit0,WREG
call LCD_aff_datas
return
Le fichier LCD_18F.inc
Code : Tout sélectionner
;********************************************************
; - F6FCO - ;
; Librairie simplifiée affichage LCD 18F sur 8 bits ;
; juin 2020 ;
;********************************************************
; Ce fichier contient les définitions et macros nécessaires au bon fonctionnement du LCD
;------------------------------------------------
;Variables à rajouter dans le programme principal
; CBLOCK H'0'
; Reg_1
; Reg_2
; Reg_3
; LcdLigne
; LcdColonne
; ENDC
;-----------------------------------------
; connections des pins
; PIC LCD
; -----------------
; PORTD
; rd0 --> D0
; rd1 --> D1
; rd2 --> D2
; rd3 --> D3
; rd4 --> D4
; rd5 --> D5
; rd6 --> D6
; rd7 --> D7 Busy Flag BF=1 occupé BF=0 libre
; PORTC LATC = x000xxxx
; rc4 --> RW RW=0 écriture RW=1 lecture
; rc5 --> RS RS=0 envoi de commande RS=1 envoi de donnée
; rc6 --> E Enable servant à générer le créneau de validation
;-----------------------------------------
;Fonctions implémentées:
;LCD_INIT ; initialisation du LCD
;LCD_AFF_COMMANDE_W ; envoi d'une commande au LCD passage de paramètre par W
;LCD_AFF_COMMANDE ; envoi d'une commande au LCD passage de paramètre par la macro
;LCD_AFF_DATAS ; envoi du caractère a afficher.
;LCD_LIGNE_W ; choix de la ligne d'écriture passage de paramètre par W
;LCD_LIGNE ; choix de la ligne d'écriture passage de paramètre par la macro
;LCD_COLONNE_W ; choix de la colonne passage de paramètre par W
;LCD_COLONNE ; choix de la colonne pasage de paramètre pa la macro
;LCD_CURSEUR_BLINK ; fait clignoter le curseur
;LCD_CURSEUR_OFF ; éteint le curseur
;LCD_CURSEUR_FIXE ; curseur fixe
;LCD_CURSEUR_HOME ; ramène le curseur ligne 1 colonne 1
;LCD_SCROLL_DROITE ; fait défiler le texte vers la droite
;LCD_SCROLL_GAUCHE ; fait défiler le texte vers la gauche
;LCD_AFF_OFF ; désactive l'affichage
;LCD_CLEAR ; efface le LCD
;-----------------------------------------
#define Port_LAT_Datas LATD ; Port d'écriture des 8 bits de datas
#define Port_Datas PORTD ; " " "
#define Port_Service LATC ; port pour les 3 fils de commande
#define TRISDATAS TRISD
#define RS 5 ; pin pour RS RS=0 -> envoi de commande RS=1 -> envoi de données
#define RW 4 ; pin pour RW RW=0 -> écriture dans le LCD RW=1 -> lecture du LCD. Peut-être soudée à la gnd pour gagner une pin
#define En 6 ; pin pour En enable sert à générer le pulse de validation des envois
#define ligne1 0x80 ; debut ligne 1 LCD 2x16 et LCD 20x4
#define ligne2 0xc0 ; debut ligne 2 LCD 2x16 et LCD 20x4
#define ligne3 0x94 ; debut ligne 3 lCD 20x4
#define ligne4 0xD4 ; debut ligne 4 lCD 20x4
LCD_INIT macro
call LCD_init
endm
LCD_AFF_COMMANDE macro
call LCD_aff_commande
endm
LCD_AFF_DATAS macro carac
movlw carac
call LCD_aff_datas
endm
LCD_AFF_DATAS_W macro
call LCD_aff_datas
endm
LCD_LIGNE_W macro
call LCD_Ligne
endm
LCD_LIGNE macro nrligne
movlw nrligne
call LCD_Ligne
endm
LCD_COLONNE_W macro
call LCD_Colonne
endm
LCD_COLONNE macro nrcol
movlw nrcol
call LCD_Colonne
endm
LCD_CURSEUR_BLINK macro
call LCD_curseur_blink
endm
LCD_CURSEUR_OFF macro
call LCD_curseur_off
endm
LCD_CURSEUR_FIXE macro
call LCD_curseur_fixe
endm
LCD_CURSEUR_HOME macro
call LCD_curseur_home
endm
LCD_SCROLL_DROITE macro
call LCD_scroll_droite
endm
LCD_SCROLL_GAUCHE macro
call LCD_scroll_gauche
endm
LCD_AFF_OFF macro
call LCD_aff_off
endm
LCD_CLEAR macro
call LCD_clear
endm
RW0 macro
bcf Port_Service,RW
endm
RW1 macro
bsf Port_Service,RW
endm
RS0 macro
bcf Port_Service,RS
endm
RS1 macro
bsf Port_Service,RS
endm
En1 macro
bsf Port_Service,En
endm
En0 macro
bcf Port_Service,En
endm
; -----------------------------------------------------
; COMMANDES LCD
; 0x38 mode 2 lignes et matrice 5x7
; 0x01 clear LCD
; 0x02 curseur home
; 0x05 déplacer le curseur vers la droite, déplacer l'affichage (gauche
; 0x06 déplacer le curseur vers la droite, affichage fixe
; 0x07 déplacer le curseur vers la droite, déplacer l'affichage vers la gauche
; 0x0e affichage activé, curseur activé, curseur fixe
; 0x0f affichage activé, curseur activé, curseur clignotant
; 0x10 déplacer le curseur vers la gauche
; 0x14 déplacer le curseur vers la droite
; 0x18 déplacer l'affichage vers la gauche
; 0x1c déplacer l'affichage vers la droite
; 0x80 forcer le curseur en début de 1ere ligne
; 0x83 aller a la premiere ligne position 3, etc.
; 0x3c activer la deuxième ligne
; 0xc0 forcer le curseur en début de 2eme ligne
; 0xc1 aller à la 2eme ligne position 1
; 0xC2 aller a la 2eme ligne position 2, etc.
; 0x08 affichage off, curseur off
; 0x0c affichage ON, curseur OFF
; 0x80 début de la ligne 1
; 0xC0 début de la ligne 2
; 0x94 début de la ligne 3
; 0xd4 début de la ligne 4
Le fichier LCD_18F_8Mhz.asm
Code : Tout sélectionner
;********************************************************
; - F6FCO - ;
; Librairie simplifiée affichage LCD 18F sur 8 bits ;
; juin 2020 ;
;********************************************************
; Ce fichier contient les définitions et macros nécessaires au bon fonctionnement du LCD
;------------------------------------------------
;Variables à rajouter dans le programme principal
; CBLOCK H'0'
; Reg_1
; Reg_2
; Reg_3
; LcdLigne
; LcdColonne
; ENDC
;-----------------------------------------
; connections des pins
; PIC LCD
; -----------------
; PORTD
; rd0 --> D0
; rd1 --> D1
; rd2 --> D2
; rd3 --> D3
; rd4 --> D4
; rd5 --> D5
; rd6 --> D6
; rd7 --> D7 Busy Flag BF=1 occupé BF=0 libre
; PORTC
; rc4 --> RW RW=0 écriture RW=1 lecture
; rc5 --> RS RS=0 envoi de commande RS=1 envoi de donnée
; rc6 --> E Enable servant à générer le créneau de validation
;-----------------------------------------
;Fonctions implémentées:
;LCD_INIT ; initialisation du LCD
;LCD_AFF_COMMANDE_W ; envoi d'une commande au LCD passage de paramètre par W
;LCD_AFF_COMMANDE ; envoi d'une commande au LCD passage de paramètre par la macro
;LCD_AFF_DATAS ; envoi du caractère a afficher.
;LCD_LIGNE_W ; choix de la ligne d'écriture passage de paramètre par W
;LCD_LIGNE ; choix de la ligne d'écriture passage de paramètre par la macro
;LCD_COLONNE_W ; choix de la colonne passage de paramètre par W
;LCD_COLONNE ; choix de la colonne pasage de paramètre pa la macro
;LCD_CURSEUR_BLINK ; fait clignoter le curseur
;LCD_CURSEUR_OFF ; éteint le curseur
;LCD_CURSEUR_FIXE ; curseur fixe
;LCD_CURSEUR_HOME ; ramène le curseur ligne 1 colonne 1
;LCD_SCROLL_DROITE ; fait défiler le texte vers la droite
;LCD_SCROLL_GAUCHE ; fait défiler le texte vers la gauche
;LCD_AFF_OFF ; désactive l'affichage
;LCD_CLEAR ; efface le LCD
; ------------------------- Initialisation du LCD
LCD_init
call tempo15ms
call tempo15ms
call tempo15ms
movlw 0x38 ; 0x38 mode 2 lignes et matrice 5x7
call LCD_aff_commande
movlw 0x0e ; 0x0e affichage activé, curseur activé, curseur fixe
call LCD_aff_commande
movlw 0x06 ; 0x06 déplacer le curseur vers la droite, affichage fixe
call LCD_aff_commande
movlw 0x01 ; 0x01 clear LCD
call LCD_aff_commande
movlw ' ' ; Forçage d'un espace au premier caractère sinon le déplacement ne s'effectue pas
call LCD_aff_datas
movlw 0x80
movwf LcdLigne ; mise en mem de l'adr de la premiere ligne
call tempo50µs
return
; ------------------------- affichage d'une commande
; ; avec scrutation du buzy flag
LCD_aff_commande
movwf Port_LAT_Datas ; movwf LATD ; envoi sur le port datas
RS0 ; bcf LATC,5 ; RS0 envoi d'une commande
En1 ; bsf LATC,6 ; En1 front montant du créneau de validation
movlw b'10000000' ; bit 7 en entrée pour lire le busy flag
movwf TRISDATAS ; movwf TRISD
RW1 ; bsf LATC,4 ; RW1 on passe en lecture du lcd
; ----------------- Test du busy Flag (bit7 du port Datas
movff Port_LAT_Datas,Reg_1 ;movff PORTD,Reg_1 ; sauvegarde du port data
movlw b'10000000' ; on isole le bit 7
andwf Reg_1,f
buzy_c
;btfsc STATUS,Z
;bra buzy_c
call tempo700µs
; -----------------
call tempo50µs
RW0 ;bcf LATC,4 ; RW0 on repasse en écriture
movlw b'00000000' ; bit 7 remis en sortie
movwf TRISDATAS ; movwf TRISD
En0 ; bcf LATC,6 ; En0 front descendant du creneau de validation
return
; ------------------------- affichage d'une commande
; avec tempo
LCD_aff_commande_old
nop
nop
movwf Port_LAT_Datas
RS0
En1
call tempo700µs
En0
return
; ------------------------- Affichage d'une donnée (caractère)
; avec scrutation du buzy flag
LCD_aff_datas
clrf Port_LAT_Datas
movwf Port_LAT_Datas ; envoi sur le port datas
bsf Port_Service,5 ; RS1 envoi d'un data
bsf Port_Service,6 ; En1 front montant du créneau de validation
movlw b'10000000' ; bit 7 en entrée pour lire le busy flag
movwf TRISDATAS
bsf Port_Service,4 ; RW1 on passe en lecture du lcd
; ----------------- Test du busy Flag (bit7 du port Datas
movff Port_LAT_Datas,Reg_1 ; sauvegarde du port data
movlw b'10000000' ; on isole le bit 7
andwf Reg_1,f
buzy_d
;btfss STATUS,Z
;bra buzy_d
call tempo700µs
; -----------------
call tempo50µs
bcf Port_Service,4 ; RW0 on repasse en écriture
movlw b'00000000' ; bit 7 remis en sortie
movwf TRISDATAS
bcf Port_Service,6 ; En0 front descendant du creneau de validation
return
; ------------------------- Affichage d'une donnée (caractère)
; avec tempo
LCD_aff_datas_old
movwf Port_LAT_Datas
RS1
En1
call tempo700µs
En0
return
; ------------------------- choix de la ligne d'affichage
LCD_Ligne
movwf LcdLigne
sublw 4
bz lcdligne4
movf LcdLigne,w
sublw 3
bz lcdligne3
movf LcdLigne,w
sublw 2
bz lcdligne2
movf LcdLigne,w
sublw 1
bz lcdligne1
lcdligne1
movlw ligne1 ; adr début ligne1
movwf LcdLigne ; mise en mem de l'adresse début de ligne 1
bra finlcdligne
lcdligne2
movlw ligne2 ; adr début ligne2
movwf LcdLigne ; mise en mem de l'adresse début de ligne 2
bra finlcdligne
lcdligne3
movlw ligne3 ; adr début ligne3
movwf LcdLigne ; mise en mem de l'adresse début de ligne 3
bra finlcdligne
lcdligne4
movlw ligne4 ; adr début ligne4
movwf LcdLigne ; mise en mem de l'adresse début de ligne 4
finlcdligne
return
; ------------------------- choix de la colonne d'affichage
LCD_Colonne
addlw -1 ; on soustrait 1 à W
addwf LcdLigne,w
call LCD_aff_commande
return
;------------------------- curseur clignotant
LCD_curseur_blink
movlw 0x0f
call LCD_aff_commande
return
;------------------------- curseur désactivé
LCD_curseur_off
movlw 0x0c
call LCD_aff_commande
return
;------------------------- curseur fixe
LCD_curseur_fixe
movlw 0x0e
call LCD_aff_commande
return
;------------------------- curseur home
LCD_curseur_home
movlw 0x02
call LCD_aff_commande
return
;------------------------- déplace l'affichage vers la droite
LCD_scroll_droite
movlw 0x1c
call LCD_aff_commande
return
;------------------------- déplace l'affichage vers la gauche
LCD_scroll_gauche
movlw 0x18
call LCD_aff_commande
return
;------------------------- affichage off
LCD_aff_off
movlw 0x08
call LCD_aff_commande
return
;------------------------- efface le LCD
LCD_clear
movlw 0x01
call LCD_aff_commande
;call tempo50µs
return
; ------------------------- tempos
tempo700µs ; pour 8mhz
; Délai 1 600 Cycles de la machine
; Durée du délai 800 microsecond
; Fréquence de l'oscillateur 8 MHZ
movlw .18
movwf Reg_1,1
movlw .3
movwf Reg_2
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
nop
return
tempo15ms ; pour 8mhz
; Délai 1 200 Cycles de la machine
; Durée du délai 600 microsecond
; Fréquence de l'oscillateur 8 MHZ
movlw .141
movwf Reg_1,1
movlw .2
movwf Reg_2
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
nop
nop
return
tempo50µs
; Délai 100 Cycles de la machine
; Durée du délai 50 microsecond
; Fréquence de l'oscillateur 8 MHZ
movlw .33
movwf Reg_1,1
decfsz Reg_1,F,1
bra $-2
return
; COMMANDES LCD
; 0x38 mode 2 lignes et matrice 5x7
; 0x01 clear LCD
; 0x02 curseur home
; 0x05 déplacer le curseur vers la droite, déplacer l'affichage (gauche
; 0x06 déplacer le curseur vers la droite, affichage fixe
; 0x07 déplacer le curseur vers la droite, déplacer l'affichage vers la gauche
; 0x0c affichage activé, curseur désactivé
; 0x0e affichage activé, curseur activé, curseur fixe
; 0x0f affichage activé, curseur activé, curseur clignotant
; 0x10 déplacer le curseur vers la gauche
; 0x14 déplacer le curseur vers la droite
; 0x18 déplacer l'affichage vers la gauche
; 0x1c déplacer l'affichage vers la droite
; 0x80 forcer le curseur en début de 1ere ligne
; 0x83 aller a la premiere ligne position 3, etc.
; 0x3c activer la deuxième ligne
; 0xc0 forcer le curseur en début de 2eme ligne
; 0xc1 aller à la 2eme ligne position 1
; 0xC2 aller a la 2eme ligne position 2, etc.
; 0x08 affichage off, curseur off
; 0x0c affichage ON, curseur OFF
; 0x80 début de la ligne 1
; 0xC0 début de la ligne 2
; 0x94 début de la ligne 3
; 0xd4 début de la ligne 4
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
[Realisation] Gestion à distance d'un rotor d'antenne Radio
[Realisation] Gestion à distance d'un rotor d'antenne Radio
Bonjour F6FC0 et bonjour à tous.
Sympa avec une vidéo en plus Le résultat est top. Tu as de la place dans la boîte je trouve ça cool car aujourd'hui le moindre millimètres est rempli et pas simple d'intervenir
Bon courage pour la suite.
Pour ceux qui est des codes ASM, je laisse soins à d'autres de t'envoyer des éloges. C'est pas mon domaine.
@++
Sympa avec une vidéo en plus Le résultat est top. Tu as de la place dans la boîte je trouve ça cool car aujourd'hui le moindre millimètres est rempli et pas simple d'intervenir
Bon courage pour la suite.
Pour ceux qui est des codes ASM, je laisse soins à d'autres de t'envoyer des éloges. C'est pas mon domaine.
@++
[Realisation] Gestion à distance d'un rotor d'antenne Radio
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Hello,
Oui, c'est magique ces microcontrôleur, faire beaucoup avec peu de composants, j'imagine s'il avait fallu faire çà avec de l'électronique conventionnelle , même en logique TTL ou CMOS çà aurait demandé un circuit plus conséquent.
Je vais maintenant continuer le projet en installant le rotor dans le grenier, construire l'antenne boucle réception et faire les essais. Même si çà ne relève plus du PIC je viendrai vous poster le résultat, histoire de finaliser le projet.
Pourvu que Murphy ne traîne pas dans le coin
Oui, c'est magique ces microcontrôleur, faire beaucoup avec peu de composants, j'imagine s'il avait fallu faire çà avec de l'électronique conventionnelle , même en logique TTL ou CMOS çà aurait demandé un circuit plus conséquent.
Je vais maintenant continuer le projet en installant le rotor dans le grenier, construire l'antenne boucle réception et faire les essais. Même si çà ne relève plus du PIC je viendrai vous poster le résultat, histoire de finaliser le projet.
Pourvu que Murphy ne traîne pas dans le coin
[Realisation] Gestion à distance d'un rotor d'antenne Radio
- F6FCO
Expert- Messages : 1413
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Hello tous,
Quelques nouvelles du front, le système à été installé dans le grenier au bout de 10m de câble 8 conducteurs ou transitent les signaux de commandes issus du PIC. Je craignais des chutes de niveau dues à la longueur mais tout fonctionne bien.
Et le boitier de commande à trouvé sa place définitive dans la station:
Quelques nouvelles du front, le système à été installé dans le grenier au bout de 10m de câble 8 conducteurs ou transitent les signaux de commandes issus du PIC. Je craignais des chutes de niveau dues à la longueur mais tout fonctionne bien.
Et le boitier de commande à trouvé sa place définitive dans la station:
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
[Realisation] Gestion à distance d'un rotor d'antenne Radio
[Realisation] Gestion à distance d'un rotor d'antenne Radio
Gérard a écrit ::bravo: du beau travail.
Tout a fait. Et en plus pas de perte. Que demande le peuple...
Des sous
@++
[Realisation] Gestion à distance d'un rotor d'antenne Radio
Bonsoir Gérard, venom, F6FCO, et tout le forum,
Idem sur ce qui à était dit,
pour le retour de cette réalisation.
Apparemment tu reçois déjà les messages des martiens, vu que .é..... ta répondu..
A+
venom a écrit :Source du message Gérard a écrit :
du beau travail.
Tout a fait. Et en plus pas de perte. Que demande le peuple...
Des sous
Idem sur ce qui à était dit,
pour le retour de cette réalisation.
Apparemment tu reçois déjà les messages des martiens, vu que .é..... ta répondu..
A+
[Realisation] Gestion à distance d'un rotor d'antenne Radio
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 82 invités