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
Tachymètre
Bonsoir a vous tous, cela fait plaisir d'avoir autant de réponse
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 (pour l'instant, voir plus bas )
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
pour la méthode capture, je suis en pleine lecture et c'est un chapitre tres passionnant mais pas facile
autant pour moi, apres relecture, PSA=0 donc je vais le mettre a 1
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 (pour l'instant, voir plus bas )
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
pour la méthode capture, je suis en pleine lecture et c'est un chapitre tres passionnant mais pas facile
autant pour moi, apres relecture, PSA=0 donc je vais le mettre a 1
Tachymètre
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.
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+
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.
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+
Tachymètre
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.
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
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 car cela me passionne
Tachymètre
Bonjour à tous
Super, trop content
Cela me suffit amplement car je n'est même pas réglé le timer1 pour qu'il soit pile a 1 seconde
Je met le code si cela peut intéresser un lecteur
Super, trop content
Cela me suffit amplement car je n'est même pas réglé le timer1 pour qu'il soit pile a 1 seconde
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 Lcd: Julien Fribotte
;
; Modifié par JMP pour Fantaspic ;
;*******************************************************************************
; Note:PIC 16F877a
; ; LCD sur portD voir brochage plus bas
; Entrée compteur sur RA4, timer0 en mode compteur
;
; le LCD est prevu pour un quartz de 20Mhz mais
; ce prog est prevu pour un 4Mhz, a 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/S | 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 ; 1 -> Matrices de 5*11, 0 -> Matrices de 5*8 (defaut 0)
LCD_SET_DISPLAY EQU 1 ; 1 -> Display LCD On, 0 -> Display LCD Off (defaut 1)
LCD_SET_CURSOR EQU 1 ; 1 -> Cursor On, 0 -> Cursor Off (defaut 1)
LCD_SET_BLINK EQU 0 ; 1 -> blink character at cursor position On, 0 -> Off (defaut 0)
LCD_SET_DIRECT EQU 1 ; 1 -> to the right, 0 -> to the left (defaut 1)
LCD_SET_SCROLL EQU 0 ; 1 -> Scroll display, 0 -> 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, 1
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 (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 (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 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 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 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_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 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_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
Tachymètre
Tachymètre
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 35 invités