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

#41 Message par JMarc » sam. 21 janv. 2017 18:47

Bonsoir a vous tous, cela fait plaisir d'avoir autant de réponse :-D

Le bit PSA et les prescaler sont a 0

sur l'afficheur, le nombre a gauche est un simple compte rebourg a la seconde pour animer mon afficheur (et voir si le prog est planté)
celui du centre est le nombre de comptage de RA4 par seconde
celui de droite est la valeur du centre x6 (054) et je rajoute un 0 pour faire jolie

255x6=1530 et comme pour faire jolie je rajoute un 0 cela fait 15300 tours/ minute, la zone rouge etant a 2500 tours/minute, cela me laisse de la marge :langue: (pour l'instant, voir plus bas :cry: )

je décale a gauche pour x2 et je charge le résultat dans w
je redecale la variable a gauche ce que me fait x4
et j'additionne le x2 qui est resté dans w ce qui me fait bien x6

de plus, il me manque bien la moitié des entrées RA4 même dans l'afficheur du centre qui n'est pas multiplier

pour la résolution, je vais attaquer l'autopsie du ventilateur en question car je pense qui y a de nombreuses pulsations sur un seul tour. et puis c'est qu'un ventilateur aprés tout :sifflotte:

pour la méthode capture, je suis en pleine lecture :mur: et c'est un chapitre tres passionnant mais pas facile

Merci !

autant pour moi, apres relecture, PSA=0 donc je vais le mettre a 1 Merci !

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

#42 Message par Temps-x » dim. 22 janv. 2017 00:43

Bonsoir

Si ton TMR0 fait 192, comment va tu faire, sachant 192 * 6 = 1152 + '0'

Bon là, c'est vraie, je t'embête un peu, mais c'est pour te faire réfléchir. :wink:

Pour la méthode capture, beaucoup de tachymètre on eu des surprisses, cette méthode qui est basé sur la largeur d'impulsion
n'est pas très fiable, car elle dépends du capteur, ou la largeur de l'objet passant devant.

A toi de voir

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

#43 Message par JMarc » dim. 22 janv. 2017 12:09

Temps-x a écrit :Bonsoir

Si ton TMR0 fait 192, comment va tu faire, sachant 192 * 6 = 1152 + '0'

Bon là, c'est vraie, je t'embête un peu, mais c'est pour te faire réfléchir. :wink:

A toi de voir

A+


Bonjour Temps-x

J'ai pris le problème a l'envers, mon moteur (diesel poid lourd) ne peut tourner a plus de 2500tr/mn donc j'enlève le 0 soit 250 que je divise par 6 soit 42 pulsations /seconde :sifflotte:

Après je peut soit traité le débordement de tmr0, soit divisé le signal d'entrée soit réduire le temps de comptage.
J'ai commencé aussi a lire le lien plus haut sur les variable en 16bit mais encore compliqué pour moi

Pour le mode capture, j'ouvrirai un autre post :wink: car cela me passionne Merci !

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

#44 Message par JMarc » dim. 22 janv. 2017 12:49

Bonjour à tous

Super, trop content
Image Image

Cela me suffit amplement car je n'est même pas réglé le timer1 pour qu'il soit pile a 1 seconde :langue:
Image Image

Je met le code si cela peut intéresser un lecteur


Code : Tout sélectionner

;********************************************************************
;                
descriptif du projet:
;               
Tachymetre afficheur lcd
;
;;********************************************************************
;
;                
Auteur    :JMarc,
;                
Version    :1.0
;                Date    :  2017
;                                                                     
;    
Auteur source de la gestion du LcdJulien Fribotte             
;                                                                              
;     
Modifié par JMP pour Fantaspic   ;
;*******************************************************************************
;            
Note:PIC 16F877a 
; ;          LCD sur portD voir brochage plus bas
;            Entrée compteur sur RA4timer0 en mode compteur   
;
;           
le LCD est prevu pour un quartz de 20Mhz mais 
;           ce prog est prevu pour un 4Mhza vous de modifier                    
;*******************************************************************************
    
ERRORLEVEL-302
    
   
list       p=16f877         ;liste directive du 16F877
   
#include    "p16f877.inc"

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

;***************************** 
Configuation des fuses **************************

    
__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
        
       
;*********************** 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
Compthall       res 1
Index           res 1 
Toursminute     res 1       
variable pour tours/minute 
Ttm1            res 1
Ttm2            res 1  
Essai1          res 1
        
;*********************** Definition des Externes *******************************
;
        
;*********************** 
Assignations ou constantes ****************************
DRAM    EQU 0x20         ;début Mémoire Ram banque0
    
;*********************** MACROS ************************************************
Banque0    MACRO
    BCF STATUS
,RP0            ;Acces bank0
    BCF STATUS
,RP1
    ENDM

Banque1    MACRO
    BSF STATUS
,RP0            ;Acces bank1
    BCF STATUS
,RP1
    ENDM

Banque2    MACRO
    BCF STATUS
,RP0            ;acces bank2
    BSF STATUS
,RP1
    ENDM

Banque3    MACRO
    BSF STATUS
,RP0            ;Acces bank4
    BSF STATUS
,RP1
    ENDM        
;*******************************************************************************


;*********************** 
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
    
    movlw   B'
010000'       ;RA4 en entrée
    movwf   TRISA            ;
    
    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 ************************************
   MOVLW   (1<<GIE)|(1<<PEIE)|(1<<T0IE)|(0<<INTE)|(0<<RBIE)|(0<<T0IF)|(0<<INTF)|(0<<RBIF)
   MOVWF   INTCON         ;Initialisation des INT
             ; RBPU     b7 : 1= Résistance rappel +5V hors service
            ; INTEDG   b6 : 1= Interrupt sur flanc montant de RB0
            ;               0= Interrupt sur flanc descend. de RB0
            ; TOCS      b5 : 1= source clock = transition sur RA4
            ;                0= horloge interne
            ; TOSE      b4 : 1= Sélection flanc montant RA4(si B5=1)
            ;                0= Sélection flanc descendant RA4
            ; PSA       b3 : 1= Assignation prédiviseur sur Watchdog
            ;                0= Assignation prédiviseur sur Tmr0
            ; PS2/PS0   b2/b0 valeur du prédiviseur
                        ;           000 =  1/1 (watchdog) ou 1/2 (tmr0)
            ;           001 =  1/2               1/4
            ;           010 =  1/4             1/8
            ;           011 =  1/8             1/16
            ;           100 =  1/16             1/32
            ;           101 =  1/32             1/64
            ;           110 =  1/64             1/128
            ;           111 =  1/128         1/256
  
   BSF   PIE1,TMR1IE      ;valide int TMR1
;***************************************************************************
    movlw   B'
10101000' ;
    movwf    OPTION_REG
            ; RBPU     b7 : 1= Résistance rappel +5V hors service
            ; INTEDG   b6 : 1= Interrupt sur flanc montant de RB0
            ;               0= Interrupt sur flanc descend. de RB0
            ; TOCS      b5 : 1= source clock = transition sur RA4
            ;                0= horloge interne
            ; TOSE      b4 : 1= Sélection flanc montant RA4(si B5=1)
            ;                0= Sélection flanc descendant RA4
            ; PSA       b3 : 1= Assignation prédiviseur sur Watchdog
            ;                0= Assignation prédiviseur sur Tmr0
            ; PS2/PS0   b2/b0 valeur du prédiviseur
                        ;           000 =  1/1 (watchdog) ou 1/2 (tmr0)
            ;           001 =  1/2               1/4
            ;           010 =  1/4             1/8
            ;           011 =  1/8             1/16
            ;           100 =  1/16             1/32
            ;           101 =  1/32             1/64
            ;           110 =  1/64             1/128
            ;           111 =  1/128         1/256

  
;******************* Initialisation des timers/compteurs ***********************       
;                   ici on va travailler avec le TIMER1 
;*******************************************************************************
   
 Banque0  

   BSF   T1CON,TMR1ON      ; mise en service Timer1

  

;********************** fixation des variables *********************************

    clrf    ComptSu
    clrf    TMR0

;********************** Boucle principale **************************************    
 
        CALL    LCD_INIT

        CALL LCD_LOCATE_LINE0
        MOVLW    Printf_Coucou
        CALL    LCD_PRINTF


        CALL LCD_LOCATE_LINE1
        MOVLW    Printf_jmp_Made
        CALL    LCD_PRINTF

        ; pause de 2 s
        CALL    Wait1s
        CALL    Wait1s

 
       CALL    LCD_CLEAR
  
       CALL LCD_LOCATE_LINE0
       MOVLW    Printf_jmp
       CALL    LCD_PRINTF

      

        CALL    LCD_LOCATE_LINE1
        MOVLW   Printf_jmp1
        CALL    LCD_PRINTF

BouP
        MOVLW   0X15            ;on test si 10fois 100mS modifié car probleme de quartz
        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_legende
        CALL    LCD_PRINTF
        

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

        CALL    LCD_PRINT_SPACE
        movfw   TMR0           ; nombre de declenchement RA4
        CALL    LCD_SEND_DECI
    
        movfw   TMR0            ; Charge compteur tours/seconde
        movwf   Toursminute
        rlf     Toursminute     ; x2
        movfw   Toursminute     ; charge w
        movwf   Ttm2            ; envoi dans tampon (je peux supprimer cette ligne)
        rlf     Toursminute     ; x2=4
        addwf   Toursminute,f   ; additionne x2 + x4 = x6
        clrf    TMR0            ; remise a zéro du compteur RA4

        CALL    LCD_PRINT_SPACE
        movfw   Toursminute
        CALL    LCD_SEND_DECI  

        MOVLW   Printf_toursminute
        CALL    LCD_PRINTF
    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 (exactement, en 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 (exactementen 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 (exactement, en 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 off, cursor off, blink 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 right. when writing, don'
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 LCD. Passee 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 LCDPassee 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 commandeet attente de la fin de celle-ci)

    RETURN


;    
Envois d'un caractere ASCII sur le LCD. Passe 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 LCDecrit en hexaPasse 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 0moins les 5
                    
;     on a maintenant le code ascii dans W
    CALL    LCD_SEND_CHAR        
qu'on affiche ...

    MOVF    LCD_CHAR_HEXA, W    ; 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 0, moins les 6
                    ;     on a maintenant le code ascii dans W
    CALL    LCD_SEND_CHAR        ; qu'
on affiche ...
    
    RETURN    

;
;    
Envois d'un octet sur le LCD, ecrit en decimal toujours sur 3 chiffres. Passe 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    STATUS, C
    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 LCDecrit 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
D'7'

    
while >= 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 0on 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_legende    EQU    PRINTF_CMP
PRINTF_CMP++
    DT     "Compt Tmr0 Tr/mn",0

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

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

Printf_toursminute         EQU    PRINTF_CMP
PRINTF_CMP++
    DT    "0 tr/m", 0

Printf_STOP

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


    END                     ; directive '
end of program'

                                                                                                                          

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

#45 Message par Temps-x » dim. 22 janv. 2017 18:05

Bonjour JMarc, et bonjour à tous,

:bravo: +1 ça marche !!!!, bravo pour avoir fait par toi même, bonne continuation, beaucoup de chose à voir encore,
mais tu avance, et c'est bien.

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

Tachymètre
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#46 Message par Jérémy » dim. 22 janv. 2017 18:48

Je suis impressionné !! bravo à toi !!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

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

#47 Message par paulfjujo » dim. 22 janv. 2017 19:46

bonsoir J.MARC et les autres


:bravo:
La pugnacité, ça paie !
et qui plus est, avec un code bien identé et documenté +1
que demande le peuple !
Aide toi, le ciel ou FantasPic t'aidera

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

#48 Message par JMarc » mer. 25 janv. 2017 19:40

Bonsoir

Merci pour vos encouragement :-D

Je me lance dans la transmission, beaucoup de lecture :roll: , des que je m'en sort, j'ouvre un post

Super ton site Paulfjujo :bravo:


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités