Uln2803

lchastain

New Member
Bonjour à tous et meilleurs voeux,
Existe t il un circuit equivalent au ULN2803 qui ninverserait pas létat logique du signal reçu?
Merci
Lchastain
 

AndreBernot

Senior Member
Bonjour,

A mon sens l'état logique du signal reçu par l'ULN2803 n'est pas inversé pour piloter quelque chose sur la sortie correspondante. Les sorties de l'ULN2803 sont à collecteur ouvert il me semble ; si vous connectez l'élément à piloter entre le + Alimentation et la sortie concernée cela va alimenter l'élément à piloter (par exemple un petit moteur DC comme suggéré en page 7 du manuel "Microcontroller interfacing circuits"
La sortie pilotée est "en l'air" tant que l'entrée correspondante n'est pas activée(le courant ne passe pas dans l'élément à piloter), si l'entrée est activée, l'élément à piloter est alors relié au 0V et il va s'activer.
 

PieM

Senior Member
Sur le plan niveau logique l'uln2803 est effectivement un inverseur. Un niveau logique 1 à l'entrée conduit à un niveau logique inverse en sortie.
Si l'actionneur est connecté entre le + et la sortie, il est actionné, car il est connecté en logique négative: on applique un niveau 0 à la sortie pour le mettre en marche.

Pour une non inversion, voir la série UDN2980 ...
 

BESQUEUT

Senior Member
Sur le plan niveau logique l'uln2803 est effectivement un inverseur. Un niveau logique 1 à l'entrée conduit à un niveau logique inverse en sortie.
Si l'actionneur est connecté entre le + et la sortie, il est actionné, car il est connecté en logique négative: on applique un niveau 0 à la sortie pour le mettre en marche.

Pour une non inversion, voir la série UDN2980 ...
Cela dit, ça serait intéressant de savoir pourquoi cet inversion pose problème ?
Au niveau du programme, une ligne symbol permet de définir si l'état logique est haut ou bas, et basta...
 

PieM

Senior Member
C'est tout de même plus cohérent d'avoir la même définition des niveaux logiques dans un montage.
Pour commander des afficheurs 7 segments, par exemple, selon qu'on est en anode ou cathode commune, il ne suffit pas de définir si l'état logique positif ou négatif.
Pas plus que des instructions liées à la communication comme rfout irout.
 

lchastain

New Member
Ok merci je minforme donc sur ces udn et bien vu PIEM, c'est en montant un module 7 segments ou encore des modules RGB que je suis fait cette remarque. Je ne me voyais pas perturber mes eleves de college ....qui en resteront à létat haut=ça fonctionne et letat bas = arret.
 

BESQUEUT

Senior Member
Je ne me voyais pas perturber mes eleves de college ....qui en resteront à létat haut=ça fonctionne et letat bas = arret.
Et pourtant, il faudra bien un jour qu'ils sachent qu'un appareil peut être mis en service soit par 5V, soit par 0V.
En particulier, tous les système de sécurité sont mis en service par la rupture du fil (pour des raisons évidentes...)

Mais rien n'empêche de définir des symboles ETAT_HAUT et ETAT_BAS
ayant les valeurs respectives 0 et 1 ou 1 et 0 suivant l'électronique qui est derrière.
Et dans ce cas, vous pourrez continuer à affirmer :
état haut=ça fonctionne et etat bas = arret.

Personnellement, je préfère lever toute ambiguïté en utilisant plutôt des symboles :
MARCHE=0 ou 1 et ARRET=1 ou 0
 

PieM

Senior Member
Mais rien n'empêche de définir des symboles ETAT_HAUT et ETAT_BAS
ayant les valeurs respectives 0 et 1 ou 1 et 0 suivant l'électronique qui est derrière.
Et dans ce cas, vous pourrez continuer à affirmer :
état haut=ça fonctionne et etat bas = arret.

Personnellement, je préfère lever toute ambiguïté en utilisant plutôt des symboles :
MARCHE=0 ou 1 et ARRET=1 ou 0
Etat haut et état bas sont définis par la logique positive ou négative. (normalisées)
L'électronique et ses composants (y compris le picaxe) sont toujours définis en logique positive, sinon une table de vérité d'un AND devient celle d'un OR!

Quant à definir un MARCHE=0 ou 1 et ARRET=1 pour des sorties il faudrait le définir pour chaque type de sortie selon que l'on commande un MosFet N ou afficheur anode commune ? Et ça n'a pas beaucoup de sens pour des entrées...
Et un syteme de sécurité fonctionne effectivement par ouverture d'un circuit mais c'est indépendant des niveaux logiques.

@ Papy
Peut-on écrire qqchose du genre:
ARRET = NOT MARCHE
ben oui si Arret a été défini comme 0 ou 1 et Marche a été défini comme 1 ou 0

1 = not 0 et lycée de versailles
 
Last edited:

PapyJP

Senior Member
Peut-on écrire qqchose du genre: ARRET = NOT MARCHE
J' ai mal posé ma question:
Si j' écris ARRET = NOT MARCHE est-ce que le fait de faire MARCHE= 1 dans le corps du programme entraine ipso facto ( sans nouvelle ligne de prog ) ARRET = 0 et Lycée de Versailles ?
 

PieM

Senior Member
Si j' écris ARRET = NOT MARCHE est-ce que le fait de faire MARCHE= 1 dans le corps du programme entraine ipso facto ( sans nouvelle ligne de prog ) ARRET = 0 et Lycée de Versailles ?
ARRET et MARCHE seraient donc les symboles pour 2 bits différents ce qui est curieux.
et si on écrit ARRET = NOT MARCHE cela n'implique pas que MARCHE = NOT ARRET

Dans ce cas il faut définir
symbole marche = bit7 par ex.
marche = 1
et utiliser NOT marche pour l'arrêt

Quand on écrit MARCHE=0 ou 1 et ARRET=1 ou 0 on ne fait que définir une constante par un nom, en début de programme.

Pour en revenir à #1 : et si on mettait 2 x ULN2803 l'un derrière l'autre.....?
ben oui, deux inversions successives, mais il faut penser que l'ULN a des sorties collecteur ouvert, dont le potentiel doit être fixé par une R de pullup sur chaque sortie du premier...
 

BESQUEUT

Senior Member
J' ai mal posé ma question:
Si j' écris ARRET = NOT MARCHE est-ce que le fait de faire MARCHE= 1 dans le corps du programme entraine ipso facto ( sans nouvelle ligne de prog ) ARRET = 0 et Lycée de Versailles ?
Ben oui :
Code:
[color=Blue]Symbol MARCHE[/color][color=DarkCyan]=[/color][color=Navy]0[/color]
[color=Blue]Symbol ARRET[/color][color=DarkCyan]=[/color][color=Navy]1[/color][color=DarkCyan]-[/color][color=Blue]MARCHE

Symbol ALLUME[/color][color=DarkCyan]=[/color][color=Navy]1[/color]
[color=Blue]Symbol ETEINT[/color][color=DarkCyan]=[/color][color=Navy]1[/color][color=DarkCyan]-[/color][color=Blue]ALLUME


Symbol RELACHE[/color][color=DarkCyan]=[/color][color=Navy]0[/color]
[color=Blue]Symbol ENFONCE[/color][color=DarkCyan]=[/color][color=Navy]1[/color][color=DarkCyan]-[/color][color=Blue]RELACHE

Symbol [/color][color=Purple]BOUTON[/color][color=DarkCyan]=[/color][color=Purple]pinC.1[/color]
[color=Blue]symbol [/color][color=Purple]VOYANT[/color][color=DarkCyan]=[/color][color=Purple]pinC.2[/color]

[color=Blue]sertxd ([/color][color=Red]"MARCHE="[/color][color=Black],#[/color][color=Blue]MARCHE[/color][color=Black],[/color][color=Red]" ARRET="[/color][color=Black],#[/color][color=Blue]ARRET[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
sertxd ([/color][color=Red]"ALLUME="[/color][color=Black],#[/color][color=Blue]ALLUME[/color][color=Black],[/color][color=Red]" ETEINT="[/color][color=Black],#[/color][color=Blue]ETEINT[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
sertxd ([/color][color=Red]"RELACHE="[/color][color=Black],#[/color][color=Blue]RELACHE[/color][color=Black],[/color][color=Red]" ENFONCE="[/color][color=Black],#[/color][color=Blue]ENFONCE[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])

if [/color][color=Purple]BOUTON[/color][color=DarkCyan]=[/color][color=Blue]ENFONCE then
      [/color][color=Purple]VOYANT[/color][color=DarkCyan]=[/color][color=Blue]ALLUME
else
      [/color][color=Purple]VOYANT[/color][color=DarkCyan]=[/color][color=Blue]ETEINT
endif[/color]
Pour répondre à M. PieM, il est tout à fait possible d'utiliser des noms de constantes adaptées au contexte, y compris sur des entrées et sur des sorties, indépendamment des tensions requises pour chaque état.
De la sorte, lorsque l'on écrit le programme on se moque totalement de savoir si on est en "logique positive" ou "négative".
A la limite, on essaie, et si on n'est pas dans le bon sens, on change la constante au début du code, et basta cosi...

Notez également que s'agissant de constantes, tout ceci consomme zéro octet de programme, donc pourquoi s'en priver ?
 

PieM

Senior Member
Ben oui :
Code:
[COLOR=Blue]Symbol MARCHE[/COLOR][COLOR=DarkCyan]=[/COLOR][COLOR=Navy]0[/COLOR]
[COLOR=Blue]Symbol ARRET[/COLOR][COLOR=DarkCyan]=[/COLOR][COLOR=Navy]1[/COLOR][COLOR=DarkCyan]-[/COLOR][COLOR=Blue]MARCHE

[/COLOR][/QUOTE]
[COLOR=#000000]
la question était:
[QUOTE]Si j' écris ARRET = NOT MARCHE est-ce que le fait de faire MARCHE= 1 [I]dans le corps du programme entraine ipso facto ( [U]sans nouvelle ligne de prog [/U]) ARRET = 0 et Lycée de Versailles ?[/I][/QUOTE]

Si on définit une constante Marche = 0
écrire [COLOR=#000000]ARRET=1-MARCHE est évidemment écrire qu'arret est egal à 1 puisque marche est remplacé par 0 par le préprocesseur.[/COLOR]
mais en aucune façon , en cours de programme, si on redéfinit seulement l'un, cela modifie l'autre! Ce n'est pas en écrivant que [COLOR=#000000][COLOR=#000000]MARCHE[/COLOR][/COLOR] = 1 que [COLOR=#000000][COLOR=#000000]ARRET[/COLOR][/COLOR] va devenir = 0
De plus il est impossible de redéfinir une constante à l'intérieur du programme puisqu'elle n'existe plus en tant que symbole.
[/COLOR]
 
Top