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
Bonjour Paulfjujo
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
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
Tachymètre
Tachymètre
Tachymètre
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
Tachymètre
Bonjour
des nouvelles...
Le cablage fonctionne , j'ai un peu modifié le programme pour comprendre le fonctionnement, c'est genial
Maintenant je me penche sur l’acquisition des données.
ci-joint juste la gestion de l'afficheur
des nouvelles...
Le cablage fonctionne , j'ai un peu modifié le programme pour comprendre le fonctionnement, c'est genial
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 Lcd: Julien 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/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
#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 ; 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
;*******************************************************************************
;*********************** 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
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 (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_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
Bonsoir a tous
suite du code que j’essaie de faire
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
suite du code que j’essaie de faire
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
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
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+
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+
Tachymètre
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 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.
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 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.
Tachymètre
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Bonjour JMarc et à Tous
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
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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités