Comment mesurer une tension avec pic16f877 ?

mejdi_electronique - 17 mai 2007 à 11:04
 pic59 - 24 avril 2008 à 16:45
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

2 réponses

bonjour, le programme ne me dit rine je n'y connait rien mais quelle est ton interface d'entrée sur ton pic?? cordialement
1
mejdi_electronique salu es ke tu pourer m'envoyer ton shéma et ton programme car j'ai le même projet et je galére un peu si tu peu m'aider je t'en remercie j'ai fai mon schéma mais j'arive pa à afficher
0