Anda di halaman 1dari 12

R2

Gestion microprogrammée
O2
V2

R1
O1

V1
Vo
ie 2
d'un carrefour

e1
Mr COTTET

oi
CARREFO3

V
I) Présentation:
Actuellement, la densité de la circulation dans toutes les grandes villes nécessite de plus en plus une
gestion informatisée des carrefours.
Ainsi de nombreux carrefours comportent des dispositifs de détection (radars ou détection au sol
par boucle d'induction). La commande des feux tricolores est alors réalisée par un système
microprogrammé propre à chaque carrefour, et la durée des feux s'ajuste automatiquement afin de
réduire les temps d'attente en fonction de la présence ou non de véhicules. Chaque système micro
est en communication avec un système de gestion permettant la visualisation des flux instantanés,
et la transmission de nouvelles consignes aux carrefours afin d'améliorer la circulation en cas de
fortes densité.
Ces systèmes permettent à l'heure actuelle, l'étude de nouvelles méthodes de gestion des feux, et
l'élaboration de programmes dont la séquence varie en fonction des heures de la journée (Ex:
heures de pointe), mais aussi en fonction de critères imprévisibles (Ex: accidents). Ces programmes
font de plus en plus appel à des techniques proches de l'intelligence artificielle (Ex: Logique floue,
méthode de contrôle très utilisée dans les grands ascenseurs).

Gestion microprogrammée de la circulation Carrefour N°n


Carrefour N°(n-1)
Sytème de gestion
microprogrammé
Carrefour N°3
- Centralisation des données
- Visualisation des flux Carrefour N°2
- Elaboration des nouvelles Carrefour N°1
consignes
communication Traitement Commande
détection
microprogrammé des feux
captage
tricolores
communication

On se propose d'étudier la fonction traitement microprogrammé et commande des feux tricolores


de ces dispositifs, en simulation sur UMPS. On utilisera comme ressource dans UMPS l'équivalent
d'une carte d'interface appelée carte carrefour, matérialisant les feux tricolores sur une intersection
à 2 voies (pour gagner du temps on configurera les ressources, mais dès l'ouverture de la fenêtre
ressource, on utilisera directement le fichier "CARREFO1.ENV") .
La carte de commande comporte un interrupteur à trois positions accessible seulement par des
personnes habilitées (Personnel de maintenance et policiers), permettant d'imposer soit un
fonctionnement automatique sur une séquence de nuit (Clignotement des feux oranges), soit un

CARREFO4 Page N°1


fonctionnement manuel en pas à pas, soit le fonctionnement automatique sur séquence de jour
(Passage périodique du vert au jaune puis rouge etc...). Nous ajouterons en temps voulu une
ressource permettant de simuler cet interrupteur.
Le dessin du carrefour est représenté ci contre.
Les feux sont matérialisés par des diodes R2
O2
électroluminescentes de couleurs rouges, jaunes et V2
vertes.
R1
Vo
O1 ie 2
II) Analyse structurelle: V1

e1
oi
1) En étudiant l'en-tête du programme fourni,

V
retrouvez les connections matérielles entre le
microcontrôleur 68HC11 et l'extérieur. Complétez Dessin du carrefour
la feuille réponse N°1.
Remarque : On utilisera les abréviations suivantes V1, O1, R1 et V2, O2, R2 pour les
commandes des lampes du carrefour. V1, O1, R1 et V2, O2, R2 correspondront respectivement
au vert, orange et rouge des voies 1 et 2.
On appellera P le bouton poussoir pour le fonctionnement manuel, et N ainsi que J les sorties de
l'interrupteur à 3 positions permettant d'assurer le fonctionnement dans les modes Nuit, Manuel et
Jour. La position centrale correspondra au fonctionnement manuel, autorisant un fonctionnement
du carrefour en mode pas à pas à l'aide de P.
Précisez pour le bouton et l'interrupteur, quels sont les états logiques sur les broches
correspondantes du 68HC11 pour chaque position (réponse sur la feuille rep N°1).
2) Indiquez quel doit être le contenu du registre DDRC de direction du port C, après l'initialisation
du port, sachant qu'on veut pouvoir lire les états du bouton Jour / Manuel / Nuit.
Exemple: Si DDRC.bit 5 = 1 alors le bit 5 du port C sera en sortie.
Inversement, si DDRC.bit 5 = 0 (DDRC5=0) alors PortC.bit 5 (PC5) du port sera en entrée.

DDRC

III) Analyse et synthèse d'un programme et d'un ordinogramme:


Rem: Tous les programmes écrits en assembleur seront prévus en utilisant des étiquettes à la place
des constantes numériques (ex: DDRC, PortC, PortB ....), et non $1007, $1003...
1) Complétez l'organigramme et le programme en assembleur (CAREFO21.ASM), permettant la
gestion du carrefour selon une séquence programmée dans une table de donnée appelée SEQ1?
correspondant à la séquence de jour (Voir page suivante).
Rem: On ne se préoccupera pas de la position des boutons dans ce programme (ceux-ci pourront
donc être dans une position quelconque), on devra néanmoins éviter toute détérioration lié à un
court-circuit d'une sortie avec une alimentation (Il est préférable de mettre en entrée, une broche
non utilisée).
La séquence sera organisée de la façon suivante: (chaque étape sera définie par deux octets
successifs. Le premier indiquera l'allumage des différentes lampes des feux. Le deuxième indiquera
la durée de l'étape (en seconde)). Le programme comportera donc une temporisation de référence
(durée = 1s). On devra calculer le ou les nombres (valeur d'initialisation du ou des compteurs)
pour obtenir la tempo de 1s en prenant les tableaux d'instructions du microprocesseur utilisé.
CARREFO4 Page N°2
La fin de la séquence sera signalée par un octet nul (le programme reprendra alors la séquence dès
la première étape).
2) Commentez les séquences suivantes sur la feuille réponse N°1, en indiquant pour chaque étape,
l'état des feux pour les voies 1 et 2 et la durée. (Rem: les valeurs sont en héxadécimal).
SEQ1 : 24 02 0C 20 14 03 24 02 21 20 22 03 00
SEQ2 : 12 01 40 01 00
Expliquez le rôle des valeurs $24 dans la séquence 1.
Expliquez le rôle de la valeur $40 dans la séquence 2. N'y a t'il pas de problème avec
l'interrupteur? (Proposez deux autres valeurs, à la place de $40 qui assurent la même séquence).

IV) Synthèse d'un programme avec gestion (Jour / Nuit):


1) Pour permettre le déroulement des 2 séquences (jour ou nuit), on veut modifier le programme
conformément à l'algorithme suivant.
a) Lecture du bouton (jour/manuel/nuit).
b) Si le bouton est sur: "Nuit", alors positionnement sur la séquence de nuit, sinon
positionnement sur la séquence de jour.
c) Déroulement de la séquence complète (un seul sous programme: déroulement séquence
(SEQEN) devra permettre l'exécution des deux séquences).
d) Retour au: a).
Le bouton poussoir ne sera pas utilisé. La position manuelle devra être identique à la position jour.
Rem: Il faut attendre la fin de la séquence pour passer à l'autre. Interdiction de pouvoir passer à
tout moment de l'une à l'autre. (problème de sécurité routière).
Commentez le passage de la SEQ1 à la SEQ2 et réciproquement. La sécurité est elle assurée?

V) Analyse et synthèse d'un programme avec gestion Jour / Nuit et Manuel (Pas à pas):
REM: la position manuelle donne la séquence de jour uniquement, mais le passage d'une étape à la
suivante se fait par appui sur le bouton poussoir P (attention la tempo relative à chaque étape sera
exécutée: pour éviter que l'on puisse provoquer des changements rapides (sécurité)).
Le bouton poussoir P provoquera une interruption /IRQ du HC11.
1) On demande alors de modifier l'organigramme et le programme pour tenir compte de la position
manuelle et du bouton poussoir, avec gestion de l'interruption /IRQ sur front descendant.

CARREFO4 Page N°3


III.1) Programme de gestion du carrefour . (fichier CAREFO21.ASM)
*****************************************************
Début
* Fichier CAREFO21.ASM Mr COTTET
* (gestion du carrefour PROGRAMME JOUR)
* Initialisations
* pour UMPS (ou 68HC811E2 ou E9) (Pile, Ports)
*
* (adr $F000 à $FFFF), RAM de $0000 à $00FF (interne
* au 68HC11)
* Définition de la partie opérative Init pointeur
* PortC: Pc7 Pc6 Pc5 Pc4 Pc3 Pc2 Pc1 Pc0 de donnée
* J N R2 O2 V2 R1 O1 V1
* J et N correspondent aux informations de l'inter 3 positions
* (Jour / Manuel / Nuit) Prendre donnée
* J N = 0 1 indique position jour (J et N actifs à l'état bas) pointée N1
* J N = 1 1 indique position manuelle
* J N = 1 0 indique la position nuit
* Les lampes représentatives des feux R2, O2, V2, R1, O1, V1
* sont actives à l'état haut
* Pour la suite /IRQ sera utilisé pour le mode pas à pas
*********** définition des constantes et variables *****
incrémente
**************** CONSTANTES *********** pointeur
*PortC equ $1003 ;Port C
*DDRC equ $1007 ;Direction du port C Prendre donnée
NT1 equ 1 ; Valeurs réelles à voir
NT2 equ 4000 ; Valeurs pour simulation NT1=1, NT2=4000 pointée N2

************** PROGRAMME PRINCIPAL *********************

ORG $F000 ; programme en EPROM


incrémente
DEBUT Lds #$00FF ;Pile à la fin de la RAM
LDAA pointeur
STAA DDRC ;
Prendre donnée
JOUR LDX #SEQ1 pointée N1
LDAA ;Prend donnée pointée N1
SUIT1 STAA PortC ;COMMANDE DES DELS
INX
LDAB ;LECTURE DE LA DUREE N2 oui
N1<>0
PSHX ;sauvegarde de X car utilisé dans TEMPO ?
JSR TEMPO
;rappel du pointeur de donnée X non
INX
LDAA $0,X
B SUIT1 ;FIN DE SEQUENCE SI OCTET NUL
B JOUR
;**********************************************************
TEMPO LDX #NT1 ;TEMPO DE DUREE (B = N2 secondes)
Bouc1 LDY #NT2
Bouc2 DEY
CPY #$0000
B Bouc2
DEX
CPX #$0000
B Bouc1
DECB
B TEMPO
RTS
;***********************************************************
SEQ1 fdb $2402 ;SEQUENCE DE JOUR
fdb $0C20
fdb
fdb
fdb
fdb $2203
fcb

;****************** vecteurs interruptions **************


RESET
ORG
FDB
end

CARREFO4 Page N°4


- Feuille RéPONSE N°1: Nom: _

II.1) Analyse structurelle.


1.) Tableau N°1:
Labels utilisés dans le sujet par rapport /IRQ PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
aux broches de Port du 68HC11:
Etats logiques actifs:

Etats logiques sur les broches du HC11. Position


BP
Jour Nuit Manuel Relâché Appuyé

PC7
/IRQ

PC6

III.2) Analyse et synthèse logicielle.

Valeur à envoyer au port C. PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0

Analyse de la séquence "seq1"

Explication des valeurs 24h: N° étape Valeur Voie 1 Voie 2 temps


affichée

1 24h Rouge Rouge 2s

CARREFO4 Page N°5


LE CARREFOUR (CORRIGÉ).
Algorithme de gestion du carrefour (séquence de Jour uniquement).
1- Initialisation (pile et direction des ports).
2- Initialisation du pointeur des données au début de la table
(séquence jour).
3- Prendre la donnée pointée (valeur à afficher = N1).
4- Sortir donnée sur partie opérative (allumage des feux).
5- Incrémenter le pointeur.
6- Prendre nouvelle donnée pointée (valeur de la tempo = N2).
7- Executer temporisation de N2 secondes.
8- Incrémenter le pointeur.
9- Prendre la donnée pointée (valeur à afficher = N1).
10- Si N1=0 alors retour à l'étape 2.
11- Sinon retour à l'étape 4.
Temporisation
1) Traduction sous forme d'organigramme.
(Voir Programme et organigramme page suivante). Initialisations
Compteur C1

Calcul de la temporisation de 1s.


Initialisations
Méthode des boucles imbriquées, pour les temporisations longues: Voir Compteur C2
organigramme ci contre (ou ajout d'instructions inutiles comme NOP
pour un petit ajustement).
Décrémente C2
Les tableaux d'instructions et/ou le listing après assemblage donnent le
nombre de cycle de chaque instruction. non
C2=0
[ 3 ] TEMPO LDX #NT1 ;TEMPO DE DUREE (B secondes)
[ 4 ] Bouc1 LDY #NT2 ?
[ 4 ] Bouc2 DEY oui
[ 5 ] CPY #$0000
[ 3 ] BNE Bouc2 Décrémente C1
[ 3 ] DEX
[ 4 ] CPX #$0000
[ 3 ] BNE Bouc1 non
C1=0
[ 2 ] DECB
?
[ 3 ] BNE TEMPO
[ 5 ] RTS oui

Le 68HC11 provoque une division par 4 de la fréquence du quartz. FIN


Le temps de cycle est donc ici: Tcycle= 1/(Fcycle) = 4*(1/FQuartz) = 0.5µS
(avec FQuartz= 8MHz).
On en déduit alors le nombre de cycles total en fonction des nombres N1, N2 et du nombre
contenu dans le registre B (Nb), puis le temps total correspondant:
Soit: Ncycle = (3 + {4+(4+5+3)*NT2+3+4+3}*NT1 + 2+3)*Nb + 5
Or pour Nb=1 on veut Tcycle =1 seconde.
1s = Ncycle * 0.5*10-6 s = (13 + {12*NT2+14}*NT1 )* 0.5*10-6
soit (13 + {12*NT2+14}*NT1 ) = 2000000 (>65535) Ce nombre ne peut donc pas être codé sur
16 bits.
Si on prend NT2 = 4, il faut NT1= 32257 soit $7E01.

CARREFO4 Page N°6


III.1) Programme de gestion du carrefour . (fichier CAREFO21.ASM)
*****************************************************
* Fichier CAREFO21.ASM Mr COTTET
Début
* (gestion du carrefour PROGRAMME JOUR)
*
* pour UMPS (ou 68HC811E2 ou E9) Initialisations
* (Pile, Ports)
* (adr $F000 à $FFFF), RAM de $0000 à $00FF (interne
* au 68HC11)
* Définition de la partie opérative
* PortC: Pc7 Pc6 Pc5 Pc4 Pc3 Pc2 Pc1 Pc0 Init pointeur
* J N R2 O2 V2 R1 O1 V1 de donnée
* J et N correspondent aux informations de l'inter 3 positions
* (Jour / Manuel / Nuit)
* J N = 0 1 indique position jour (J et N actifs à l'état bas) Prendre donnée
* J N = 1 1 indique position manuelle pointée N1
* J N = 1 0 indique la position nuit
* Les lampes représentatives des feux R2, O2, V2, R1, O1, V1
* sont actives à l'état haut sortie (affichage)
* Pour la suite /IRQ sera utilisé pour le mode pas à pas
de la donnée N1
*********** définition des constantes et variables *****

**************** CONSTANTES *********** incrémente


*PortC equ $1003 ;Port C pointeur
*DDRC equ $1007 ;Direction du port C
NT1 equ 1 ; Valeurs réelles NT1=4, NT2=$7E01 Prendre donnée
NT2 equ 4000 ; Valeurs pour simulation NT1=1, NT2=4000
pointée N2
************** PROGRAMME PRINCIPAL *********************
Temporisation
ORG $F000 ; programme en EPROM N2 secondes

DEBUT Lds #$00FF ;Pile à la fin de la RAM


incrémente
LDAA #$3F ;PC7 et PC6 EN ENTREE
STAA DDRC ; pointeur

JOUR LDX #SEQ1 Prendre donnée


LDAA $0,X pointée N1
SUIT1 STAA PortC ;COMMANDE DES DELS
INX
LDAB $0,X ;LECTURE DE LA DUREE
PSHX ;sauvegarde de X car utilisé dans TEMPO oui
N1<>0
JSR TEMPO
PULX ;rappel du pointeur de donnée ?
INX non
LDAA $0,X
BNE SUIT1 ;FIN DE SEQUENCE SI OCTET NUL
BRA JOUR

TEMPO LDX #NT1 ;TEMPO DE DUREE (B secondes)


Bouc1 LDY #NT2
Bouc2 DEY
CPY #$0000
BNE Bouc2
DEX
CPX #$0000
BNE Bouc1
DECB
BNE TEMPO
RTS

SEQ1 fdb $2402 ;SEQUENCE DE JOUR


fdb $0C20
fdb $1403
fdb $2402
fdb $2120
fdb $2203
fcb $00

;****************** vecteurs interruptions **************


RESET
ORG $FFFE
FDB DEBUT
end

CARREFO4 Page N°7


6) Programme de gestion du carrefour avec séquence de jour et séquence de nuit.

*******************************************************
* Programme: carefo22.asm Auteur: Mr COTTET
* Lycée: Maurice GENEVOIX INGRE
* (gestion du carrefour PROGRAMME JOUR/NUIT)
* attention le bouton jour/nuit est indispensable.
* version 68HC811E2 EPROM (adr $F800 … $FFFF)
* RAM de $0000 … $00FF (interne au 68HC11)
*
* Définition de la partie opérative
* PortC: Pc7 Pc6 Pc5 Pc4 Pc3 Pc2 Pc1 Pc0
* J N R2 O2 V2 R1 O1 V1
* J et N correspondent aux information de l'interrupteur 3 positions
* (Jour / Manuel / Nuit)
* J N = 0 1 indique position jour (J et N sont actifs à l'état bas)
* J N = 1 1 indique position manuelle
* J N = 1 0 indique la position nuit
* Les lampes représentatives des feux R2, O2, V2, R1, O1, V1
* sont actives à l'état haut
* /IRQ est utilisé pour le mode pas à pas (bouton poussoir)
*
*********** définition des constantes et variables *****

TREF equ $1000 ; DUREE DE REFERENCE (pour la simulation)

ORG $0000 ; **** VARIABLES ************


REF rmb 2

************** PROGRAMME PRINCIPAL *********************

ORG $F800 ; Programme en EEPROM 68HC811E2

DEBUT Lds #$00FF


LDAA #$3F ; PC7 et PC6 EN ENTREE
STAA DDRC ; LES AUTRES EN SORTIE
DEPAR
LDX #TREF
STX REF ; durée de référence en RAM pour modif
JSR TEST ; Test du bouton
CMPA #$80
BEQ NUIT ; Séquence de nuit
JOUR LDX #SEQ1 ; Séquence de Jour
JSR SEQEN
BRA DEPAR

;*******************************************************
NUIT LDX #SEQ2
JSR SEQEN
BRA DEPAR

;*************** Sous Programmes ***********************


TEST LDAA PortC ;TEST DE LA POSITION DU BOUTON
ANDA #$C0 ; à 3 positions (Jour/Manuel/Nuit)
RTS

;*******************************************************
SEQEN LDAA $0,X ;PROGRAMME SEQUENCEUR
SUIT1 STAA PortC ;COMMANDE DES DELS
INX
LDAB $0,X ;LECTURE DE LA DUREE
PSHX
JSR TEMPO
PULX
SUIT2 INX
LDAA $0,X
BNE SUIT1 ;FIN DE SEQUENCE SI OCTET NUL
RTS

CARREFO4 Page N°8


;*******************************************************
TEMPO LDX REF ;TEMPO DE DUREE B*REF
ATEN DEX
BNE ATEN
DECB
BNE TEMPO
RTS

;*******************************************************
SEQ1 fdb $2402 ;SEQUENCE DE JOUR
fdb $0C20
fdb $1403
fdb $2402
fdb $2120
fdb $2203
fcb $00

;*******************************************************
SEQ2 fdb $1201 ;SEQUENCE DE NUIT
fdb $4001
fcb $00

****************** vecteurs interruptions **************


RESET
ORG $FFFE ;* Vecteur RESET
FDB DEBUT
end

CARREFO4 Page N°9


ORGANIGRAMMES DU CARREFOUR

1) programme principal
déroulement
séquence

début
prend donnée

initialisation état des feux


du PIA
commande
feux
positionnement
sur séquence jour
lit bouton
jour/manuel/nuit
lecture bouton
jour / nuit oui
manuel

non non
Nuit

oui incrémente
positionnement pointeur données
Indicateur
sur séquence nuit appui
prend donnée ? non
durée étape oui

déroulement Raz indicateur


temporisation d'appui
séquence T=durée lue

non fin des


données SP interruption
IRQ
oui
positionne
fin séquence
indicateur
d'appui

FIN SP IRQ

CARREFO4 Page N°10


III) Programme de gestion du carrefour avec séquence de jour et séquence de nuit.

********************************************************
* Programme: Carefo23.asm
* (gestion du carrefour PROGRAMME JOUR/Manuel/NUIT)
* attention le bouton jour/nuit est indispensable.
* version 68HC811E2 EPROM (adr $F800 … $FFFF)
* RAM de $0000 … $00FF (interne au 68HC11)
*
* Définition de la partie opérative
* PortC: Pc7 Pc6 Pc5 Pc4 Pc3 Pc2 Pc1 Pc0
* J N R2 O2 V2 R1 O1 V1
* J et N correspondent aux information de l'interrupteur 3 positions
* (Jour / Manuel / Nuit)
* J N = 0 1 indique position jour (J et N sont actifs à l'état bas)
* J N = 1 1 indique position manuelle
* J N = 1 0 indique la position nuit
* Les lampes représentatives des feux R2, O2, V2, R1, O1, V1
* sont actives à l'état haut
* /IRQ est utilisé pour le mode pas à pas (bouton poussoir)
*
*********** définition des constantes et variables *****
* OPTION equ $1039 ; ADPU, CSEL,IRQE,DLY,CME,0,CR1,CR0
* valeur par défaut $00
* IRQE =1 => /IRQ déclenchée sur front
TREF equ $1000 ; DUREE DE REFERENCE (pour la simulation)

ORG $0000 ; **** VARIABLES ************


REF rmb 2
INDIC Rmb 1 ; Indicateur d'appui sur le bouton poussoir

************** PROGRAMME PRINCIPAL *********************

ORG $F800 ; Programme en EEPROM 68HC811E2

DEBUT Lds #$00FF


LDAA #$3F ; PC7 et PC6 EN ENTREE
STAA DDRC ; LES AUTRES EN SORTIE
LDX #TREF
STX REF ; durée de référence en RAM pour modif
LDAA #$20
STAA OPTION ; /IRQ déclenchée sur front descendant
CLR INDIC ; initialisation indicateur d'appui sur le poussoir
CLI ; autorise les interruptions

DEPAR LDX #SEQ1 ; Prépositionnement sur séquence jour


LDAA PortC ; TEST DE LA POSITION DU BOUTON
ANDA #$C0 ; à 3 positions (Jour/Manuel/Nuit)
CMPA #$80
BNE JOUR ; Séquence de nuit si $80 uniquement
NUIT LDX #SEQ2
JOUR JSR SEQEN ; Séquence de Jour (automatique ou manuelle)
BRA DEPAR

;*************** Sous Programmes ***********************


SEQEN LDAA $0,X ;PROGRAMME SEQUENCEUR
SUIT1 STAA PortC ;COMMANDE DES DELS
TEST LDAA PortC ; TEST DE LA POSITION DU BOUTON
ANDA #$C0 ; à 3 positions (Jour/Manuel/Nuit)
CMPA #$C0 ; pour position Manuelle
BEQ MANUEL
SUIT2 INX
LDAB $0,X ;LECTURE DE LA DUREE
PSHX
JSR TEMPO
PULX
INX

CARREFO4 Page N°11


LDAA $0,X
BNE SUIT1 ;FIN DE SEQUENCE SI OCTET NUL
RTS

MANUEL LDAA INDIC


CMPA #1
BNE TEST
CLR INDIC
BRA SUIT2

;*******************************************************
TEMPO LDX REF ;TEMPO DE DUREE B*REF
ATEN DEX
BNE ATEN
DECB
BNE TEMPO
RTS

;************* Sous Programme d'interruption IRQ *******


SPIRQ LDAA #1 ;sous programme d'interruption IRQ
STAA INDIC
RTI

;*******************************************************
SEQ1 fdb $2402 ;SEQUENCE DE JOUR
fdb $0C20
fdb $1403
fdb $2402
fdb $2120
fdb $2203
fcb $00

;*******************************************************
SEQ2 fdb $1201 ;SEQUENCE DE NUIT
fdb $4001
fcb $00

****************** vecteurs interruptions **************


ORG $FFF2
VIRQ FDB SPIRQ ; définition du vecteur d'interruption IRQ
ORG $FFFE ; Vecteur RESET
RESET FDB DEBUT
end

CARREFO4 Page N°12