Non classé

Dernière mise à jour le 03/02/18

Présentation


Dans ce présent article nous allons débroussailler le terrain afin d’avoir un aperçu de ce qu’on appel les interruptions, puis nous verrons dans des autres articles leurs utilisations. Avant d’aborder les autres articles, nous allons nous contenter d’expliquer simplement le rôle de ces interruptions afin de nous familiariser avec ces nouveaux outils de programmation, puisqu’ils sont différents des PICs de la famille 10F/12F/16F/18F.
 
Les interruptions sont des évènements qui sont exécutés en dehors du programme principal. Afin de pouvoir exécuter une interruption il faut dans un premier temps faire un préréglage dans la procédure d’initialisation du PIC qui celle-ci permettra de bien initialiser le PIC. Dès lors de sa mise sous tension (Attention !!! 3,3V pour rappel), cette initialisation sera effectuée dans la « procedure init ». Nous verrons plus en détails toutes les possibilités concernant les interruptions proposées par le PIC32 dans les prochains articles car la liste est longue.
 
Dans la procédure d’initialisation du PIC32, il faut avant tout insérer quelques lignes de programmation pour que l’interruption que vous désirez exécutée soit appelée.


EnableInterrupts()

Cette première routine est située dans le logiciel MikroPascal, mais pour ceux qui utiliserais MikroC ou MikroBascic…, cette routine est aussi présente. EnableInterrupts permet de faire appel aux “Interruptions Vecteurs” (IV). Pour faire simple sur ces interruptions, immaginez que vous ayez un classeur munis d’intercalaires, et que sur ces intercalaires le nom des thèmes, ou bien un classement alphabétique sont situés afin que vous puissiez retrouvez l’ensemble des documents que vous êtes entrain de rechercher. Et bien c’est la même chose avec les interruptions vector, au moment ou une interruption va se produire le nom de cette interruption sera “indexé” et son programme sera exécutée. (si on fait une analogie au niveau de “l’indexage” cela représente le nom de l’intercalaire sélectionné). Mais attention!! Si vous ne mettez pas « EnableInterrupts() » dans l’initialisation du PIC, aucune interruption vecteur ne sera appelés se qui empêchera sont éxécution!!.
 

 


IVT_XXXX

L’appel des interruptions sont faites par IVT_XXXX, ou XXX est à remplacer par l’interruption que vous désirez. Une interruptions est exécutée en fonction de notre besoin. Par exemple si on désire utiliser les interruptions du timer 1 nous mettrons iv IVT_TIMER_1, ou bien un autre exemple si nous désirons obtenir des interruptions sur une capture d’entrée, nous mettrons iv IVT_INPUT_CAPTURE_1. Nous verrons un peu plus loin qu’ils existes d’autres interruptions.

Gabarit du programme des interruptions


Comme nous l’avons dis précédemment, puisque ces interruptions sont appelées en dehors du programme principal le gabarit du programme est le suivant

//Initialisation du PIC
procedure init ;
begin
EnableInterrupts(); // Activations des interruptions IVT
ilevel 7; // Propriété niveau 7
IC1IP0_bit:=1; // |
IC1IP1_bit:=1; // | Capture 1 sur le niveau 7
IC1IP2_bit:=1; // |
end ;
 
// Interruption
procedure Capture_1();
iv IVT_INPUT_CAPTURE_1; // Interruption de la capture sur la broche 1
ilevel 5; // Propriété niveau 5
begin
//programme de l’interruption….
end ;
 
// Programme principal
begin
init() ;
while true do
begin
// On exécute en boucle le programme principal
end;
end.

Visualisez bien cette mise en forme car celle-ci sera toujours réalisée de cette façon.
1 – L’initialisation du PIC ;
2 – L’interruption (ici dans l’exemple il s’agit de l’interruption INPUT- CAPTURE 1) ;
3 – Le programme principal exécuté en boucle.

Quelques interruptions en vues


MikroPascal for PIC32 propose une série d’interruptions possibles avec un PIC32. Les exemples ci-dessous montre quelques interruptions envisageables sur le MINI-32.

Possibilité de faire des interruptions sur :
– des interruptions externes,
– sur les Timers,
– sur des captures,
– sur des comparaisons,
– et bien d’autre encore….
Rq:Comme vous pouvez le constater, on retrouve l’interruption nommée INPUT_CAPTURE_1 comme dans l’exemple du gabarit du programme

C’est que le niveau de priorité? iLevel?


Prenons un exemple ou 2 voitures rentrent les unes après les autres dans un garage situé au sous-sol. La première voiture voit une led rouge (1er interruption) afin d’être stopper pour pouvoir prendre un ticket, et lorsque ce ticket a été pris cette même voiture verra une autre led qui passera au vert (2ème interruptions) indiquant au conducteur qu’il peut rentrer dans le parking. La voiture suivante se verra de nouveau avec une led Rouge allumée pour prendre de nouveau un ticket et rentrée elle aussi dans le parking souterrain.
 
Le programme va donc exécuter 2 interruptions, une pour la led Verte (par exemple une impression de ticket) et l’autre pour la led rouge (par exemple lever la barrière). Tout se passe bien puisque les voitures sont les unes derrière les autres et donc aucune voiture arrivera en même temps devant la barrière. Mais admettons que cette fois-ci nous nous retrouvons dans une situation ou les voitures sont les unes à côtés des autres! Et bien! c’est ce que nous allons voir tout de suite puisque c’est dans ce cas de figure que nous allons faire appel à la priorité (quelle voiture sera prioritaire par rapport à l’autre).

Niveau de priorité – iLevel X – bit xxIP

Nous avons dit précédemment que les interruptions pouvaient être prioritaires sur d’autre. Reprenons l’exemple précédent et imaginez maintenant que les voitures ne sont pas les unes après les autres mais cotes à côtes. Ce cas de figures est un peu plus complexe à réaliser car si 2 voitures arrivent au même moment , et qu’elles sont détectées en même temps, la seule manière de pouvoir rendre prioritaire l’une des deux pour « décoincer » la situation c’est de mettre des niveaux de priorités sur ces interruptions. Le PIC32 à la possibilité de mettre 7 niveaux de priorités, ainsi le premier niveau est prioritaire sur le 2ème, le 2ème niveau prioritaire sur le 3ème etc… etc … et cela jusqu’à 7!! Il en résulte que si nous avons 2 barrières situées l’une à côté de l’autre avec une barrière nommée barrièreA et l’autre nommée barrièreB , et que nous décidons de mettre une priorité sur la barrièreA et en 2ème priorité la barrièreB, il en résulte que si 2 voitures arrivent en même temps à la même seconde , c’est donc la barrièreA qui sera levée avant la barrièreB.
 
Dans ce cas iLevel X (ou X représente le niveau compris entre 1 et 7) permettra et vous l’aurez compris de rendre des interruptions prioritaires par rapports à d’autres. Imaginer vous qu’au même moment tout arrives en même temps!!! L’interruption (IV) à tout son intérêt, puisque il va interruptions concernée et en plus de choisir en fonction du “iLevel” celle qui sera prioritaire par rapport à l’autre tout simplement!. Hum!! qu’est ce qu’il nous raconte encore?!!

Ah oui!! une dernière chose, le réglage des niveaux de priorités sont réalisés par le bit xxIP (XX coresspond à l’interrutpion en question . par exemple si nous décidons d’utiliser le timer1 nous écrirons T1IP, si nous décidons le timer2 nous écrirons T2IP. Bien évidemment d’autre interrutpions sont accessible mais allons y doucement!!

Historiques


– 03/02/18
Première mise à disposition.

Dernière mise à jour le 10/02/18

Présentation


Commençons en douceur sur l’utilisation des interruptions du Timer1 qui à pour but de faire clignoter uniquement 3 leds de couleur Bleu/Rouge/Verte.

Schéma PIC32 Interruptions Timer1


Programme PIC32 Interruptions Timer1


Programme disponible aussi en MikroC

program PIC32_Interruptions_Timer1;
 
procedure init;
begin
AD1PCFG:= $FFFF; // Initialise les broches en numérique ou digital
TRISB:= 0; // Initialise le PORTB en sortie
LATB:= 0; // Initialise toutes les sorties du PORTB à l’état logique BAS
PORTB :=$0000; // On fixes les sorties à l’état zéro
 
EnableInterrupts(); // Activations des interruptions IVT
 
ON__T1CON_bit:=1; // On active le du TIMER1
 
TCKPS0_bit:=1; // |
TCKPS1_bit:=1; // | prescaler sur 256
 
 
T1IP0_bit:=1; // |
T1IP1_bit:=1; // | Réglage du TIMER1 en priorité 7
T1IP2_bit:=1; // |
 
T1IE_bit:=1; // On active le TIMER1 en mode interrutpion sur débordement
 
TMR1 := 0; // On met à zéro le TIMER1 pour commencer à compter…
end;
 
procedure Timer1_Interruption; // Nom du programme de l’interruption
iv IVT_TIMER_1; // Appel de l’interrutpion du TIMER1
ilevel 7; // Propriété niveau 7
begin
 
LATB.1:=LATB.1 xor 1;
LATB.4:=LATB.4 xor 1;
LATB.5:=LATB.5 xor 1;
 
IFS0.T1IF:= 0; // On sort de l’interruption et on recommence à compter
end;
 
begin
init;
while true do
begin
// On ne fait rien dans le programme principale
end;
end.
end.

Si on applique la structure comme expliqué précédemment dans les interruptions on y retrouve bien :
1 – La procédure nommée : procedure init; avec les instructions situé entre le début « begin » et la fin « end ; »
2 – L’interruption du Timer1 ;
3 – Le programme principal ;
 
Regardons en détails cette première programmation :

Activation du Timer1 – bit : T1CON


ON__T1CON_bit:=1; // On active le du TIMER1 afin de mettre en fonctionnement le Timer1

Réglage du prescaler – bit : TCKPS0/TCKPS1/TCKPS2


TCKPS0_bit:=1; // |
TCKPS1_bit:=1; // | prescaler sur 256

Exemple en vidéo?


Le réglage de ces bits permet de faire clignoter plus ou moins vite les leds. Une “grosse” vidéo ci-dessous permettra de mieux cerner l’intérêt du prescaler.

Réglage des priorités – bit : T1IP0/T1IP1/T1IP2

T1IP0_bit:=1; // |
T1IP1_bit:=1; // | Réglage du TIMER1 en priorité 7
T1IP2_bit:=1; // |
 
Nous retrouvons les 3 bits qui permettent de modifier la priorité soit 111 en binaire donne iLevel 7 – et 001 en binaire donne iLevel 1

Activation des interruptions sur débordement – bit : T1IE


T1IE_bit:=1; // On active le TIMER1 en mode interrutpion sur débordement.

Réglage des priorités – bit : T1IP0/T1IP1/T1IP2

Ce bit est accessible par le registre (REGISTER) IEC0.
 

 
Pour que l’interruption iv IVT_TIMER_1 se déclenche il faut que le bit d’interruption sur débordement du timer1 soit activée et c’est le rôle du bit T1IE_bit:=1. Ainsi Chaque fois que le Timer 1 va avoir terminé de compter, son drapeau d’interruption (voir Remarques) va se lever ce qui entraine la mise à l’état logique 1 du bit T1IF. Ensuite pour sortir de l’interruption du Timer, il suffit de mettre à 0 le bit T1IF.
Remarque : On parle de drapeau d’interruption chaque fois que le Timer est arrivé à sa dernière valeur de comptage (soit 255 pour le Timer1 qui compte sur 16 bits) ce qui entraine la mise à l’état logique 1 du bit T1IF. Plus généralement un drapeau levé correspond à l’état logique 1 et un drapeau baissé correspond à l’état logique 0.

iv IVT_TIMER_1;

Nous avons évoqué l’activation sur débordement du Timer1, mais nous n’avons pas vraiment approfondi la chose… Si vous avez manquez le début sur les interruptions il suffit de cliquer juste ici.
 
Nous savons maintenant que Iv IVT_TIMER_1 est une routine qui permet d’être appelé lorsque le Timer1 a débordé, mais c’est quoi un débordement ?
 
Pour n’importe quel Timer le débordement est le faite qu’un Timer va compter jusqu’à sa valeur maxi. Pour le Timer1 qui celui-ci compte sur 16 bits, sa valeur maxi est de 255 en décimal, c’est-à-dire qu’il va compter de 0 à 255 à chaque coup d’horloge, puis, lorsqu’il aura compté jusqu’à 255 son drapeau d’événement (drapeau d’interruption) va passer à l’état logique « 1 » indiquant que le Timer1 a débordé et qu’il a fini de compter ce qui va donc entrainer par la même occasion une interruption géré par iv IVT_TIMER_1 . Pour redémarrer de nouveau un cycle de comptage il suffit de remettre le drapeau d’interruption à 0 ce qui nous permettra de sortir de l’interruption iv IVT_TIMER_1.

D’autre Réglage du Timer1


Avant d’aborder les autres réglages du Timer1 je tiens à faire une parenthèse, Reprenons le tableau ci-dessous ensemble :

Ce tableau est le Registre (REGISTER) du T1CON qui permet de contrôler le Timer1. Ce registre est composé de 32 bits (0 à 31 on compte le zéro) 1 bit correspond à une case. Pour ma part, j’ai utilisé les routines de MikroPascal mais rien ne vous empêche d’utiliser le registre .
 
Plutôt que d’écrire en utilisant les routines de MikroPascal

 

ON__T1CON_bit:=1; // On active le du TIMER1
 
TCKPS0_bit:=1; // |
TCKPS1_bit:=1; // | prescaler sur 256
 

J’aurais bien pu écrire sous cette forme :

T1CON:=$8030

Il en résulte que sur 32 bits le registre T1CON donne en binaire
 
T1CON := 00000000 00000000 10000000 00110000 (en Hexadécimal donne : $8030)
 
On commence toujours de gauche à droite (bit le plus fort=32 au bit le plus faible=0)
 
Comme vous pouvez le voir, cela en fait des 0 et des 1 à mettre il va falloir bien faire attention et c’est assez fastidieux comme méthode surtout si nous sommes pressés… Vous comprenez maintenant pourquoi j’ai un petit faible pour les routines toutes faites ?!
 
Bon !! Fermons la parenthèse, et regardons en détails les possibilités du Timer1. Je vous laisse lire…



Autre exemple pour le bit TCKPS bit compris entre 0 et 1, je peux mettre la valeur de 1:64 en écrivant comme ceci :
 
TCKPS0_bit:=0; // |
TCKPS1_bit:=1; // | prescaler sur 64
 
Il reste plus qu’à écrire cette nouvelle ligne à la place de l’ancienne, de compiler, de flasher et le tour est joué !!
 
Je vous remets la vidéo, car une erreur volontaire est glissée. Regarder bien les bits du prescaler j’ai indiqué TCKPS0/TCKPS1/TCKPS2, alors que le DataSheet indique seulement TCKPS0/TCKPS1. Il en résulte que le bit TCKPS2 est inutile!!

Historiques


– 10/02/18
Programmation du PIC32 disponible aussi en MikroC.
– 03/02/18
Première mise à disposition.

Dernière mise à jour le 10/02/18

Présentation


Nous allons voir dans ce présent article que certaines broches du PIC peuvent être configurées en mode analogique et pour cela il faut bien configurer le bit AD1PCFG ainsi que le bit TRISB comme entrée.

AD1PCFG – configuration en analogique

Le PIC32MX534F064H dispose d’un total de 16 broches analogiques AN0/AN1/AN2/AN3/../AN15.
 
En ce qui concerne le MINI-32 équipé du PIC32MX534F064H n’a seulement que la moitié de broches connectées soit un total de 8 broches analogiques qui sont :
 
AN0 – Broche RB0
AN1 – Broche RB1
AN4 – Broche RB4
AN5 – Broche RB5
AN8 – Broche RB8
AN9 – Broche RB9
AN14 – Broche RB14
AN15 – Broche RB15
 
Afin de pouvoir utiliser ces broches comme un mode analogique il suffit d’agir sur le bit AD1PCFG mais comment ?Si vous désirez utiliser la broche RB0 comme en mode analogique il faut donc mettre le bit RB0 à 1. Puisque le PIC32MX534F064H dispose d’un total de 16 broches analogiques (16bit) il suffit d’écrire en binaire 00000000 00000001 soit en hexadécimal donne $0001. L’extrémité droite correspond au bit 0 (RB0), ensuite le bit 1(RB1), bit 2(RB2), etc… Il en résulte que le 4ème bit qui représente la broche RB4 sera à 1, ce qui nous donne en binaire :
00000000 00010000. soit 10 000 nous donne en hexadécimal $0010.
 
Attention !!! Il ne faut pas compter comme nous le ferons tous à partir de 1 car la première broche n’est pas « 1 » mais « 0 » !!! On prend en compte le chiffre à partir de « 0 ».
 

 
Un autre exemple pour bien assimiler, on désire avoir 3 entrées analogiques qui sont RB15/RB4 et RB2, ce qui nous donne en binaire : 10000000 00010100 soit en hexadécimal $8014. Vous allez me dire pourquoi utiliser la broche RB2 alors que celle-ci n’est pas connectée ?!! Vous avez raison cela ne sert à rien mais c’est un exemple !!! Bon ok !! Alors mettons RB0 à la place ce qui nous donne en binaire : 10000000 00010001 et en HEX (hexadécimal) $8011. C’est bien beau tout ça mais comment le coder en langage MikroPascal ? Je vais y venir et ce n’est pas compliqué, il suffit d’écrire AD1PCFG := $8011 tout simplement. puisque c’est ce registre qui permet de configurer en mode analogique

TRISB – configuration en entrée

Nous venons de voir comment configurée en mode analogique mais il reste quand même une autre chose à configurer. Oui!! Il reste les broches du PIC qui doivent être configurés comme des entrées. Le bit TRISB, qui d‘ailleurs on ne peut pas se tromper, comporte les modes analogiques AN0/AN1/…. .Ainsi, si nous voulons configurer les entrées comme des entrées analogiques, il suffit de mettre (si on reprend l’exemple précédent avec RB15/RB4/RB0 comme entrée) le port TRISB, à “1” logique les 3 entrées désirées. Nous obtenons donc en hexadécimal TRISB:= $8011. Allons maintenant mettre en pratique ce montage électronique.

ADC1_Get_Sample(x) – lecture d’une valeur analogique

Pour pouvoir lire une valeur analogique en sortie d’un potentiomètre, il faut utiliser la routine ADC1_Get_Sample(x) (x qui représente l’entrée de la broche). dans notre exemple; 3 entrées analogiques sont lues, et leurs valeurs sont stockées directement dans la variable Valeur1/Valeur2/Valeur3. La programmation en langage MikroPascal nous donne:

var
Valeur1,Valeur2,Valeur3:word; // Déclaration des 3 variables
Valeur1:=ADC1_Get_Sample(0); // Lecture de la broche RB0 et mis dans la variable Valeur1
Valeur2:=ADC1_Get_Sample(4); // Lecture de la broche RB4 et mis dans la variable Valeur2
Valeur3:=ADC1_Get_Sample(15); // Lecture de la broche RB15 et mis dans la variable Valeur3

Ces quelques lignes de codes permettent uniquement de lires les tensions analogiques et de les convertir en une valeur numérique afin que celle-ci soit stockée dans la variable “Valeur” , et par la suite de pourvoir l’exploiter plus tard… La conversion de la valeur analogique est réalisée sur 10 bits c’est-à-dire de 0 à 1023.

Conversion Anlogique Numerique (A/N)


La conversion d’une valeur analogique en numérique peut-être réalisée par une règle que nous connaisson tous “la règle de trois” ou bien le “produit en croix” ainsi pour une tension de 3,3V nous aurons une valeur numérique de 1023. Pour une tension de la moitié de la tension d’alimentation (3,3/2=1,65V) nous aurons une valeur numérique de 1023/2 soit 512. Si maintenant nous faisons l’inverse, soit pour une valeur numérique de 349, nous allons donc obtenir une tension analogique de (349*3,3)/1023 soit environ 1,13V. Pas compliqué vous ne trouvez pas?

Schéma PIC32 Entrées analogiques


Fonctionnement

Trois potentiomètres RV1, RV2, RV3. Ces potentiomètres sont raccordés sur les broches RB0/RB4/RB15 et les tensions sont lues sur ces broches qui sont toutes indépendantes et permettront d’éteindre ou d’allumer les leds par comparaison d’une tension de seuil que nous allons programmé. Cette tension de seuil sera fixée arbitrairement afin de pouvoir observer que les leds s’allumes lorsque nous dépassons cette tension de seuil. Les 3 tensions de seuils sont en valeurs numériques: 100/500/1000. Ainsi en comparant ces valeurs par rapport à celle qui est lue sur le potentiomètre, et que celle-ci est supérieure, les leds vont donc s’allumer.

Programme du PIC


Programme disponible aussi en MikroC

program PIC32_entrees_analogiques;
 
var
Valeur1,Valeur2,Valeur3:word; // Déclaration des 3 variables
 
procedure init;
begin
AD1PCFG := $7FEE; // Utilisation de l’entrée AN0/AN4/AN15 en mode analogique
TRISB := $8011; // Configuration des broches RB0/RB4/RB15 comme des entrées
LATB := $0000; // Initialise toutes les sorties du PORTB à l’état logique 0
ADC1_Init; // Initialisation du convertisseur analogique numérique (A/N)
 
TRISE := $0000; // Configuration du PORTE comme sortie
LATE := $0000; // Initialise toutes les sorties du PORTE à l’état logique 0
 
TRISF := $0000; // Configuration du PORTF comme sortie
LATF := $0000; // Initialise toutes les sorties du PORTF à l’état logique 0
 
TRISG := $0000; // Configuration du PORTG comme sortie
LATG := $0000; // Initialise toutes les sorties du PORTG à l’état logique 0
end;
 
 
begin
init;
while true do
begin
Valeur1:=ADC1_Get_Sample(0); // Lecture de la broche RB0 et mis dans la variable Valeur1
Valeur2:=ADC1_Get_Sample(4); // Lecture de la broche RB4 et mis dans la variable Valeur2
Valeur3:=ADC1_Get_Sample(15); // Lecture de la broche RB15 et mis dans la variable Valeur3
 
begin
if Valeur1>100 then LATE.0:=1 else LATE.0:=0 end;
 
 
begin
if Valeur2>500 then LATF.0:=1 else LATF.0:=0 end;
 
 
begin
if Valeur3>1000 then LATG.6:=1 else LATG.6:=0 end;
end;
end.

Prototype en vidéo



Attention erreurs avec LAT et PORT , en effet Les sorties s’actives toujours avec le registre LAT et non avec PORT!! comme vous pouvez le voir sur la vidéo je n’ai pas corrigé mais le programme oui!!

Historiques


– 10/02/18
Correction des sorties, Les sorties s’actives toujours avec le registre LAT et non PORT!!.
– 03/02/18
Première mise à disposition.

Dernière mise à jour le 10/02/18

Présentation


Nous avons tous envies pour une première fois de faire clignoter une ou voir même plusieurs leds “seule” ou bien à l’aide d’un petit bouton poussoir. Et bien vous savez quoi?!C’est ce que nous allons voir dans ce présent article.

Afin de pouvoir faire fonctionner les entrées/sorties du MINI-32 mettant à disposition le PIC32MX534F064H il faut avant tout passer par quelques réglages élémentaires qui sont : TRISx/LATx/PORTx (x représente la lettre du PORT utilisé), ces 3 réglages sont ce qu’on appel ceci des registres.

Registre TRISx

Ce registre permet d’écrire sur le port entrée/sortie, et c’est ce registre qui permet de changer les états des broches afin de les configurées soit en entrées soit en sortie. Par exemple, si nous voulons que le port B – broche RB4 soit une entrée, il suffit de mettre TRISB.4:=1. Si par contre cette même broche nous décidons que celle-ci soit une sortie il suffira d’écrire TRISB.4:=0. Alors attention quand même lorsque je parle des broches!! Les broches ne correspondent pas au n° de broche en elle même, mais plutôt au bit qui lui correspondent. Ici dans l’exemple proposé RB4 est le bit n°4. En effet si on regarde le schéma ci-dessous la broche n°4 ou est branchée la led D4 correspond au bit RB4. Mais je préfère parler de broches pour simplifier la lecture car en utilisant les bits, il en résulte que le portB est un port qui contient au total 16 bits (16 broches) de RB0 à RB15. L’inconvénient c’est que que le MINI-32 n’a pas toutes ses broches à disposition, mais seulement RB0/RB1/RB4/….On ne va pas se plaindre!! car il y’a suffisamment assez pour réaliser des tonnes de montages electroniques!!
 

 
Que ce passe t’il au niveau de la programmation? cela ne changer rien car si vous décidez de déclarer la broche RB2 (bit 2) comme une sortie ” TRISB.2:=0″vous n’obtiendrez jamais rien de celle-ci puisque celle-ci n’est pas cablée…

Registre LATx

Ce registre permet d’écrire sur le port entrée sortie, et c’est ce registre qui permet de changer les état des broches. Nous verrons tout ça en toute simplicité

Registre PORTx

Ce registre quant à lui permet de lire le port, et c’est ce registre qui permet de « détecter » l’état des entrées. l’appui sur un bouton pousssoir sera détecter en utilisant PORTx.y (avec y le n° de la broche concernée. Des exemples ci-dessous permettront de vous familiariser avec les entrées sorties et de mieux comprendre l’utilisation de ces registres.

Schéma PIC32 Sorties Actives




Comme vous pouvez le constater, afin de ne pas encombrer le schéma, je n’ai pas représenté toutes les leds, mais uniquement de la led D1 à D10.
Pour les autres leds non représentées sur le shéma électronique, le câblage est identique en utilisant des résistances de 1 kilo-ohms qui feront bien l’affaires. Soyons économiques niveau courant ;-). Ce montage ne fait que alimenter les leds afin de tester si toutes les sorties sont bien toutes à l’état haut soit à l’état “1” logique.

Programme du PIC


Programme disponible aussi en MikroC

program PIC32_Sorties_Actives;
procedure init;
begin
AD1PCFG := $FFFF; // Utilisation de l’entrée en mode numérique (digital)
TRISB := $0000; // toutes les broches du PORTB sont configurées en sorties
LATB := $0000; // Initialise toutes les sorties du PORTB à l’état logique 0
TRISD := $0000; // toutes les broches du PORTD sont configurées en sorties
LATD := $0000; // Initialise toutes les sorties du PORTD à l’état logique 0
TRISE := $0000; // toutes les broches du PORTE sont configurées en sorties
LATE := $0000; // Initialise toutes les sorties du PORTE à l’état logique 0
TRISF := $0000; // toutes les broches du PORTF sont configurées en sorties
LATF := $0000; // Initialise toutes les sorties du PORTF à l’état logique 0
TRISG := $0000; // toutes les broches du PORTG sont configurées en sorties
LATG := $0000; // Initialise toutes les sorties du PORTG à l’état logique 0
end;
begin
init;
while true do
begin
LATB:=$FFFF;
LATD:=$FFFF;
LATE:=$FFFF; // ici on force toutes les sorties à l’état logique 1
LATF:=$FFFF; // même pour les “broches” non cablées!!
LATG:=$FFFF;
end;
end.

 
Dans ce programme, on retrouve dans la procédure d’initialisation “procedure init;” le réglages des bits TRISx et LATx.
Puisque ici nous faisons que allumer des leds, la réglage de TRISx est configuré en sortie en écrivant “TRISx.y:=0” (x le port associé, et y le n° de broche (bit)), puis j’ai forcé l’état des sorties via le bit “LATx:=$FFFF” à 1 afin que les 16 bits (ou broches) soient toutes mises à l’état haut ce qui entraîne forcément la mise sous tension et l’éclairage des leds.
 
En ce qui concerne le bit AD1PCFG celui-ci permet uniquement de programmer les entrées en numérique (tout ou rien), j’aurais bien pu mettre ce bit AD1PCFG à l’état 0 soit “AD1PCFG:=$0000” afin d’obtenir cette fois-ci des entrées analogiques pouvant récupérer un signal qui variera entre 0 et 3,3V maxi!! Oui 3,3V maxi car l’alimentation du PIC est sous 3,3V et de même pour ces broches. Cela donne des idées l’analogique vous ne trouvez pas? je pense que vous me voyez venir…..
 
Que dire de plus mise à part que ce programme ne fait que d’allumer les leds à la mise sous tension. C’est un moyen simple de vérifier si tout les sorties du PIC vont changer d’état.

Schéma PIC32 Activer sortie à 1 bouton


Nous allons voir un autre montage éléctronique, qui celui-ci permettra à l’aide d’un boutons poussoirs d’allumer ou d’éteindre une leds.
Regardons ensembles ce nouveau schéma électronique et son programme:

Programme du PIC


Programme disponible aussi en MikroC

program PIC32_Activer_sortie_a_1_bouton;

procedure init;
begin
AD1PCFG := $FFFF; // Utilisation de l’entrée en mode numérique (digital)

TRISB := $0010; // configure la broche RB1 comme une entrée
LATB := $0000; // Initialise toutes les sorties du PORTB à l’état logique 0
TRISD := $0000; // toutes les broches du PORTD sont configurées en sorties
LATD := $0000; // Initialise toutes les sorties du PORTD à l’état logique 0
end;
procedure Allumer_Led;
begin
if PORTB.1=1 then LATD.10:=1 else LATD.10:=0; // Si on appuie sur le bouton la led s’allume sinon elle s’éteint
end;
begin
init;
while true do
begin
Allumer_Led;
end;
end.

La procédure “Allumer_led” permet comme son nom l’indique d’allumer la led D1. Lorsque le bouton Bp1 n’est pas pressé, la tension de 3,3V est appliquée directement sur la broche RB1 ce qui représente un “1” logique.
Lorsque cette fois-ci le bouton poussoir est relâché l’entrée RB1 se voit avec une tension de 0V ce qui entraîne l’extinction de la led. Avez vous remarquez que j’ai modifier le bit “TRISB” qui est configurée comme une entrée (broche RB1) en binaire sur 32 bits cela donne:
00000000 00000000 00000000 00000010 – 32 bits car je le rappel il y’a 16 Entrées/Sortie (E/S)

Schéma PIC32 Activer sorties à 2 boutons


Nous venons de voir avec 1 bouton poussoir, regardons maintenant ce qu’il en est avec 2 boutons poussoirs.

Programme du PIC


Programme disponible aussi en MikroC

program PIC32_Activer_sortie_a_2_boutons;

procedure init;
begin
AD1PCFG := $FFFF; // Utilisation de l’entrée en mode numérique (digital)

TRISB := $0003; // configure la broche RB0 et RB1 comme des entrées
LATB := $0000; // Initialise toutes les sorties du PORTB à l’état logique 0

TRISD := $0000; // toutes les broches du PORTD sont configurées en sorties
LATD := $0000; // Initialise toutes les sorties du PORTD à l’état logique 0
end;

procedure Allumer_Led_D1;
begin
if PORTB.0=1 then LATD.10:=1 else LATD.10:=0; // Si on appuie sur le bouton la led D1 s’allume sinon elle s’éteint
end;

procedure Allumer_Led_D2;
begin
if PORTB.1=1 then LATD.11:=1 else LATD.11:=0; // Si on appuie sur le bouton la led D2 s’allume sinon elle s’éteint
end;

begin
init;
while true do
begin
Allumer_Led_D1;
Allumer_Led_D2;
end;
end.

Que dire …… Ah oui!!! j’ai encore modifié le bit TRISB car cette fois-ci 2 entrées sont raccordées sur les broches RB0 et RB1.

Historiques


– 10/02/18
Ajout programmation en MikroC
– 03/02/18
Première mise à disposition.

 

Dernière mise à jour le 16/12/17

Présentation


Ce petit programme permet à lui seul d’effacer le contenu du bloc note.

 




 

Programmation en C#


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics; 
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Attention!!! Bloc note nommé "Electronique71" 
            StreamWriter writer = new StreamWriter(@"C:\Users\Julien\Desktop\Electronique71.txt", false);
        }         
    }
}

Historiques


16/12/17
– Première mise à disposition

Dernière mise à jour le 16/12/17

Présentation


Ce petit programme permet d’écrire plusieurs lignes dans un bloc note. Rien ne vous empêches d’ajouter des lignes supplémentaires.

 




 

Programmation en C#


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics; 
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

 // Écrire dans un fichier texte sans l'ouvrir lignes par lignes 

            string a; // on déclare les variables 
            string b; // ici 3 variables car 3 lignes 
            string c; // on peut mettre plus!!

            a = "1er ligne";
            b = "2ème ligne";
            c = "3ème ligne";
            string[] lines = { a, b, c };

 // Attention!!! Bloc note nommé "Electronique71" 
        File.WriteAllLines(@"C:\Users\Julien\Desktop\Electronique71.txt", lines);

        }
         
    }
}

Historiques


16/12/17
– Première mise à disposition

Dernière mise à jour le 01/11/2017

Présentation


Dans cette article, nous allons voir par calcul l’aspect physique du condensateur. Vous y trouverez 2 notes de calculs allant de la plus simple à la plus compliquées. La 1er note de calcul permet d’analyser des condensateurs de façon très simplifiés afin d’avoir une première approche et de comprendre le ou leurs comportements dans un montage électronique. (moi-même l’utilise car la charge d’un condensateur représenté par une droite affine ou linéaire est plus facile à comprendre!!)

Historiques


01/11/2017
-1er mise à disposition

Dernière mise à jour le 22/10/2017

Présentation


Le montage électronique présenté dans cette article, est un montage qui permet à partir d’une tension de fare varier un courant d’où son nom “Générateur de courant constant”. Le but est à partir d’une tension d’obtenir un courant proportionnel à cette tension qui sera appliquée sur l’entrée d’un amplificateur opérationnel. Afin d’avoir un courant qui représente “l’image” de la tension d’entrée, il est préférable d’utiliser des AOP de type “Rail to Rail”.

Schéma


Fonctionnement
J’ai utilisé l’AOP AD820, puisque celui-ci est du type “Rail to Rail”. Cet Gamme d’AOP permet d’obtenir en sortie une tension de 0 volts lorsque la tension sur la borne inverseuse et non inverseuse est égale à 0V.
Cet avantage est primordial puisque en sortie la tension ne génère aucune tension dirais-je “parasite”, ce qui aurait pus être le cas pour un AOP de type LM741, car la tension de sortie avoisine les 1,3V à 1,5V lorsque l’entrée inverseuse et non inverseuse est égale à 0V.
Le potentiomètre RV1, permet de modifier le courant qui parcours la led D1.
Lorsque ce potentiomètre est en haut, le courant sera nul ce qui entraîne l’extinction complète de la led D1.
Lorsque le potentiomètre est en bas, dans ce cas la led est allumée.

 




 

Courant
Vous allez me dire, “Mais Julien comment vous faites pour fixer le courant lorsque RV1 est en haut?“. Le raisonnementest le suivant, le montage proposé ci-dessus et un montage nommé suiveur, c’est-à-dire que la tension sur la borne inverseuse est égale à la tension sur la borne non inverseuse, si et seulement si la sortie de l’AOP est renvoyée sur l’entrée non inverseuse appelée boucle de rétroaction (en anglais feedback).
La formule magique devient donc I=(Vcc-E+)/R1 (avec Vcc la tension de la pile).
Ex: pour une tension E+=4,5V (potentiomètre réglé à moitié) I=(9-4,5)/1000=0,045 soit 4,5mA

Prototype


Pensez-vous que cela est vraiement nécessaire?

Circuit(s) imprimé(s)


Aucun, juste une vue en 3D pour voir la position des composants.

Historiques


22/10/2017
-1er mise à disposition

Dernière mise à jour le 09/10/2017

Présentation


Il vous arrives quelque fois de faire des tonnes et des tonnes de calculs et que ces valeurs que vous avez trouvées sur votre papier, ou votre cahier, ou bien l’énorme tableau blanc fixé au mur sont différentes avec les valeurs trouvées par simulation? Mais pourquoi avoir un écart aussi grand ou pourquoi les valeurs calculées non rien à voir avec la simulation ?
 

 
Cela tombe bien vous vous trouvez au bon endroit, et c’est ce que nous allons voir dans ce présent article.
Nous allons aborder dans un 1er temps les caractéristiques essentiels d’un transistor JFET puis ensuite nous allons simuler le montage électronique afin de faire la différence entre la théorie et la simulation.

Comment déterminer la transconductance gm


La formule la voici:

gm = (-2/Vp)*racine carré de (Idss*Id)

La tension de pincement du JFET est une donnée fondamentale du JFET, cette tension de pincement permet d’obtenir le courant Id=0mA, ce qui correspondrais à un interrupteur ouvert.

CANAL N Vgs < 0 – détermine Vp

(Exemple DataSheet d’un JFET Canal- N – la courbe à droite si Vgs=-2,5V environ Id=0A)
Pour un transistor JFET Canal-N, cette tension de pincement Vp peut être déterminée graphiquement en utilisant le graphique de simulation « Fonction de transfert » (voir Graph canal-N ci-dessous).
Il suffit de lire directement sur le graphique de la fonction de transfert du JFET et de vous placer sur le coté droit (partie saturée), puis de prendre la tension Vgs la plus basse
(elle correspond à la 1er « ligne » située en bas). Ainsi vous allez obtenir la tension de pincement Vp.

Pour un JFET canal-N, lorsque Vgs(off)<<0 (<< correspond à très inférieur) cela correspond à la tension de pincement Vp.

Graph Canal-N

CANAL P Vgs > 0 – détermine Vp

(Exemple DataSheet d’un JFET Canal- P – la courbe à droite si Vgs=3,5V environ Id=0A )

Pour un transistor JFET Canal-P, il suffit de faire exactement la même chose que précédemment. Si vous regardez bien le dataSheet du constructeur, vous allez vous apercevoir que cette valeur Vgs est supérieure à 0. Il en résulte que:
Pour un JFET canal-P, Vgs(off)>>0 (>> correspond à très supérieur) correspond à la tension de pincement Vp.
Graph Canal-P
Pas de graph Canal-P il suffit de prendre le graph du canal-N et d’enlever tout les signes “-” ainsi vous aurez la courbe d’un JFET canal-P, ce n’est pas plus compliqué que ça 😉

Courant de saturation Max Idss
Pour déterminer le courant Max il suffit encore une fois de prendre la partie la plus à droite de la courbe et la plus « haute ». Ainsi nous pouvons déterminer le courant IdssMax du transistor JFET. Il en est de même pour un transistor JFET à de Canal-P il suffit d’appliquer la même méthode.

Courant Id
Ce courant Id ce calcul avec les courant de repos (court-circuiter les sources de tension continu et ouvrir les générateurs de courants ainsi que les condensateurs).
Le courant qui circule sur le drain (D) est identique à celui qui circule sur la source (S).
Maintenant si vous appliquez tout ce qui a été dit précédemment vous pouvez dès à présent déterminer la transconductance gm en ampères/volt.

Paramétrer la “Fonction de Transfert”



Le montage ci-dessus permet de déterminer la fonction de transfert du JFET.
J’ai positionné, 2 sources de tensions Vds qui correspond à la chute de tension aux bornes du drain (D) et la source (S), et Vgs qui correspond à la chute de tension entre la grille (G) et la source (S).
Ce JFET comme vous pouvez le constater est un JFET à Canal-N, il en résulte que la tension Vgs est négative (N comme négatif), la tension va donc varier de 0 à – x (x une valeur). Si le JFET avait été un Canal-P la tension Vgs aurait été positive, la tension Vgs aurait donc variée de 0 à +x (x une valeur).

Paramétrer la courbe “Fonction de Transfert”

Pour ma part comme j’utilise un JFET Canal-N, j’ai donc placé sur :
Axe X correspond à Source 1 : Vds – paramétré de 0 à 5V
Axe Y correspond à Source 2 : Vgs – paramétré de 0 à -1V (tension Vgs négative)

Et voilà !! à quoi ressemble les caractéristiques de notre Transistor JFET, vous trouvez pas que cela ressemble au DataSheet du constructeur ?

Exemple 1: Simulation JFET 2N3819


Cette fois-ci passons au concret! Dans cet exemple j’utilise le 2N3819, je pouvais essayer un autre JFET, mais je me voyais mal à faire tout les exemples possible avec tout ces composant!!.

Calculs des valeurs et des composants

Plaçons le potentiel Va à Vcc/2 soit Va=Vds=9/2=4,5V. D’après la fonction de transfert pour une tension de 4,5V Id=10mA.
Calcul de R2
La résistance R2 est donc égale à R2 = (Vcc-Va)/Id=(9 – 4,5)/0,010= 450 Ohms
Calcul de la transconductance gm :
La formule est gm=(-2/Vp)*racine carre (Idss*Id)
Vp est la tension de pincement, cette tension de pincement est mesurable graphiquement, c’est-à-dire que plus la tension Vgs ira dans le négatif, et plus le courant sera nul.
Le principe est simple, on se place dans la zone de saturation et on prend la « ligne » située en bas du tableau


D’après le graphique il s’agirait d’une tension Vgs=-0,950V et un courant de 25uA. La tension de pincement Vgs(off) = -0,950V
Idss correspond au courant maxi, et d’après le graphique celui-ci est situé à 10mA.
En ce qui concerne le courant Id, c’est le courant que nous avons déterminé graphiquement précédemment et il est égal à 10mA.Gm=(-2/-0,950)*racine carré (0,010*0,010)=0,02105s

Calcul du gain
G = – gm*R2 = – 0,02105*450= – 9,47
Vout = Vin * 0,1 = 0,000707*(-9.47) = – 0,006695V soit – 6,695mV ce qui donne en valeur crête Vmax=0,006695*1,414=9,46mV
Vérifions :


Exemple 2: Simulation JFET 2N3819



Nous allons maintenant rajouter une résistance R3 entre la source et la masse ce qui nous donne ce nouveau schéma
Nous allons toujours maintenir la tension de 4,5V au point Va, et calculer la résistance R3 afin d’obtenir une tension Vgs à ses bornes de 0,350V soit -Vgs=Ur3 = 0,350V
Vds=Va-Ur3=4,5-0,350=4,15V.

Il faudra donc obtenir un Vgs de 0,350V pour une chute de tension de 4,15V aux bornes de Vds. Ainsi nous allons pouvoir déterminer graphiquement le courant Id ce qui nous donne graphiquement.
Calculs des valeurs et des composants

La valeur du courant Id=4,23mA
Calcul de R2
R2=(Vcc-Va)/Id=(9 – 4,5)/0,00423= 1063Ohms

Calcul de R3
R3=UR3/Id=0,350/0,00423=82 Ohms

Calcul de la transconductance gm
gm=(-2/Vp)*racine carre (Idss*Id)
avec Idss = 10mA (inchangé)
id = 4,23mA (déterminé graphiquement)
Vp = -0,950V (inchangé)
gm=(-2/-0,950)*racine carre (0,010*0,00423)
gm = 0,0136 soit 13,6 ms

Calcul du gain
Attention, pour ce nouveau montage électronique le gain est égale à :
G = – (gm*R2)/(1+gm*R3)
G = -(0,0136*1063)/(1+0,0136*82) = -6,835
Vout=Vin*G = 0,000707*(-6,835) = -0,004832 soit -4,832mV valeur crête Vmax=0,004832*1,414=6,833mV


Dernière mise à jour le 01/10/17

Présentation


Pour la présentation autant commencer directement au schéma 001

Schéma 001



Ce montage électronique permet de générer des trains d’impulsions. Basé sur un CD4093, il est tous à fait possible de modifier la modulation des trains d’impulsions en modifiant la valeur du potentiomètre RV1.

Le réglage de la fréquence est détaillé dans la Note de calcul.

Schéma 002 – Impulsions négatives



Ce montage est basé sur des impulsions négatives nommé « Negative-Edge Triggered », contraire du montage Schéma 003 qui lui est nommé « Positive-Edge Triggered »

Schéma 002 – Impulsions positives



Pour le coup, il s’agit du montage basé sur des impulsions positives

Schéma 003 – Alarmes




Un peu de bruit…

 
Le montage présenté est une petite alarme alimenté sous une tension de 9V, pile par exemple, c’est d’ailleurs ce que j’ai fais, comme le montre le prototype. La sortie est assuré avec deux transistor de type NPN et PNP, nous verrons un peu plus loin leurs principes.
Les deux CD4093 sont monté en série, le premier montage est l’étage modulant et l’autre étage qui est modulé, en effet le premier étage permet de générer des créneaux. Avec un tel signal ci celui-ci ce retrouve directement sur la membrane de notre HP, nous entendrons un son type carré plus précisément celui d’une sirène des pompier (PIN PON…).
Pour remédier à ça, il suffit de placer un oscillateur qui est modulé par l’oscillateur précédent, lorsque l’étage précédent (oscillateur modulant) passe au niveau haut, l’étage suivant (oscillateur modulé) va fournir des créneaux plus courts, plus rapproché, ainsi sur une période nous allons entendre un signal en tous ou rien grâce à l’oscillateur modulant, mais en parallèle nous allons entendre un signal plus rapide, ce qui donne tous mélangé un signal meilleur à l’écoute.

Montage Push-Pull (Combinaison NPN PNP)

Comme son nom l’indique (Push-Pull=Poussé-tiré), permet de fournir dans un sens du courant, ou soit dans l’autre sens le tirer vers la masse le courant. Ce qu’il faut retenir c’est que lorsque la tension Vbe sur le transistor 2N2222(NPN) est supérieur à environ 0,6V, celui-ci est saturé laissant passé le courant dans le HP, avec pour tension à ses bornes environ Vdd. Puis lorsque le transistor 2N2222 est bloqué, c’est au tour du transistor2N2905 de prendre le relais, la chute de tension Vbe étant aussi supérieur (le potentiel de la base est inférieur au potentiel du collecteur), le transistor 2N2905 sature.

 

 
Condensateur C1
Le rôle du condensateur C1 à une importance, puisque celui-ci va « jouer » sur la modulation de l’impulsion qui est en sortie du U1 :B. en fonction de la fréquence en sortie du U1:B, il va jouer le rôle de filtre passe haut et laisser passer les hautes fréquences.

Protoype



Le montage réalisé sur plaque d’expérimentation sans soudure.

Circuit(s) imprimé(s)


Aucun.

Historiques


01/10/2017
-1er mise à disposition