Bonjour, j'y ai passé toute l'après midi pour résoudre le problème mais je n'y suis pas arrivé, donc à défaut de le résoudre, j'ai réussi à "l'isoler".
La carte sert juste à gérer des digits faits par des segments de trois diodes en parallèles, (j'aurais dû les mettre en série!). Mais j'ai vraiment quelque chose d'étrange, puisqu'en ciblant la panne, je me suis aperçu que dès qu'un des segments a, b ou c n'était pas utile pour l'affichage, alors les autres non-plus ne s'allumaient pas, j'ai re-regardé la doc du 16F876A que j'utilise ici mais je ne vois rien de spécial puisqu'il faut un 0 en sortie du PIC sur un NPN (donc pas de courant rentrant dans le pic) pour allumer le digit correspondant.
Le test le plus parlant est le suivant: je dis au PIC de faire en sorte de m'afficher 7 sur le digit, il me l'affiche, 8 aussi et d'autres encore, mais 1 ne fonctionne pas, 2 non plus etc...
En tension pour le segment a, j'ai 0 sur RB1 et 1 sur le reste du port, ce 0V arrive à la base d'un BD139 via une 4.7k, j'y ai aussi 0V, par contre j'ai aussi 0V à son collecteur via une pull-up de 1k au 12V comme si il était saturé mais il ne peut pas l'être avec le Vb qu'il a, a comprends pu comment qu'est-ce qui ce passe, je poste aussi le schéma et le petit code exécuté pour mieux comprendre, j'espère que quelqu'un pourra me guider...
Le schéma commande des segments:
carte_bug876.JPG
avec les sorties correspondantes, du PIC, associées:
portb_876.JPG
et le programme gérant cela avec aucune interruption autorisée, pas de pull-up sur PORTB et RB1 à RB7ensortie:
Code:;***************************************************************************** ; PROGRAMME PRINCIPAL * ;***************************************************************************** start ; test pour afficheur 7 segments bsf PORTC, 0 ; RC0 à 1 bsf PORTC, 1 ; RC1 à 1 ; movlw B'00000000' ; test huit => OK ; movlw B'11111110' ; test blanc => OK ; movlw B'11111100' ; test segment a => NOK ; movlw B'11111010' ; test segment b => NOK ; movlw B'11110110' ; test segment c => NOK ; movlw B'11101110' ; test segment d => OK ; movlw B'11011110' ; test segment e => OK ; movlw B'10111110' ; test segment f => OK ; movlw B'01111110' ; test segment g => OK ; movlw D'1' ; test 1 => NOK => a et b ne s'allument pas (rien donc) ; movlw D'2' ; test 2 => NOK => a et b ne s'allument pas ; movlw D'3' ; test 3 => OK ; movlw D'4' ; test 4 => NOK => b et c ne s'allument pas ; movlw D'5' ; test 5 => NOK => a et c ne s'allument pas movlw D'6' ; test 6 => NOK => a et c ne s'allument pas ; movlw D'7' ; test 7 => OK !!! !!! ; movlw D'8' ; test 8 => OK !!! ; movlw D'9' ; test 9 => OK call dec7seg ; va décoder en 7 segments movwf PORTB ; envoi la bonne valeur sur digit1 boucle movf TMR0, w ; btfsc STATUS, Z ; TMR0 != 0? call special goto boucle ; oui => boucler special bsf PORTC, 5 ; SC à 1 (RC5) return ; décodage bcd/7 segemnts pour affichage sur digit dec7seg addwf PCL, f ; additionne (w) au PC retlw ZERO ; si (w) = 0, return avec ZERO dans w retlw UN ; si (w) = 1, return avec UN dans w retlw DEUX ; si (w) = 2, return avec DEUX dans w retlw TROIS ; si (w) = 3, return avec TROIS dans w retlw QUATRE ; si (w) = 4, return avec QUATRE dans w retlw CINQ ; si (w) = 5, return avec CINQ dans w retlw SIX ; si (w) = 6, return avec SIX dans w retlw SEPT ; si (w) = 7, return avec SEPT dans w retlw HUIT ; si (w) = 8, return avec HUIT dans w retlw NEUF ; si (w) = 9, return avec NEUF dans w ;***** RB1 à RB7 <=> a à g et RB0 à 0 (1 aurait aussi pu faire l'affaire) ZERO EQU B'10000000' ; valeur en 7 segments de ZERO UN EQU B'11110010' ; valeur en 7 segments de UN DEUX EQU B'01001000' ; valeur en 7 segments de DEUX TROIS EQU B'01100000' ; valeur en 7 segments de TROIS QUATRE EQU B'00110010' ; valeur en 7 segments de QUATRE CINQ EQU B'00100100' ; valeur en 7 segments de CINQ SIX EQU B'00000100' ; valeur en 7 segments de SIX SEPT EQU B'11110000' ; valeur en 7 segments de SEPT HUIT EQU B'00000000' ; valeur en 7 segments de HUIT NEUF EQU B'00100000' ; valeur en 7 segments de NEUF
-----