Traduction/Translation << The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
Free - La liberté n a pas de prix
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte

Introduction
Les ports du PIC ne sont pas assez nombreux, il faut les économiser.
Cette opération n'est pas toujours très simple. Il faut à la fois diminuer le nombre de ports, ne pas y ajouter d'autres composants (on a peu de place sur la carte) et ne pas trop compliquer la programmation (là aussi, la place est comptée).
On va donc économiser les entrées/sorties en n'utilisant qu'un port pour deux LEDs.

 

 Le Schéma
Le schéma est très simple :
2 LEDs pour 1 port du PIC
  • Il y a quatre LEDs
  • et deux résistances de 100 ohms.

Coût : 5 F

Ou :

  • Il y a deux LEDs
  • Quatre diodes 1N4148
  • et deux résistances de 100 ohms.

Coût : 4 F

2 LEDs pour 1 port du PIC
Le principe de fonctionnement n'est pas beaucoup plus compliqué.

Quand le port du pic est à 0, la LED rouge est correctement polarisée, le courant la traverse (de 10 à 20 mA), elle s'allume. Si on met le port à 1 (5V), c'est au tour de la LED jaune d'être traversée par un courant. Maintenant si vous passez rapidement le port de 0 à 1 et inversement (à plus de 50Hz), vous aurez l'impression que les deux LED sont allumées.

Vous savez maintenant allumer la LED rouge ou la jaune, individuellement ou simultanément (enfin en apparence),

  • Mais comment les éteindre toutes les deux, me direz-vous ?
  • Très simplement vous répondrai-je ;-)

Il suffit de passer le port en haute impédance, c'est à dire en entrée. Et les LEDs ne seront plus alimentées et seront donc éteintes.

Et c'est maintenant que je peux vous expliquer le rôle de la deuxième LED en série (ou des 2 diodes) : Lorsque le port est en entrée, le montage se retrouve isolé du PIC. Les 4 LEDs et les 2 résistances en série sont alimentées en 5V mais ceci n'est pas suffisant pour allumer les LEDs. Le seuil des LEDs étant de 1,5V minimum, il faudrait au minimum 6V pour qu'un courant les traverse (même chose pour les diodes avec un seuil de 0,6V minimum, soit une alimentation de 5,4 V). Phénomène qui ne se produit pas si c'est le pic qui alimente la partie haute ou basse du montage, dans ce cas les seuils ne sont plus qu'à 3V (ou 2,7V).

Ah ! J'oubliais : Lorsque vous allumez les 2 LEDs, la puissance moyenne est partagée entre les deux et lorsque vous voulez allumer qu'une seule LED, elle reçoit toute la puissance. Donc pour bien faire, pour que les LEDs s'allument toujours avec la même intensité et dans le cas d'une seul LED allumée, il faut basculer d'un niveau haut/bas à l'état haute impédance (et pas comme je l'ai écrit plus haut, c'était pour simplifier la description).

Vous avez compris ?

Bien. Très bien. Il ne vous reste plus qu'à faire le programme ;-)
D'ailleurs, je lance le concours de la fonction la plus optimisée pour allumer ces LEDs. A vos programmateurs !

Bientôt, je publierai ma solution et les plus intéressantes que vous aurez postées sur le forum.

 

Une autre solution.
Vous avez aimé ?

Bien ! Et bien avant de continuer et vous donner le programme du PIC, je vous soumets un autre schéma.
Il a encore moins de composants et il utilise le même programme. L'inconvénient est qu'il a un très mauvais rendement.

2 LEDs pour 1 port du PIC
  • Il y a 2 LEDs
  • et 2 résistances de 100 ohms.
  • Coût : 3 F

  • Vous pouvez aussi remplacer les 2 LEDs
    par une LED bicolore à 2 pattes.
  • Coût : 6 F

Comment ca marche ?

Comme pour les 2 premiers montages, il y a 3 cas à étudier :


Premier cas :

Le port du PIC est dans l'état haute impédance.
Les deux LEDs sont éteintes.

Une des pattes des deux LEDs se retrouve non connectée, aucun courant ne peut donc les traverser.
Par contre, les résistances sont traversées par un courant qui est gaspillé (environ 25mA).

Schéma équivalent :
2 LEDs pour 1 port du PIC

Deuxième cas :

Le port du PIC est à 1.
La LED rouge est allumée.

Le port est à environ 5V, la LED D2 est polarisée en inverse donc aucun courant ne peut la traverser. Il ne reste plus dans le schéma équivalent, que la LED D1 en parallèle avec la résistance R1.
La LED est traversée par un courant compris entre 10 et 20mA pour une perte dans la résistance R1 de 15 à 20 mA.

Schéma équivalent :
2 LEDs pour 1 port du PIC

Troisième et dernier cas :

Le port du PIC est à 0.
La LED jaune est allumée.

Le port est à environ 0V, la LED D1 est polarisée en inverse, ce qui dans le schéma équivalent met la LED D2 en parallèle avec la résistance R2.
Et comme pour le cas précédent, le courant de la LED est compris entre 10 et 20mA et la perte de 15 à 20mA

Schéma équivalent :
2 LEDs pour 1 port du PIC

 

 

Le programme PIC.
;**********************************************************************
;
; Fichier 4 Leds sur 2 ports du PIC
; Port RB1 patte 8 Leds Verte et Orange
; Port RB2 patte 9 Leds Rouge et Jaune
;
; Voir schéma http://fribotte.free.fr/bdtech/elecnul/LEDPIC.html
;
;**********************************************************************
;
; Fichier: 4Leds.asm
; Date: 20/01/2000
; Version: V0.1
;
; Auteur: Fribotte@free.fr
; Compagnie: Fribotte.free.fr
;
;**********************************************************************
;
; Notes:
; 16f84 Quartz 4Mhz
;
;**********************************************************************
;
; Historique:
; 20/01/2000 Création
;
;**********************************************************************
list p=16F84 ; Type du processeur
#include <p16F84.inc> ; Définition des variables
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC ; Pas de code protégé
; Pas de watchdog timer
; Délai de démarrage
; Horloge XT.
 

;**********************************************************************
;
; Déclaration des variables et constantes
;
;**********************************************************************

;***** Variable interruption
w_temp EQU 0x0C ; Sauvegarde contexte W
status_temp EQU 0x0D ; Sauvegarde contexte status
;***** Variable et constante Pour gestion des Leds
GestLed EQU 0x0E ; Gestion des leds
CCadence EQU 0 ; Répartition des bits de GestLed
CLedRouge EQU 1
CLedJaune EQU 2
CLedOrange EQU 3
CLedVerte EQU 4
;***** Variable pour les tests des Leds
TestLed EQU 0x0F ; Compteur pour les tests
 

;**********************************************************************
;
; Vecteur reset
;
;**********************************************************************

ORG 0x000
GOTO main ; Début du programme
 

;**********************************************************************
;
; Interruption TimeR
;
;**********************************************************************

ORG 0x004 ; Vecteur d'interruption
;***** Sauvegarde contexte
MOVWF w_temp ; Sauve Registre W
MOVF STATUS,W ; Sauve Status
MOVWF status_temp
; Début du code spécifique aux tests des Leds.
; Pour les tests
; j'incrémente TestLed
; et j'allume ou éteint les Leds.
; La Orange toutes les 250ms, la Verte toutes les 500ms
; La Jaune toutes les 1s et la rouge 2s.
INCF TestLed,F ; GestLed(LedRouge/Jaune/Verte/Orange)=0
MOVLW B'11100001'
ANDWF GestLed,F
BTFSC TestLed,7 ; if TestLed(7)=1 GestLed(Rouge)=1
BSF GestLed,CLedRouge
BTFSC TestLed,6 ; if TestLed(6)=1 GestLed(Jaune)=1
BSF GestLed,CLedJaune
BTFSC TestLed,5 ; if TestLed(5)=1 GestLed(Verte)=1
BSF GestLed,CLedVerte
BTFSC TestLed,4 ; if TestLed(4)=1 GestLed(Orange)=1
BSF GestLed,CLedOrange
; Fin du code spécifique pour les tests

; Appelle de la fonction de gestion des Leds

CALL LGestLed
;***** Restitution contexte
FinInter MOVF status_temp,W ; restore STATUS
MOVWF STATUS
SWAPF w_temp,F ; restore W
SWAPF w_temp,W
;***** Redémarrage interruption
BCF INTCON, T0IF ; On efface l'interruption TimeR
RETFIE ; return après l'interruption
 

;**********************************************************************
;
; Programme Main
;
;**********************************************************************

main CALL InitIO ; Initialisation des ports d'E/S
CALL InitRtcc ; Initialisation de l'interruption TimeR
; Initialisation des variables
CLRF GestLed ; Init de Gestion des leds
CLRF TestLed
; fin du main
boucle GOTO boucle ; Boucle infinie
 

;**********************************************************************
;
; Initialisation des ports d'E/S
;
;**********************************************************************

InitIO CLRF PORTA ; Initialise le port A
CLRF PORTB ; Initialise le port B
BSF STATUS, RP0 ; Bank 1 sélectionnée
MOVLW B'00011111' ; Port RA4-RA0 en entrée
MOVWF TRISA
MOVLW B'11111111' ; Port RB7-RB0 en entrée
MOVWF TRISB
BCF STATUS, RP0 ; Bank 0 sélectionnée
RETURN
 

;**********************************************************************
;
; Initialisation de l'interruption TimeR
;
;
;**********************************************************************

InitRtcc
;***** On regle le prescaler
CLRWDT ; Clear WDT and prescaler
BSF STATUS, RP0 ; Bank 1 selectonnee
MOVLW B'10000101' ; Timer interne, prescaler sur Timer, Prescaler a 64.
MOVWF OPTION_REG ; / interruption tous les 16,3 ms
BCF STATUS, RP0 ; Bank 0 selectonnee
;***** On règle l'interruption
MOVLW B'10100000' ; enable interrupts
MOVWF INTCON
RETURN
 

;**********************************************************************
;
; Fonction Gestion des Leds
;
; Cette fonction doit être lancée à intervalle régulier
; et constant ( l'idéale = 10ms ).
; CALL LGestLed
;
; Elle allume et éteint les Leds selon la variable GestLed
;
; Pour allumer une Led : BSF GestLed,CLedRouge
; Pour l'éteindre : BCF GestLed,CledRouge
;
; En entrée fonction : Rien
; En sortie fonction : W=0
;
; Port Led RB1 et RB2
;
;**********************************************************************

LGestLed MOVLW B'00000001'
XORWF GestLed,F ; T = NOT T
; Les ports des Leds en Entrée ( Haute Impédance )
BSF STATUS, RP0 ; Bank 1 sélectionnée
MOVLW B'00000110' ; RB1 et RB2
IORWF TRISB,F ; en entrée
BCF STATUS, RP0 ; Bank 0 sélectionnée
BTFSS GestLed,CCadence
GOTO LedT0 ; si T= 0 goto LedT0
; Tous les ports leds niveau 1 en une opération obligatoirement
; Cette opération ne sera reportée sur le port que si on les passe en sortie.
LedT1 MOVLW B'00000110'
IORWF PORTB,F
; Passage des ports en sortie si les Leds sont allumées
BSF STATUS, RP0 ; Bank 1 sélectionnée
BTFSC GestLed,CLedOrange
BCF TRISB,1 ; si Orange alors RB1 en sortie
BTFSC GestLed,CLedJaune
BCF TRISB,2 ; si jaune alors RB2 en sortie
GOTO LedFin ; fin
; Tous les ports Leds niveau 0 en une opération obligatoirement
; Cette opération ne sera reportée sur le port que si on les passe en sortie.
LedT0 MOVLW B'11111001'
ANDWF PORTB,F
; Passage des ports en sortie si les Leds sont allumées
BSF STATUS, RP0 ; Bank 1 sélectionnée
BTFSC GestLed,CLedVerte
BCF TRISB,1 ; si Orange alors RB1 en sortie
BTFSC GestLed,CLedRouge
BCF TRISB,2 ; si jaune alors RB2 en sortie
LedFin BCF STATUS, RP0 ; Bank 0 sélectionnée
RETLW 0
 

;**********************************************************************
;
; Fin
;
;**********************************************************************

END

Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/elecnul/LEDPIC.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail