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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Tachymètre
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#11 Message par JMarc » ven. 13 janv. 2017 16:59

Bonjour Paulfjujo

JMarc a écrit :Les vitesses seront mini 400 tr/mn et maxi 2500 tr/mn

J'ai besoin dans un premier temps d'espionner le capteur hall du ventilateur qui refroidit le circuit de refroidissement d'un engin de chantier qui est asservi par un calculateur qui contrôle sa rotation. Il me reste à déterminer le nombres d'impulsions sur un tour

Si ce premier montage fonctionne, je souhaiterai corriger les données envoyé du capteur hall vers le calculateur pour pouvoir le laisser fonctionner en plein régime sans avoir un code défaut afficher sur le tableau de bord.



Pas besoin de précision, a 100 t/mn près c'est ok

Je verrai une fois branché si mon montage m'indique le même nombre que le compte tour de l'engin et si non je diviserai en conséquence :sifflotte:

Tachymètre
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#12 Message par Guest » ven. 13 janv. 2017 17:25

bon j'ai fait un peu de la calculette.

et c'est pas bon
Modifié en dernier par Anonymous le sam. 14 janv. 2017 11:36, modifié 1 fois.

Tachymètre
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » ven. 13 janv. 2017 18:52

JMarc a écrit : .. Pas besoin de précision, a 100 t/mn près c'est ok



Dans ce cas, ton choix au post#4 est largement suffisant.
Aide toi, le ciel ou FantasPic t'aidera

Tachymètre
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#14 Message par Guest » sam. 14 janv. 2017 12:25

maï a écrit :Si tu veux faire comme ça, fait comme tu sens.Sinon je me répète voir bigonoff.


Sinon,si tu utilises un 18F le Timer3 ou le TIMER1 est le paramètre Temps et RC2 ou RC1 entrée comptage à chaque int du Time3 le NB d’impulsions est recopie dans le registre CCPR et comme tu as 2 modules capture soit dans le CCPR1 ou le CCPR2.Voir la DS pour les autres registres pour la config .

Mais fait comme tu le sens.


Houps c'est une int de CCPIF et non pas de TIMER3 .Trompé, le maï

Tachymètre
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#15 Message par JMarc » sam. 14 janv. 2017 14:43

Bonjour Maï et Paulfjujo

Je vais sûrement faire comme #4, avec l'afficheur Lcd et le 16f877

J'ai trouvé une site "fribotte" qui explique le branchement. J'essaie de câbler et faire fonctionner mon lcd avec leur programme de demo et je vous tiens au courant pour la suite :sifflotte:

Merci

Tachymètre
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#16 Message par JMarc » sam. 14 janv. 2017 19:24

Bonjour

des nouvelles...

Le cablage fonctionne :-D , j'ai un peu modifié le programme pour comprendre le fonctionnement, c'est genial :wink:
Maintenant je me penche sur l’acquisition des données.

ci-joint juste la gestion de l'afficheur

Code : Tout sélectionner

   ;********************************************************************
;
                descriptif du projet:
;               
Tachymetre afficheur lcd

;
;;********************************************************************
;
;
                Auteur    :JMarc, MaïPaulfjujo et qui le veux aussi
;                Version    :1.0
;                Date    :  2017
;                                                                     
;    
Auteur source de la gestion du LcdJulien Fribotte             
;                                                                              
;     
Modifié par JMP pour Fantaspic   ;
;*******************************************************************************
;
            Note:PIC 16F877a 
; ;                                
;*******************************************************************************
    
ERRORLEVEL-302
    
   
list       p=16f877         ;liste directive du 16F877
   
#include    "p16f877.inc"

;********************** chargement des Macros **********************************   

;***************************** 
Configuation des fuses **************************
;            
CONFIG
__config 0x3D3A
;__CONFIG _FOSC_HS _WDTE_OFF _PWRTE_OFF _CP_OFF _BOREN_OFF _LVP_OFF _CPD_OFF _WRT_OFF
;
    
__CONFIG   _CP_OFF _DEBUG_OFF _WRT_ENABLE_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _PWRTE_OFF _WDT_OFF _HS_OSC

        
;_CP_OFF        Pas de protection
        
;_DEBUG_OFF        RB6 et RB7 en utilisation normale
        
;_WRT_ENABLE_OFF    Le programme ne peut pas écrire dans la flash
        
;_CPD_OFF               Mémoire EEprom déprotégée
        
;_LVP_OFF        RB3 en utilisation normale
        
_BODEN_OFF        Reset tension hors service
        
;_PWRTE_ON        Démarrage temporisé
        
;_WDT_OFF        Watchdog hors service
        
;_HS_OSC        Oscillateur haute vitesse (4Mhz<F<20Mhz)

;
;
;***********************
 déclaration des variables *****************************


;  
Brochage du PIC sur la carte :
;
;  
Port Broche E/Nom             Description
;       |        |     |                 | Port D affecté à la commande de LCD
;  RD0  |    19  |  S  RS         Sortie Broche RS du LCD 
;  RD1  |    20  |  S  R/W         Sortie Broche Read/write du LCD
;  RD2  |    21  |  S  E         Sortie broche Enable du LCD
;  RD3  |    22  |     |                 | NC
;  RD4  |    27  |  S  DB4          Sortie bit 4 du LCD
;  RD5  |    28  |  S  DB5             Sortie bit 5 du LCD
;  RD6  |    29  |  S  DB6           Sortie bit 6 du LCD
;  RD7  |    30  |  S  DB7         Sortie bit 7 du LCD


;**********************************************************************
;                                                                     *
;   
I/O    Defines                                                          *
;                                                                     *
;                                                                     *
;**********************************************************************

LCD_DATA_PORT    EQU    PORTD        le port du LCD
LCD_DATA_TRIS    EQU    TRISD        
la config du port du LCD

LCD_RS        EQU    0        
Sortie Broche RS du LCD 
LCD_RS_VALUE    EQU    1        
;  correspond a 1 en decimal
LCD_RW        EQU    1        
Sortie Broche Read/write du LCD
LCD_E        EQU    2        
Sortie broche Enable du LCD


;**********************************************************************
;                                                                     *
;   
autres Defines                                                  *
;                                                                     *
;                                                                     *
;**********************************************************************
;*********************** 
Déclarations des définitions **************************
#DEFINE    _XTAL_FREQ  .4000000        ;ici FOSC =4MHz
        
#DEFINE BP_Plus PORTB,0
#DEFINE    BP_Val PORTB,1

        
;*********************** Assignations ou constantes ****************************
DRAM    EQU 0x20         ;début Mémoire Ram banque0
    

;***** LCD Config
LCD_SET_MATRIX    EQU    0        
-> Matrices de 5*11-> Matrices de 5*(defaut 0)
LCD_SET_DISPLAY    EQU    1        -> Display LCD On-> Display LCD Off (defaut 1)
LCD_SET_CURSOR    EQU    1        -> Cursor On-> Cursor Off (defaut 1)
LCD_SET_BLINK    EQU    0        -> blink character at cursor position On-> Off (defaut 0)
LCD_SET_DIRECT    EQU    1        -> to the right-> to the left (defaut 1)
LCD_SET_SCROLL    EQU    0        -> Scroll display-> do not scroll (defaut 0)



;**********************************************************************
;                                                                     *
;    
Variables                                                        *
;                                                                     *
;                                                                     *
;**********************************************************************

;***** 
Variable de temporisation
tempo50µ    EQU    0x20        
Variable tempo 50 µs
tempo10ms    EQU    0x21        
Variable tempo 10 ms
tempo1s        EQU    0x22        
Variable tempo 1s

;***** LCD Var
LCD_TEMP    EQU    0x23        Variable temporaire pour le LCD
LCD_CHAR    EQU    0x24        
Variable temporaire pour les caracteres du LCD
LCD_CHAR_HEXA    EQU    0x25        
Variable temporaire pour les nombres hexadecimaux du LCD
LCD_CMP_PRINTF    EQU    0x26        
Compteur pour le printf

Group_Local udata 0x30
ComptSu        res 1            
;comteur seconde
Temp        res    1            
;compteur temps    
Sauv        res 2            
;pour sauvegarde registres lors INT
    
        
;*******************************************************************************


;*********************** 
TOUT COMMENCE ICI *************************************
    
org 0X00            ;au rest le pointeur instruction est ICI
    
GOTO debut            ;saut sur le label debut

    org 0X04
    MOVWF   Sauv            
;sauve W
    SWAPF   STATUS
,W        
    
MOVWF   Sauv+1            ;sauve status
    
    BTFSS    PIR1
,TMR1IF        ;test flag si TIMER1
    
GOTO    Int0            ;NON
    
    MOVLW    0x3C            
int toute le 100ms    
    MOVWF    TMR1H
    MOVLW    0xB3
    movwf   TMR1L
    
    BCF    PIR1
,TMR1IF        ;RAZ du drapeau de TMR1
    INCF    Temp
,F            à 10 cela fera 1s
    
GOTO    IntS
    
Int0    
reserve pour tmr0 
    

    
IntS    SWAPF    Sauv
+1,0
    MOVWF    STATUS            
;restaure status
    SWAPF    Sauv

    SWAPF    Sauv
0        ;restaure W

    RETFIE
    
;**********ici c'est votre programme principale ou main ************************
debut
;*********************** Mise a zéro de la mémoire RAM banque0 *****************
    
    MOVLW    DRAM
    MOVWF   FSR
Effa    CLRF    INDF
    INCF    FSR,F            ;RAZ RAM
    BTFSS    FSR,7
    GOTO    Effa
;*********************** Initialisation des ports ******************************

    CLRF   PORTA
    CLRF   PORTB            ;efface les sorties des ports
    CLRF   PORTC
    CLRF   PORTD
 Banque1                ;accés bank1
    
    CLRF   TRISA            ;RA:RA5    en sortie
    
    MOVLW  B'
00000111'        ;RB0:RB1 en entrées
    MOVWF   TRISB
    
    CLRF   TRISC            ;RC0:RC7 en sortie
    CLRF    TRISD           ;RD0:RD7 en sortie
   
    MOVLW   B'
00000110'        ;PORTA digitale
    MOVWF   ADCON1

;*********************** validation des INT ************************************
 
;******************* Initialisation des timers/compteurs ***********************       
;               
;*******************************************************************************


    
 Banque0    


    clrf    ComptSu
    
;********************** fixation des variables *********************************

;********************** Boucle principale **************************************    
;BouP    GOTO    BouP    
        CALL    LCD_INIT


    ; affichage d'
un coucou

        CALL LCD_LOCATE_LINE0
        MOVLW    Printf_Coucou
        CALL    LCD_PRINTF


        CALL LCD_LOCATE_LINE1
        MOVLW    Printf_jmp
        CALL    LCD_PRINTF

        
pause de 2 s
        CALL    Wait1s
        CALL    Wait1s

        CALL LCD_LOCATE_LINE0

        CALL    LCD_CLEAR
        

        CALL LCD_LOCATE_LINE1
        MOVLW    Printf_jmp_Made
        CALL    LCD_PRINTF


BouP
        decf    ComptSu
,f


        CALL    Wait1s
        CALL    LCD_CLEAR

        CALL LCD_LOCATE_LINE0
        MOVLW    Printf_jmp
        CALL    LCD_PRINTF
        

        CALL LCD_LOCATE_LINE1
        movfw   ComptSu
        CALL    LCD_SEND_DECI

    
GOTO    BouP
            
boucle principale



;**********************************************************************
;                                                                     *
;    
Les pauses a 20Mhz                                        *
;                                                                     *
;                                                                     *
;**********************************************************************


;***** 
Attente de 1 s (exactement 1.00204 s)
Wait1s
        MOVLW    D
'99'        ;    99 fois
        MOVWF    tempo1s        
stockage dans la variable tempo1s
T1sboucle    CALL    Wait10ms
        DECFSZ    tempo1s
,1    décremente et test
        
GOTO    T1sboucle    on boucle tant que <>0  
        
RETURN

;***** 
Attente de 15 ms (exactement 14.99 ms)
Wait15ms
        MOVLW    D
'149'        ;    149 fois
        MOVWF    tempo10ms    
stockage dans la variable tempo10ms
T15msboucle    CALL    Wait100µs
        DECFSZ    tempo10ms
,1    décremente et test
        
GOTO    T15msboucle    on boucle tant que <>0
        
RETURN


;***** 
Attente de 10 ms (exactement 10.02 ms)
Wait10ms
        MOVLW    D
'198'        ;    198 fois
        MOVWF    tempo10ms    
stockage dans la variable tempo10ms
T10msboucle    CALL    Wait50µs
        DECFSZ    tempo10ms
,1    décremente et test
        
GOTO    T10msboucle    on boucle tant que <>0
        
RETURN

;***** 
Attente de 1.5 ms (exactement ms)
Wait1.5ms
        MOVLW    D
'29'        ;    29 fois
        MOVWF    tempo10ms    
stockage dans la variable tempo10ms
T1.5msboucle    CALL    Wait50µs
        DECFSZ    tempo10ms
,1    décremente et test
        
GOTO    T1.5msboucle    on boucle tant que <>0
        
RETURN

;***** 
Attente de 100 µs (exactementen comptant le temps d'appel)
Wait100µs    
        MOVLW    D'
165'        ;    165 fois
        MOVWF    tempo50µ    ; stockage dans la variable tempo50µ
T100µsboucle    DECFSZ    tempo50µ,1    ; décremente et test
        GOTO    T100µsboucle    ; on boucle tant que <>0  0.2*3=0.6 µs en tout
        RETURN


;***** Attente de 50 µs (exactement, en comptant le temps d'
appel)
Wait50µs    NOP
        NOP
        MOVLW    D
'81'        ;    81 fois
        MOVWF    tempo50µ    
stockage dans la variable tempo50µ
T50µsboucle    DECFSZ    tempo50µ
,1    décremente et test
        
GOTO    T50µsboucle    on boucle tant que <>0  0.2*3=0.6 µs en tout
        
RETURN


;***** 
Attente de 1 µs (exactementen comptant le temps d'appel)
Wait1µs        NOP
        RETURN


;**********************************************************************
;                                                                     *
;    Programmes de gestion de l'
afficheur LCD                            *
;                                                                     *
;                                                                     *
;**********************************************************************

LCD_INIT
    CLRF    LCD_DATA_PORT    
effacement du LCD_DATA_PORT

    
Selectionne le LCD_DATA_PORT en sortie

    BSF    STATUS
RP0    Bank 1 selectonnee
    CLRF    LCD_DATA_TRIS    
Port en sortie
    BCF     STATUS
,    RP0    Bank 0 selectonnee

    CALL    Wait15ms    
attente de 15ms pour que le LCD boote

    
system set (premier)

    
MOVLW    B'00110000'    Demande du mode 4 bit
    CALL    LCD_SEND
    CALL    LCD_SEND
    CALL    LCD_SEND
    MOVLW    
B'00100000'    Demande du mode 4 bit
    CALL    LCD_SEND    

    
System set (deuxieme) + reglage de la taille des matrices
    MOVLW    
B'00100000'
    
CALL    LCD_SEND
    MOVLW    
B'10000000' LCD_SET_MATRIX B'01000000'
    
CALL     LCD_SEND
            
    
Set ON/OFF
    MOVLW    
B'00000000'
    
CALL     LCD_SEND
    
Display offcursor offblink off
    MOVLW    
B'10000000' LCD_SET_DISPLAY B'01000000' LCD_SET_CURSOR B'00100000' LCD_SET_BLINK B'00010000'
    
CALL     LCD_SEND

    CALL     LCD_CLEAR    
Clear screen    

    
Set entry mode
    MOVLW    
B'00000000'
    
CALL     LCD_SEND
    
Increment cursor to the rightwhen writingdon't shift screen
    MOVLW    B'
01000000' + LCD_SET_DIRECT * B'00100000' + LCD_SET_SCROLL * B'00010000'
    CALL     LCD_SEND

    RETURN


;    Envois d'
une donnee sur le LCDPassee en parametre dans W
LCD_SEND_NO_WAIT
    MOVWF    LCD_TEMP        
On met W sans LCD_TEMP

    MOVF    LCD_TEMP
W        mise sur le port D de la donnee
    MOVWF    LCD_DATA_PORT        
;    /
    
NOP
    BSF    LCD_DATA_PORT
,LCD_E    mise à 1 de E (validation)
    
NOP
    NOP
    NOP                
delai de 450 ns a respecter ...
    
BCF    LCD_DATA_PORT,LCD_E    mise à 0 de E

    
RETURN

;    
Envois d'une donnee sur le LCD. Passee en parametre dans W
;    Attente de 40 µs mini ensuite
LCD_SEND

    CALL    LCD_SEND_NO_WAIT

    CALL    Wait50µs        ; on attends plus de 40us (prise en compte de la commande, et attente de la fin de celle-ci)

    RETURN


;    Envois d'
un caractere ASCII sur le LCDPasse en parametre dans W
LCD_SEND_CHAR
    MOVWF    LCD_CHAR        
On met W sans LCD_CHAR

    ANDLW    0xF0            
masquage des bit de poids faible
    ADDLW    LCD_RS_VALUE        
on y ajoute LCD_RS_VALUE
    CALL    LCD_SEND_NO_WAIT    
on envoit a l'afficheur


    SWAPF    LCD_CHAR, W            ; passage des bits de poids faibles en poids fort
    ANDLW    0xF0            ; masquage des bit de poids faible
    ADDLW    LCD_RS_VALUE        ; on y ajoute LCD_RS_VALUE            

    CALL    LCD_SEND        ; on envoit a l'
afficheur
    
    
fini

    
RETURN


;    
Envois d'un nombre sur le LCD, ecrit en hexa. Passe en parametre dans W
LCD_SEND_HEXA

    SWAPF    LCD_CHAR_HEXA, W    ; On met W sans LCD_CHAR_HEXA, 
                    ; passage des bits de poids faibles en poids fort
    ANDLW    0xF0            ; masquage des bit de poids faible
    
    ADDLW    6            ; on y ajoute 6
    MOVWF    LCD_TEMP        ; On met W sans LCD_TEMP
    BTFSC    LCD_TEMP, 4            ; si le bit 3 est a 1
    ADDLW    "A"-"9"-1        ; on ajoute le code ascii de A moins celui de 0
    ADDLW    "0" - 6         ; on ajoute le code ascii de 0, moins les 5
                    ;     on a maintenant le code ascii dans W
    CALL    LCD_SEND_CHAR        ; qu'
on affiche ...

    
MOVF    LCD_CHAR_HEXAW    on remet LCD_CHAR_HEXA dans W
    ANDLW    0x0F            
masquage des bit de poids forts
    ADDLW    6            
on y ajoute 6
    MOVWF    LCD_TEMP        
On met W sans LCD_TEMP
    BTFSC    LCD_TEMP
4            si le bit 3 est a 1
    ADDLW    
"A"-"9"-1        on ajoute le code ascii de A moins celui de 0
    ADDLW    
"0" 6         on ajoute le code ascii de 0moins les 6
                    
;     on a maintenant le code ascii dans W
    CALL    LCD_SEND_CHAR        
qu'on affiche ...
    
    RETURN    

;
;    Envois d'
un octet sur le LCDecrit en decimal toujours sur 3 chiffresPasse en parametre dans W
;
LCD_SEND_DECI

    MOVWF    LCD_CHAR_HEXA        
On met W sans LCD_CHAR_HEXA

    ; 
Calcul des centaines

    MOVLW    
"0"            On met le code ascii de 0 dans LCD_CHAR
    MOVWF    LCD_CHAR        
;    "

LCD_SEND_DECIMAL_100
    MOVF    LCD_CHAR_HEXA, W
    ADDLW    -D'100'
    BTFSS    STATUS, C
    GOTO    $ + 4
    INCF    LCD_CHAR, F
    MOVWF    LCD_CHAR_HEXA
    GOTO    LCD_SEND_DECIMAL_100

    ; Affiche les centaines
    MOVF    LCD_CHAR, W
    CALL    LCD_SEND_CHAR
        
    ; Calcul des dixaines

    MOVLW    "
0"            ; On met le code ascii de 0 dans LCD_CHAR
    MOVWF    LCD_CHAR        ;    "
    
LCD_SEND_DECIMAL_10
    MOVF    LCD_CHAR_HEXA
W
    ADDLW    
-D'10'
    
BTFSS    STATUSC
    
GOTO    $ + 4
    INCF    LCD_CHAR
F
    MOVWF    LCD_CHAR_HEXA
    
GOTO    LCD_SEND_DECIMAL_10

    
Affiche les dixaines
    MOVF    LCD_CHAR
W
    CALL    LCD_SEND_CHAR

    MOVLW    
"0"            On met le code ascii de 0 dans LCD_CHAR
    MOVWF    LCD_CHAR        
;    "

    ; Calcul des unitees

LCD_SEND_DECIMAL_1
    MOVF    LCD_CHAR_HEXA, W
    ADDLW    -D'1'
    BTFSS    STATUS, C
    GOTO    $ + 4
    INCF    LCD_CHAR, F
    MOVWF    LCD_CHAR_HEXA
    GOTO    LCD_SEND_DECIMAL_1

    ; Affiche les unitees
    MOVF    LCD_CHAR, W
    CALL    LCD_SEND_CHAR    

    ; Fini !
    RETURN    


;
;    Envois d'un octet sur le LCD, ecrit en binaire toujours sur 8 0 ou 1. Passe en parametre dans W
;
LCD_SEND_BIN
    MOVWF    LCD_CHAR_HEXA        ; On met W sans LCD_CHAR_HEXA, 

    ; generation de code automatique avec MPLAB
    VARIABLE    I
I = D'7'

    while I >= 0
    
        MOVLW    "
0"            ; On met le code ascii de 0 dans W
        BTFSC    LCD_CHAR_HEXA, I    ; si le bit I est a 1;
        MOVLW    "
1"            ; On met le code ascii de 1 dans W
        CALL    LCD_SEND_CHAR    

I--
    endW
    
    RETURN

    
; Efface l'ecran LCD    
LCD_CLEAR

    MOVLW    0
    CALL    LCD_SEND_NO_WAIT

    MOVLW    D'16'
    CALL    LCD_SEND        ; envoit de la commande pour effacer

    CALL    Wait1.5ms        ; on attends plus de 1.64 ms
    CALL    Wait100µs
    CALL    Wait100µs

    RETURN

; Scroll de l'ecran LCD    
LCD_SCROLL

    MOVLW    D'16'
    CALL    LCD_SEND_NO_WAIT

    MOVLW    D'128'
    CALL    LCD_SEND        ; envoit de la commande pour le scroll

    RETURN

; LOCATE de l'ecran LCD, avec la position dans W. 64 positions par lignes
;    0 debut de la premiere ligne
;    64 debut de la deuxieme ligne
LCD_LOCATE

    MOVWF    LCD_CHAR        ; On met W sans LCD_CHAR

    ANDLW    0xF0            ; masquage des bit de poids faible
    ADDLW    D'128'            ; on y ajoute 128
    CALL    LCD_SEND_NO_WAIT    ; on envoit a l'afficheur

    SWAPF    LCD_CHAR, W        ; On remet LCD_CHAR dans W
                    ; passage des bits de poids faibles en poids fort

    ANDLW    0xF0            ; masquage des bit de poids faible
    CALL    LCD_SEND        ; on envoit a l'afficheur
    
    ; fini

    RETURN


; Place le curseur en debut de la 1ere ligne
LCD_LOCATE_LINE0

    MOVLW    D'0'
    CALL    LCD_LOCATE

    RETURN


; Place le curseur en debut de la 2eme ligne
LCD_LOCATE_LINE1

    MOVLW    D'64'
    CALL    LCD_LOCATE

    RETURN

; Place le curseur en debut de la 3eme ligne
LCD_LOCATE_LINE2

    MOVLW    D'20'
    CALL    LCD_LOCATE

    RETURN

; Place le curseur en debut de la 4eme ligne
LCD_LOCATE_LINE3

    MOVLW    D'84'
    CALL    LCD_LOCATE

    RETURN

; affiche un espace
LCD_PRINT_SPACE
    MOVLW    " "
    CALL    LCD_SEND_CHAR
    RETURN
    


;**********************************************************************
;
; Fonction Printf %s
; avec en parametre W le numero du printf a afficher (defini par des EQU)
; Definitions des printfs en fin de programmes
;
;**********************************************************************
LCD_PRINTF

    MOVWF    LCD_CMP_PRINTF    ; on met W dans LCD_AFF_PRINTF qui contient le printf a afficher

    ; initialisation de EEADRH et de EEADR

    BSF    STATUS, RP1
    BCF    STATUS, RP0    ; Bank 2

    MOVLW    High Printf_START    
    MOVWF    EEADRH        ; MSBytes of Program address to read
        
    MOVLW    Low Printf_START
    MOVWF    EEADR        ; LSByte of program address to read

LCD_PRINTF_boucle
    BSF    STATUS, RP0    ; 
    BSF    STATUS, RP1    ; Bank 3

    BSF    EECON1, EEPGD    ; Point to PROGRAM memory

    BSF    EECON1, RD    ; EEPROM read
    NOP
    NOP            ; Memory is read in the next 2 cycles

    BCF    STATUS, RP0    ; bank 2

    MOVF     EEDATA, W    ; W = LSByte of Program EEDATA
;    MOVF     EEDATH, W    ; W = MSByte of Program EEDATA -> pas utile ici
        
    BCF    STATUS, RP1
    BCF    STATUS, RP0    ; Bank 0
    
    BTFSC    STATUS, Z    ; Si W = 0 va en LCD_PRINTF_Null
    GOTO    LCD_PRINTF_Null

    DECFSZ    LCD_CMP_PRINTF, F ; on decremente LCD_CMP_PRINTF
    GOTO     LCD_PRINTF_Next_add  ; si il est different de 0, donc de 1 avant decrementation, on va en LCD_PRINTF_Next_add
                  ; sinon il faut afficher le caractere qui est toujours dans W

    CALL    LCD_SEND_CHAR    

    GOTO     LCD_PRINTF_Next_add

LCD_PRINTF_Null

    DECFSZ    LCD_CMP_PRINTF, F
    GOTO    LCD_PRINTF_Next
    RETURN

LCD_PRINTF_Next_add
    INCF    LCD_CMP_PRINTF, F ; on reajoute 1 a LCD_CMP_PRINTF
        
LCD_PRINTF_Next

    BSF    STATUS, RP1
    BCF    STATUS, RP0    ; Bank 2

    INCF    EEADR, F    ; ajoute 1 a l'adresse de lecture
    BTFSC    STATUS, Z
    INCF    EEADRH, F    ; si = 0, on ajoute 1 au poid fort

    MOVLW    High Printf_STOP
    SUBWF    EEADRH,W
    BTFSS    STATUS, Z
    GOTO    LCD_PRINTF_Next2 ; si EEADRH != High Printf_STOP on continue
    
    MOVLW    low Printf_STOP
    SUBWF    EEADR,W
    BTFSS    STATUS, Z
    GOTO    LCD_PRINTF_Next2 ; si EEADR != low Printf_STOP on continue

    ; Fin du printf
    BCF    STATUS, RP1
    BCF    STATUS, RP0    ; Bank 0
    RETURN
    

LCD_PRINTF_Next2

    BCF    STATUS, RP1
    BCF    STATUS, RP0    ; Bank 0
    GOTO    LCD_PRINTF_boucle
    

;**********************************************************************
;
; Les printf definis (1 mot par caractere).
;  Places à la fin du programme
;
;**********************************************************************

Printf_START     

    VARIABLE    PRINTF_CMP =    1    ; Variable MPLAB (pas d'existence en assembleur) pour trouver le bon printf.


Printf_Coucou         EQU    PRINTF_CMP
PRINTF_CMP++
    DT    " 
initialisation", 0

Printf_jmp     EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "
essai de J-Marc",0
Printf_jmp1     EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "
pour voir",0

Printf_jmp_Made     EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "
Made by J-Marc",0

Printf_variable         EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "
Valeur Variable ",0

Printf_Ok         EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "
OK",0

Printf_Error         EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "
ERROR",0

Printf_STOP

;**********************************************************************
;                                                                     *
;    Fin                                              *
;                                                                     *
;                                                                     *
;**********************************************************************


    END                     ; directive 'end of program'

                                                                                                                          

Tachymètre
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#17 Message par JMarc » dim. 15 janv. 2017 20:51

Bonsoir a tous

suite du code que j’essaie de faire :sifflotte:

test du capteur hall si déclenché alors mise a 1 du bit 0 de la variable index
test si capteur relâché alors remise a 0 de index et incrementation de la variable compthall
affichage de la variable qui est remise a 0 toute les secondes

reste demain a faire les tests en réel :sifflotte:

Code : Tout sélectionner


BouP
        btfsc   Index
,0
        
goto    BouP1
        btfsc   capteurhall        
capteur hall declenché ?
        goto    
suite1              non alors saut etiquette suite
BouP1
        btfss   capteurhall        
relaché ?
        goto    
suite
        bcf     Index
,0
        incf    Compthall
        
goto    suite1

suite  
        bsf     Index
,0

suite1
        MOVLW   0X0A         
;on test si 10fois 100mS
        SUBWF   Temp
,W
        BTFSS   STATUS
,Z
        
GOTO       BouP         
        CLRF       Temp         
;RAZ compteur temp
 
        decf    ComptSu
,f       pour voir si mon prog est planté
                                
j'affiche cette variable
        CALL    LCD_CLEAR

        CALL LCD_LOCATE_LINE0
        MOVLW    Printf_jmp
        CALL    LCD_PRINTF
        

        CALL LCD_LOCATE_LINE1
        movfw   ComptSu             ; affichage d'
un compte a rebourg
        CALL    LCD_SEND_DECI

        CALL    LCD_PRINT_SPACE
        movfw   Compthall           
nombre de declenchement du capteur
        CALL    LCD_SEND_DECI
    
        clrf    Compthall           
effacement de la variable du capteur
    
GOTO    BouP
            
boucle principale


Tachymètre
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#18 Message par Temps-x » lun. 16 janv. 2017 00:31

Bonjour JMarc, et bonjour à tous,

Ton code est bien, mais il y a plus simple, voir le poste viewtopic.php?p=4537#p4537 que tu as
eu avec maï .

Je te laisse deviner

A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Tachymètre
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#19 Message par JMarc » lun. 16 janv. 2017 07:13

Bonjour Temps-x

L'utilisation de trm0 en mode compteur était l'idée de départ mais j'ai cru comprendre dans les posts précédents qu'il était préférable de faire une capture. Étant perdu, j'ai pondu cela :-D Ce soir si je ne rentre pas trop tard, je fabrique un support pour le capteur et fait les essais. Merci à toi pour ta réponse.

Merci !

Tachymètre
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#20 Message par paulfjujo » lun. 16 janv. 2017 08:54

Bonjour JMarc et à Tous

JMarc a écrit :... mais j'ai cru comprendre dans les posts précédents qu'il était préférable de faire une capture. ...


Tu es loin d'utiliser "un mode Capture "
c'est plutot du pooling d'entree ( scutation etat bit d'entree) qui s'execute à une periode assez longue
qui est determinée par 'a duree d'affichage LCD .. donc un fort risque d'en rater (des impulsions)
Ta resolution sera donc tres faible ..par rapport aux 2 autres solutions :

1) comptage par timer Capteur effat hall sur entree Timer0 et duree 1sec via timer1
=> mesure de frequence en Hz
et independament de l'affichage LCD qui tourne en tache de fond.

2) la solution Capture avec entree sur CCPx + timer mesure de periode => F = 1/periode

Ne pas oublier une donnee importante :
largeur d''impulsion capteur effet hall .. depend de la largeur de la cible (aimant) ,par rapport à la circonference totale...
et de la vitesse !
donc pour saisir ce changement d'etat , la fenetre temporelle risque d'etre bien courte ..
d'ou l'usage d'interruption quasi necessaire .. à moins d'utiliser 100% des ressources MCU pour detecter cette impulse
pour la traiter apres..


exmple de question et calcus prealables pour mesure de vitesse velo d'appart
taille de l'aimant et circonference


Capture_velo.JPG
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Roger et 39 invités