salut...
tout d'abord je vous presente mon projet.
je suis entrain de réaliser une améliorantion d'un testeur de régulateur d'alternateur de voiture.
et cette amélioration consiste à introduire un afficheur lcd 4*20 caractère , un clavier 16 touches et un pic16f877 : donc ètre programmable.
j'ai essayé de réaliser ça et ça marche.. mais j'ai un problème .
moi j'utilise le porta du pic comme un convertisseur analogique/numèrique pour mesurer une tension. mais le problème dans mon programme qu'il m'affiche une valeur différent de celle que je veux .
voici mon problème et j'espère que je trouve quelqu'un qui peut m'aider .
c'est urgent.
ok donc je vous donne mon programme
le fichier hex et le schéma.
la simulation se fait :
1 - s'affiche un message
2- saisir le code par le clavier (c'est un code de 2 nombres et entre 10 et 49)
3-taper entrer (ds le schéma c'est ' = ')
3- s'affiche les références du régulateur
4- taper test (ds le schéma c'est ' ON/c '
5- s'affiche la valeur de tension
ma tension varie entre 12v et 24v et 32v selon un switch
puis elle varie selon ces valeurs :
si 12 elle varie de 12 à 15
-si 24 elle varie de 24 à 28
et le 32 ne varie pas.
merci..
voici la partie conversion :
ConversionAN
; initialisation
call LCD_CLEAR
BSF STATUS, RP0 ; Bank 1 selectonnee
MOVLW b'10000010' ; select RA0
MOVWF ADCON1 ; as analog inputs
BCF STATUS, RP0 ; Bank 0 selectonnee
MOVLW b'11000001' ; Select; RC osc, Ch2
MOVWF ADCON0 ; turn on A/D
Convert CALL Wait100µs ; provide necessary samplig time
BSF ADCON0, 2 ; Start new A/D conversion
loop
BTFSC ADCON0,2 ; A/D over ?
GOTO loop ; no then loop
CALL LCD_LOCATE_LINE0
MOVF ADRESH, W
CALL LCD_SEND_DECI ; print high bit of the result
CALL LCD_PRINT_SPACE
CALL LCD_PRINT_SPACE
BSF STATUS, RP0 ; Bank 1 selectonnee
MOVF ADRESL, W
BCF STATUS, RP0 ; Bank 0 selectonnee
CALL LCD_SEND_DECI ; print low bit of the result
CALL LCD_PRINT_SPACE
CALL LCD_PRINT_SPACE
MOVLW "V"
CALL LCD_SEND_CHAR
GOTO Convert ; boucle
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
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
merci
-----