Encore un autre testeur TTL. Pas vraiment besoin parce qu'en ai déjà plusieurs mais j'étais obligé de le faire quand j'ai découvert cet afficheur 7 segs bicolore chez Aliex, çà me démangeait.
https://fr.aliexpress.com/item/10050073 ... pt=glo2fra
et puis pas un enième projet inutile car c'est l'instrument de mesure que j'utilise le plus dans mes projets, pour vérifier des niveaux sur pins ou traces PCB il remplace avantageusement et plus simplement l'oscillo, l'analyseur logique ou le multimètre, on pose la pointe sur la pin ou la trace à tester et il indique immédiatement l'état haut ou bas, une seule main occupée et qui évite des câbles de mesure qui traînent sur le projet.
J'en ai déjà fait plusieurs avec des 16F88, recherche sur le forum, mais je n'en ai plus et le Père Noel n'a plus l'air d'en fabriquer, cette fois j'ai utilisé un 18F2525.
Affiche un L rouge pour une mesure d'état bas et un H vert pour état haut. J'avais aussi implémenté une led jaune pour la zone grise mais elle ne sert plus.
Rappel des niveaux TTL:
0 à 0.8v état bas
0.8 à 2v zone grise hors TTL
2 à 5v état haut
Mesure sur AN0 (A0), en dessous de 0.8v (0x29 sur AN0) affiche état bas, en dessus de 2v (0x69) affiche état haut. En début de projet entre 0.8 et 2v il éteignait l'afficheur et allumait une led jaune pour afficher la zone grise (piste coupée, pin HS sans tension, etc.), mais j'ai du utiliser cette zone grise pour le fonctionnement et garder le testeur éteint hors mesure.
Petit moment de galère: Dés le départ tout fonctionnait nickel si ce n'est qu'il affichait un état bas hors mesure (quand le testeur était posé sur la table par exemple). Pas tolérable, en mesure on n'aurait jamais été sur d'un vrai état bas. Petit coup d'oscillo et visu d'une tension résiduelle sinusoidale près du zéro en non utilisation, peut-être due au chevelu de la breadboard mais pour avoir un outil robuste j'ai voulu traiter ce souci. J'ai tenté diverses routines asm pour la détecter et la gérer mais rien de probant, elle faisait toujours ch*** le monde.
Finalement j'ai résolu le problème en ajoutant un pont diviseur avec deux R de très forte valeur pour avoir un courant faible sur la pointe de touche, 1M/470k qui hors mesure ramène la tension présente sur AN0 à 1.2v en pleine zone grise et afficheur éteint par code. Tout roule, le faible courant dans le pont diviseur fait qu'un vrai état haut ou bas mesuré prend le pas et s'affiche correctement.
Si je me retrouve un jour en mesure avec afficheur éteint, la question se posera de vérifier si on est en vraie zone grise (entre 0.8 et 2v, ce qui arrive très rarement) ou sur un point inerte, il faudra sortir le multimètre ou l'oscillo pour lever le doute, on peut vivre avec.
Petit afficheur bien sympa:
Le schéma ultra simple:
Projet sur platine dev et breadboard, pour la mise au point AN0 est branchée sur le pot 10k de la platine DEV:
Etat bas 0 à 0.8v, L rouge affiché
Juste au début zone grise, afficheur éteint
Juste en limite max de zone grise, afficheur éteint
Etat haut 2 à 5v, H vert affiché
Reste plus qu'à sortir Eagle pour pondre un circuit imprimé en forme de stylo.
Code asm:
Code : Tout sélectionner
Errorlevel-302 ; Supprime le message "Ensure that bank bits are correct"
list p=18f2525 ; processeur utilisé
#include <p18f2525.inc> ; Définitions des constantes PIC
;#include <LCD_18F.inc> ; définitions des constantes LCD
CONFIG OSC = INTIO67 ; Oscillateur interne 8MHz
CONFIG IESO = OFF ; Délai au démarrage (ON/OFF)
CONFIG BOREN = OFF ; Reset si chute de tension (ON/OFF)
CONFIG PWRT = ON ; Délai au démarrage (ON/OFF)
CONFIG BORV = 0 ; Tension de reset en 1/10ème Volts
CONFIG WDT = OFF ; Mise hors service du watchdog (ON/OFF)
CONFIG PBADEN = OFF ; PORTB<4:0> les broches sont configurées comme E/S numériques lors de la réinitialisation
CONFIG LPT1OSC = OFF ; Timer1 configuré pour un fonctionnement plus puissant
CONFIG MCLRE = ON ; Mclr configuré comme entrée
CONFIG STVREN = ON ; Reset sur débordement de pile (ON/OFF)
CONFIG LVP = OFF ; Programmation basse tension autorisée (ON/OFF)
CONFIG XINST = OFF ; L'extension du jeu d'instructions et le mode d'adressage indexé sont désactivés(mode hérité)
CONFIG DEBUG = OFF ; Debugger hors service
CONFIG CP0 = OFF ; Code protection sur block 0 (ON/OFF)
CONFIG CP1 = OFF ; Code protection sur block 1 (ON/OFF)
CONFIG CP2 = OFF ; Code protection sur block 2 (ON/OFF)
CONFIG CPB = OFF ; Code protection sur bootblock (ON/OFF)
CONFIG CPD = OFF ; Code protection sur eeprom (ON/OFF)
CONFIG WRT0 = OFF ; Protection écriture block 0 (ON/OFF)
CONFIG WRT1 = OFF ; Protection écriture block 1 (ON/OFF)
CONFIG WRT2 = OFF ; Protection écriture block 2 (ON/OFF)
CONFIG WRTB = OFF ; Protection écriture bootblock (ON/OFF)
CONFIG WRTC = OFF ; Protection écriture configurations (ON/OFF)
CONFIG WRTD = OFF ; Protection écriture zone eeprom (ON/OFF)
CONFIG EBTR0 = OFF ; Protection lecture de table block 0 (ON/OFF)
CONFIG EBTR1 = OFF ; Protection lecture de table block 1 (ON/OFF)
CONFIG EBTR2 = OFF ; Protection lecture de table block 2 (ON/OFF)
CONFIG EBTRB = OFF ; Protection lecture de table bootblock (ON/OFF)
Code : Tout sélectionner
;**********************************************************************
;
; Testeur avec afficheur 7 segs KYX5161 bicolore
; F6FCO - dec 2025
;
;**********************************************************************
#include <Fusibles_18F2525.asm>
#define vert LATB,2 ; Etat logique haut
#define rouge LATB,1 ; Etat logique bas
#define digit_a LATC,7
#define digit_b LATB,0
#define digit_c LATA,3
#define digit_d LATA,4
#define digit_e LATA,5
#define digit_f LATC,6
#define digit_g LATC,4
;#define digit_dp LATC,6
CBLOCK 0x00C
w_temp :1 ; Sauvegarde du registre W
status_temp :1 ; Sauvegarde du registre STATUS
Reg_1 :1
Reg_2 :1
Reg_3 :1
conchita :2 ; variable bonne à tout faire
ENDC
org 0x000 ; Adresse de départ après reset
bra init ; Adresse 0: initialiser
; ------------------------ Routines Interruptions
;sauvegarder registres
org 0x008 ; adresse d'interruption
movwf w_temp ; sauver registre W
swapf STATUS,w ; swap status avec résultat dans w
movwf status_temp ; sauver status swappé
; Interrupt MSSP
btfss PIR1,SSPIF ; <3>
bra restorereg
call intMSSP ; on vient d'avoir une int MSSP, on la traite
;restaurer registres
restorereg
swapf status_temp,w ; swap ancien status, résultat dans w
movwf STATUS ; restaurer status
swapf w_temp,f ; Inversion L et H de l'ancien W, sans modifier Z
swapf w_temp,w ; Réinversion de L et H dans W, W restauré sans modifier status
retfie ; return from interrupt
intMSSP
movff SSPBUF,PORTB
bsf SSPCON1,CKP ; on relâche l'horloge
bcf PIR1,SSPIF ; <3> raz flag d'interrupt
return
; ------------------------ Init
init
clrf EEADR ; diminue la consommation
; init oscillateur
movlw 0xff ; Horloge interne 8Mhz
movwf OSCCON
movlw 0x07
movwf CMCON ; mode comparateur désactivé
movlw b'00000001'
movwf TRISA
clrf PORTA
clrf LATA
movlw b'00000000'
movwf TRISB
clrf PORTB
clrf LATB
movlw b'00000000' ;
movwf TRISC
clrf PORTC
clrf LATC
; init interruptions
bsf RCON,IPEN
bsf INTCON,GIE ; <7> int non masquées activées
bsf INTCON,PEIE ; <6> int périphériques non masquées activées
bsf PIE1,SSPIE ; <3> MSSP activé
bcf PIR1,SSPIF ; <3> flag interrupt à zéro
bsf SSPCON1,SSPEN ; <5> pins I²C en mode SDA/SCL
; init conversion AD
clrf ADCON0
bsf ADCON0,ADON ; convertisseur ON
movlw b'00001110' ; AN0 en entrée analogique
movwf ADCON1
movlw b'00001110'
movwf ADCON2 ; ADFM droite
; ACQT=10
; ADCS=10
; vers main
; -----------------------------------
Code : Tout sélectionner
#include <Testeur_KYX5161_Init.asm>
main
; démarrage conversion
bsf ADCON0,GO
loop1
btfsc ADCON0,GO
bra loop1
; en dessous de 0.8v (0x29) -- > état TTL bas
; au dessus de 2v (0x66) --> état TTL haut
call tempo10ms
; test si on est au dessus de 2v (état logique haut)
test_h movff ADRESH,WREG
sublw 0x69 ; limite min état haut
btfsc STATUS,C
bra test_b
bra affiche_etat_haut
; test si on est en dessous de 0.8v (état logique bas )
test_b movff ADRESH,WREG
sublw 0x29 ; limite max état bas
btfss STATUS,C
bra test_z
bra affiche_etat_bas
; test zone grise
test_z movff ADRESH,WREG
sublw 0x29 ; limite min zone grise
btfsc STATUS,C
bra fin
sublw 0x69 ; limite max zone grise
btfsc STATUS,C
bra fin
bra extinction_zone_grise
fin bra main
affiche_etat_haut ; au-dessus de 2v
nop
bcf rouge
bsf vert
bcf digit_d
bsf digit_c
bsf digit_b
bsf digit_f
bsf digit_e
bsf digit_g
bra main
affiche_etat_bas ; en-dessous de 0.8v
nop
bcf vert
bsf rouge
bcf digit_c
bcf digit_b
bcf digit_g
bsf digit_f
bsf digit_e
bsf digit_d
bra main
extinction_zone_grise ; entre 0.8 et 2v
;bsf led_jaune
bcf digit_a
bcf digit_b
bcf digit_c
bcf digit_d
bcf digit_e
bcf digit_f
bcf digit_g
bra main
tempo10ms
; Délai 20 000 Cycles de la machine
; Durée du délai 10 millisecond
; Fréquence de l'oscillateur 8 MHZ
movlw .248
movwf Reg_1,1
movlw .26
movwf Reg_2
decfsz Reg_1,F,1
bra $-2
decfsz Reg_2
bra $-6
nop
return
;#include <Testeur_KYX5161_routines.asm>
END
