Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Portail lourd motorisé 2 vantaux 24v
Probablement, ou tout du moins d'un faible écart. J'ai pu trouver des charbons neufs d'origine que j'attends la semaine prochaine + câbles neufs, et je referai les mesures induits / câbles pour chaque moteur.paulfjujo a écrit : 2 mesures INA ..avec 2 adresse I2C en paramètre pour le choix de vantail.(moteur)
le paramétrage des 2 devrait être identique .
J'avoue que je ne sais pas : Quelle serait son utilité ?paulfjujo a écrit :Source du message on pourrait se passer de la mesure tension d'induit ...?
J'ai repris toutes tes remarques et adapté le fichier Excel en séparant chaque menu valeur/points ; j'y ai indiqué sur fond rouge quelques questionnements. Il y a notamment un point qui m'interpelle dans le calcul des points de la temporisation (Tmp_BRK) ligne 126 de ton fichier Excel : tu indiques qu'on a 1000 pts par seconde, donc pour les 4,9s sélectionnées, on devrait avoir 4900pts... pourtant, tu divises ce résultat par 100 ...?
Par ailleurs, on se limite désormais à 4,096s max, donc si je reprends le calcul avec ce maxi, pour 4s (max) on aurait 4000pts.
Remarque dans cette mise à jour Excel :
J'ai pensé n'utiliser que 2 poussoirs Sx1 et Sx2, afin de supprimer Sx3 et son sélecteur (simplifie le PCB).
Je propose donc :
- Sx1 + Sx2 >4s pour entrer en Prog
- Sx1 <4s pour gérer le 1er nombre
- Sx2 <4s pour gérer le 2nd nombre
- Sx1 >4s pour Valider la modif + passer au menu suivant
- Sx2 >4s pour enregistrer en RAM.
- Sw0 (reset MCU) pour quitter et passer en exploitation.
PS : merci pour le code. j'étais à 1000 lieux de ça!
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Portail lourd motorisé 2 vantaux 24v
- paulfjujo

Maître- Messages : 3259
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Babar64 a écrit :il y a notamment un point qui m'interpelle dans le calcul des points de la temporisation (Tmp_BRK) ligne 126 de ton fichier Excel : tu indiques qu'on a 1000 pts par seconde, donc pour les 4,9s sélectionnées, on devrait avoir 4900pts... pourtant, tu divises ce résultat par 100 ...?
Par ailleurs, on se limite désormais à 4,096s max, donc si je reprends le calcul avec ce maxi, pour 4s (max) on aurait 4000pts.
0 à >4095 => 0 à 4095 mS
diviser par 100 .. car usage timer 100mS 1 à 41 fois 100mS
0 à 4,1 secondes par pas de 0,1 sec
c' était dans l'optique d'un usage POTAR de reglage via voie analogique ADC 12Bits
mais si on n'utilise plus de voie ANA on peut regler la gamme que l'on veut !
via + et -
il faudra quand meme utiliser un timer et interrupt timer au bout du temps imposé
x fois 100mS
afin de ne pas perturber/mobiliser du temps dans la boucle principale.
Babar64 a écrit :- Sx1 + Sx2 >4s pour entrer en Prog
cela sous entend que le Programme est derivé sur la partie "reglages parametres"
donc aucune commande portail possible .. pendant cette phase.
- Sx1 <4s pour gérer le 1er nombre
- Sx2 <4s pour gérer le 2nd nombre
- Sx1 >4s pour Valider la modif + passer au menu suivant
- Sx2 >4s pour enregistrer en RAM..... et en eeprom
- Sw0 (reset MCU) pour quitter
et relancer le programme, recuperer les parametres depuis l'eprom .... pour passer en exploitation.
Portail lourd motorisé 2 vantaux 24v
Bojour à tous,
: lamentable!)
De retour sur le traitement des conditionnalités, je reste confronté à mes misérables limites (en gras dans le fichier au format rtf) :Je me doute que c'est assez pitoyable, mais est-ce qu'au moins ma démarche est cohérente ?
Merci de votre indulgence
A+
Oui... Et on va donc rester comme ça (et je n'oserai surtout pas reprendre le cynisme de notre Président : Si quelqu'un a mieux, qu'il le dise et surtout qu'il le fasse !paulfjujo a écrit :aucune commande portail possible (...)relancer le programme, récupérer les paramètres depuis l'eprom .... pour passer en exploitation
De retour sur le traitement des conditionnalités, je reste confronté à mes misérables limites (en gras dans le fichier au format rtf) :Je me doute que c'est assez pitoyable, mais est-ce qu'au moins ma démarche est cohérente ?
Merci de votre indulgence
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Portail lourd motorisé 2 vantaux 24v
- paulfjujo

Maître- Messages : 3259
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Henri et à tous,
voir mes remarques dans le fichier Conditions_2025-0802_P.c
concerne l'attention à la difference entre l'etat en cours d'une pin et la memorisation (image) de l'etat de cette pin
et aussi la definition de la pin origine PIC ou MCP
l'usage du flottant est à reduire au maximum.
utilisation de uint8_t si on sait que la variable ne depassera jamais 255
ou sinon en uint16_t 16 bits
notion de conditions permanentes ....
il n'y a plus de voies analogique ! vu la gestion par menu.
plus de details dans le main_18F27K42_PMW_INA226_MCP23017_2025-0719.X.c ... dans le slip
Dans ce projet, il faudrait avoir au minimum, un "Portail virtuel" connecté au PIC
trop delicat sur un proto breadboard pour connecter toutes les infos ..et sans moteur consommant (accouplé à de la mecanique)
a moins de tester modulairement dans un 1er temps ..
dans la Todo_List
- ecrire une fonction int8_t MCP23017_GetBit_PORTB(uint8_t mask);
- Projet à ouvrir : Portail Virtuel ...modelisation du moteur , vantail, des cames ..etc
voir mes remarques dans le fichier Conditions_2025-0802_P.c
concerne l'attention à la difference entre l'etat en cours d'une pin et la memorisation (image) de l'etat de cette pin
et aussi la definition de la pin origine PIC ou MCP
l'usage du flottant est à reduire au maximum.
utilisation de uint8_t si on sait que la variable ne depassera jamais 255
ou sinon en uint16_t 16 bits
notion de conditions permanentes ....
il n'y a plus de voies analogique ! vu la gestion par menu.
=================================================================================
// Sorties du PIC :
uin8_t STOP_outPA4 ; // Blocage moteurs à l’arrêt (1)
* ATTENTION à ne pas confondre la designation des pins
et l'image de l'etat des pins
exemple :
// designation de la pin
#define STOP_outPA4_Pin TRISAbits.TRISA4=0 // RA4 en sortie
#define STOP_outPA4 LATAbits.LATA4 // RA4 en sortie
etat (image) de cette pin ,via lecture de ladite pin
//mets l'etat de la pin à 1
STOP_outPA4= 1;
on a pas l'habitude de lire l'etat d'une sortie,
on se referre à l'image de celle-ci
positionnée ailleurs dans le programme
néanmoins on peut la lire via
x=PORTAbits.RA4; // la vraie sortie et non la memoire de sortie
===========================================================================
// Entrées au MCP :
uint8_t DELAI_inMB5 ; // Choix Avec(1) ou Sans(0) décalage des vantaux
Delai_inMB5 ..non trouvée sur le schema ?
Rappel:
L'acces aux etats pins MCP doit se faire au prealable par une lecture globale du PORT MB
à chaque tour de boucle principale ou via interruption..
uint8_t MCP23017_ReadGPIOB(void) {
uint8_t value;
value = I2C1_Read1ByteRegister(MCP23017_ADDR, MCP_GPIOB);
return value;
}
et ensuite stocker eventuellement chaque bit dans une "image"
ou utiliser
exemple
uint8_t Value_MB;
uint8_t DELAI_inMB5 ;
Value_MB= MCP23017_ReadGPIOB()
DELAI_inMB5=( Value_MB & 0b00100000 ) >> 5; //isole bit N°5 et decalage à droite de 5
donc valeur 0 ou 1...
ou utiliser une structure, permettant d'eclater 8 bits dans 8 variables pour chaque bit
typedef struct {
uint8_t Lck_Open_inMB7;
uint8_t Asbcl_inMB6;
uint8_t Gap_VTX_inMB5;
uint8_t AL_Jn_inMB4;
uint8_t AL_Rg_inMB3;
uint8_t Radar_inMB2;
uint8_t PTNctc_inMB1;
uint8_t ALARM__inMB0;
} MB_value;
MB_Value= MCP23017_ReadGPIOB()
..me parait plus lourd à gerer...
ou ecrire une fonction
int8_t MCP23017_GetBits_PORTB(uint8_t mask);
=========================================================================
// Sorties du MCP :
// LedHome_outMA4 ; // Sortie Led maison : ON, OFF, 1Hz, 2Hz
// AL_Jn_outMA5 ; // Sortie Led clavier Jaune : ON, OFF, 1Hz, 2Hz
// AL_Vr_outMA6 ; // Sortie Led clavier Vert : ON, OFF, 1Hz, 2Hz
// AL_Rg_outMA7 ; // Sortie Led clavier Rouge : ON, OFF, 1Hz, 2Hz
...meme raisonnement pour les sorties !
definir des masques
exemple
//Mask pour MCP_OLATA
#define Flash 1
#define Sirene 2
#define Buzzer 4
#define AL_Vr_outMA6 6
uint8_t AL_Vr=0;
pour ecrire un bit en sortie MCP
// --- ecriture 1 bit particulier sur MCP23017
void MCP23017_SetBits_PORTA(uint8_t mask, uint8_t state) {
uint8_t Etat_EnCours = I2C1_Read1ByteRegister(MCP23017_ADDR, MCP_GPIOA);
uint8_t Nouvel_Etat = 0;
if (state) {
Nouvel_Etat = Etat_EnCours | mask; // Mise à 1 des bits spécifiés par le masque
} else {
Nouvel_Etat = Etat_EnCours & ~mask; // Mise à 0 des bits spécifiés par le masque
}
MCP23017_Write_Register(MCP_OLATA, Nouvel_Etat);
}
exmple : pour ecrir AL_Vr=1;
MCP23017_SetBits_PORTA( AL_Vr_outMA6, Al_vr);
******************************
fonction pour definir
Test_conditions _permanentes
*******************************
uint_8t Condition_Ready_To_OPEN;
uint_8t Condition_Ready_To_CLOSE;
uint8_t Test_conditions _permanentes(void)
{
Condition_Ready_To_OPEN=( SwOP1_inPB1+ SwOP2_inPB3<1 + STOP_outPA4<<2 + OBST_ON<<3 + Alert_inPC0<<4 + Over_INA<<5) & 0x3F;
Condition_Ready_To_CLOSE= (SwCL1_inPB2 + SwCL2_inPB4<1 + STOP_outPA4<<2 + OBST_ON<<3 + Alert_inPC0<<4 + Over_INA<<5) & 0x3F;
}
if (Condition_Ready_To_OPEN == 0x24) // 0b000010100
{
READY_TO_OPEN=1 ;
READY_TO_CLOSE=0 ;
}
else if {Condition_Ready_To_CLOSE ==0x24 ) // 0b00010100
{
READY_TO_OPEN=0 ;
READY_TO_CLOSE=1 ;
}
else
{
READY_TO_OPEN=0 ;
READY_TO_CLOSE=0 ;
}
return ( READY_TO_OPEN+ READY_TO_CLOSE+2); // reourne 0 ou 1 ( ou 2 =anomalie)
}
plus de details dans le main_18F27K42_PMW_INA226_MCP23017_2025-0719.X.c ... dans le slip
Dans ce projet, il faudrait avoir au minimum, un "Portail virtuel" connecté au PIC
trop delicat sur un proto breadboard pour connecter toutes les infos ..et sans moteur consommant (accouplé à de la mecanique)
a moins de tester modulairement dans un 1er temps ..
dans la Todo_List
- ecrire une fonction int8_t MCP23017_GetBit_PORTB(uint8_t mask);
- Projet à ouvrir : Portail Virtuel ...modelisation du moteur , vantail, des cames ..etc
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Portail lourd motorisé 2 vantaux 24v
LO à tous,
Une fois l'ordre (valide) lancé, l'état en cours ne change pas jusqu'à la fin (ou l'arrêt en cas d'anomalie) du traitement, où l'analyse d'un changement d'état est à nouveau effectuée suite à un nouvel ordre de commande.
C'est bien ça que teste la condition permanente que tu proposes en lieu et place de mes if/else if/else?
Dans le script if (Condition_Ready_To_OPEN == 0x24) // 0b000010100 ... , il y a un truc que je ne pige pas : l'accolade } après return. A quelle accolade { correspond-elle ?
Quant à "écrire une fonction int8_t MCP23017_GetBit_PORTB(uint8_t mask);" (ou passer par une structure), je ne sais pas par où commencer! Voilà ce que je comprends :
A+
Ce serait plus ça ?paulfjujo a écrit :ATTENTION à ne pas confondre la désignation des pins
et l'image de l'état des pins
Code : Tout sélectionner
// RA1 du PIC (pin 3) est configuré en entrée
#define Sx1_inPA1_Dir TRISAbits.TRISA1
#define Sx1_inPA1 PORTAbits.RA1
uin8_t Sx1_inPA1 ; // État Poussoir 1 paramétrages : appui=0 ; lâché =1
// RA4 du PIC (pin 6) est configuré en sortie
#define STOP_outPA4_Dir TRISAbits.TRISA4
#define STOP_outPA4 LATAbits.LATA4
uin8_t STOP_outPA4 ; // État Moteurs : bloqués=1 : libres=0
Les 3 états : prêt pour ouverture ; prêt pour fermeture ; ou pas, conditionnent le traitement à suivre après un ordre de commande. Dans mon approche j'avais indiqué ces 3 états comme des CAS, mais avais plutôt utilisé des if/else if/else.paulfjujo a écrit : fonction pour définir Test_conditions _permanentes
Une fois l'ordre (valide) lancé, l'état en cours ne change pas jusqu'à la fin (ou l'arrêt en cas d'anomalie) du traitement, où l'analyse d'un changement d'état est à nouveau effectuée suite à un nouvel ordre de commande.
C'est bien ça que teste la condition permanente que tu proposes en lieu et place de mes if/else if/else?
Dans le script if (Condition_Ready_To_OPEN == 0x24) // 0b000010100 ... , il y a un truc que je ne pige pas : l'accolade } après return. A quelle accolade { correspond-elle ?
Exact. Du coup, ton fichier zip est à modifier...paulfjujo a écrit :il n'y a plus de voies analogique !
Quant à "écrire une fonction int8_t MCP23017_GetBit_PORTB(uint8_t mask);" (ou passer par une structure), je ne sais pas par où commencer! Voilà ce que je comprends :
Code : Tout sélectionner
//L'accès aux états pins MCP doit se faire au préalable par une lecture globale du PORT MB à chaque tour de boucle principale ou via interruption..
uint8_t MCP23017_ReadGPIOB(void)
{
uint8_t value;
value = I2C1_Read1ByteRegister(MCP23017_ADDR, MCP_GPIOB);
return value;
}
//Ensuite stocker chaque bit dans une "image" ; exemple :
uint8_t Value_MB ;
Value_MB= MCP23017_ReadGPIOB()
ALRM_inMB0==(Value_MB & 0b00100000 ) >> 0; // isole bit N°0 et décalage à droite de 0 donc valeur 0 ou 1 : pour gestion alarme Maison
PTNctc_inMB1==(Value_MB & 0b00100000 ) >> 1; // isole bit N°1 et décalage à droite de 1 donc valeur 0 ou 1 : pour gestion commande Portillon
RADAR_inMB2==(Value_MB & 0b00100000 ) >> 2; // isole bit N°2 et décalage à droite de 2 donc valeur 0 ou 1 : pour Détection Radar Intrusion
TCA_Rg_inMB3==(Value_MB & 0b00100000 ) >> 3; // isole bit N°3 et décalage à droite de 3 donc valeur 0 ou 1 : pour report analyse TCA (rouge)
TCA_Jn_inMB4==(Value_MB & 0b00100000 ) >> 4; //isole bit N°4 et décalage à droite de 4 donc valeur 0 ou 1 : pour report analyse TCA (jaune)
DELAI_inMB5=(Value_MB & 0b00100000 ) >> 5; // isole bit N°5 et décalage à droite de 5 donc valeur 0 ou 1 : Choix avec (1) sans (0) décalage Vantaux
ASbcl_inMB6==(Value_MB & 0b00100000 ) >> 6; // isole bit N°6 et décalage à droite de 6 donc valeur 0 ou 1 : pour report intégrité boucle autosurveillance
BUTEE_inMB7=(Value_MB & 0b00100000 ) >> 7; // isole bit N°7 et décalage à droite de 7 donc valeur 0 ou 1 : Choix avec (1) sans (0) butée en position ouvert
A+
Portail lourd motorisé 2 vantaux 24v
- paulfjujo

Maître- Messages : 3259
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
Attention:
ne pas utiliser le meme nom pour define et pour la variable !
pour utiliser l'image de l'entree RA1 :
Etat_Sx1_inRA1 = Sx1_inRA1 ; // État Poussoir 1 paramétrages : appui=0 ; lâché =1
ou pour un test sur l'etat en cours de RA1
if ( Sx1_inPA1 ==1 ) .....
lire une sortie:
Etat_Stop_OutRA4= PORTAbits.RA4 ; //Lecture de l' etat reel de la sortie Pin RA4
PORTAbits.LATA4 étant l'etat de la bascule
mais on pourrait se contenter de ne lire que la bascule,
si aucun probleme hardware ne peut perturber la vraie sortie exemple : un courcircuit de la sortie
Etat_Stop_OutRA4= STOP_outRA4 ; // lecture etat bascule de sortie
pour Ecrire dans une sortie
utiliser LATA4.
(n'existait pas sur les anciens PIC16F, usage de PORTA4)
exemple
STOP_outPA4=1;
+ ne pas oublier les inits dans le main
STOP_outRA1_Dir=1; // entree
STOP_outRA4_Dir=0; // sortie
et imposer un niveau par defaut pour les sorties!
STOP_outRA4=0;
en gros
bien differencier
* un #define pour travailler avec un libellé de varaiable intuitif (mnemonique)
* la commande d'une sortie
* la variable de memorisation ou image de cette commande de sortie
* la lecture de l'etat d'une (Pin de) sortie
utiliser trop de define (Mnemoniques) peut entrainer une lourdeur d'ecriture
exact, l'idée de base est bien celle ci.
il faut isoler le BON bit dans le masque avant de faire faire le decalage ....
j'ai remis le masque en Hexadecimal ,plus parlant qu'en format bits
La condition prealable est de rafraichier Value ,
pour avoir une date fraicheur OK de l'etat des variables (bits)...
c'est une solution globale
lire individuellement chaque bit me parait plus lourd à gerer
mais cela depend de la reactivité du programme (duree temps de boucle principale)
ou faut-il mettre ce rafraichissement dans un timer à 100mS (ex: Tmr6)
..je vais mesurer la duree du rafraichissement globale value_MB (et donc des bits)
avec la solution precité au dessus.
pour l'incidence par rapport à l'intervalle de 100mS
Le timer6 etant affecté à la base de temps 100mS
il y aura aussi la gestion des clignotemment 1Hz et 2Hz dans le traitement IT Timer6
et autre ?
.... c'est fait
Test duree lecture PORTB MCP23017
SMT1 Nb Tics 430 uS
comprend la lecture du port B MCM23017 ET aussi l'eclatement des bits dans les 8 variables
==============
avec l'usage d'une structure ..solution plus académique
voici les 2 solutions proposées:
resultat sur terminal YAT
*** avec MB0=0 MB1=1 MB2=0 MB3=1 MB4=0 et MB5 à 7 =1
**** Avec MB5=0 MB6=0 MB7=0
les 2 façons gaspillent le meme nombre de µS 430µs ou 426µS
avec version epurée du main :
attention à l'ordre des bits :
la structure definition des bits commence par b0 ! et non b7
visu traditionelle d'un byte avec poids fort à GAUCHE ! B7........B0
comme sur le schema d'ailleurs...
Nota :
dans la 2em methode ,on trimbale des noms de variables bit plus long ..avec prefixe U1.MCPB_in
nota:
la methode su Interrupt au changement d'etat n'apporte rien,dans la mesure ou l'I2C n'est pas reentrant..
car autilisé par ailleur (LCD,INA,..)
sinon PIC18F47K42 40 pin et I2C2 dedié aux MCP
votre avis sur la methode 1 ou 2 ?
Laquelle vous parait plus judicieuse ..et pourquoi ?
ou autre ?
Babar64 a écrit :
// RA1 du PIC (pin 3) est configuré en entrée
#define Sx1_inPA1_Dir TRISAbits.TRISA1
#define Sx1_inPA1 PORTAbits.RA1
uin8_t Sx1_inPA1 ; // État Poussoir 1 paramétrages : appui=0 ; lâché =1
Attention:
ne pas utiliser le meme nom pour define et pour la variable !
pour utiliser l'image de l'entree RA1 :
Etat_Sx1_inRA1 = Sx1_inRA1 ; // État Poussoir 1 paramétrages : appui=0 ; lâché =1
ou pour un test sur l'etat en cours de RA1
if ( Sx1_inPA1 ==1 ) .....
// RA4 du PIC (pin 6) est configuré en sortie
#define STOP_outPA4_Dir TRISAbits.TRISA4
#define STOP_outPA4 LATAbits.LATA4
uin8_t STOP_outPA4 ; // État Moteurs : bloqués=1 : libres=0
#define STOP_outRA4_Dir TRISAbits.TRISA4 c'est une sortie
#define STOP_outRA4 LATAbits.LATA4 concerne la sortie RA4
uin8_t Etat_STOP_outRA4; image de l'etat de la sortie Memorisée en interne PIC
lire une sortie:
Etat_Stop_OutRA4= PORTAbits.RA4 ; //Lecture de l' etat reel de la sortie Pin RA4
PORTAbits.LATA4 étant l'etat de la bascule
mais on pourrait se contenter de ne lire que la bascule,
si aucun probleme hardware ne peut perturber la vraie sortie exemple : un courcircuit de la sortie
Etat_Stop_OutRA4= STOP_outRA4 ; // lecture etat bascule de sortie
pour Ecrire dans une sortie
utiliser LATA4.
(n'existait pas sur les anciens PIC16F, usage de PORTA4)
exemple
STOP_outPA4=1;
+ ne pas oublier les inits dans le main
STOP_outRA1_Dir=1; // entree
STOP_outRA4_Dir=0; // sortie
et imposer un niveau par defaut pour les sorties!
STOP_outRA4=0;
en gros
bien differencier
* un #define pour travailler avec un libellé de varaiable intuitif (mnemonique)
* la commande d'une sortie
* la variable de memorisation ou image de cette commande de sortie
* la lecture de l'etat d'une (Pin de) sortie
utiliser trop de define (Mnemoniques) peut entrainer une lourdeur d'ecriture
Babar64 a écrit :C'est bien ça que teste la condition permanente que tu proposes en lieu et place de mes if/else if/else?
exact, l'idée de base est bien celle ci.
Babar64 a écrit :Quant à "écrire une fonction int8_t MCP23017_GetBit_PORTB(uint8_t mask);" (ou passer par une structure),
je ne sais pas par où commencer! Voilà ce que je comprends :
Ensuite stocker chaque bit dans une "image" ;
il faut isoler le BON bit dans le masque avant de faire faire le decalage ....
j'ai remis le masque en Hexadecimal ,plus parlant qu'en format bits
Code : Tout sélectionner
// Etat des entree MCP23017 PORT B
uint8_t Value_MB ; // etat du Port B MCP23017 ( 8 bits)
uint8_t ALRM_inMB0,PTNctc_inMB1, RADAR_inMB2, TCA_Rg_inMB3, TCA_Jn_inMB4;
uint8_t DELAI_inMB5, ASbcl_inMB6, BUTEE_inMB7;
Value_MB= MCP23017_ReadGPIOB() ; // appel de cette fonction à chaque tour de boucle principale
La condition prealable est de rafraichier Value ,
pour avoir une date fraicheur OK de l'etat des variables (bits)...
c'est une solution globale
lire individuellement chaque bit me parait plus lourd à gerer
mais cela depend de la reactivité du programme (duree temps de boucle principale)
ou faut-il mettre ce rafraichissement dans un timer à 100mS (ex: Tmr6)
..je vais mesurer la duree du rafraichissement globale value_MB (et donc des bits)
avec la solution precité au dessus.
pour l'incidence par rapport à l'intervalle de 100mS
Le timer6 etant affecté à la base de temps 100mS
il y aura aussi la gestion des clignotemment 1Hz et 2Hz dans le traitement IT Timer6
et autre ?
.... c'est fait
Test duree lecture PORTB MCP23017
SMT1 Nb Tics 430 uS
comprend la lecture du port B MCM23017 ET aussi l'eclatement des bits dans les 8 variables
==============
avec l'usage d'une structure ..solution plus académique
voici les 2 solutions proposées:
Code : Tout sélectionner
// Etat des entree MCP23017 PORT B
uint8_t ALRM_inMB0,PTNctc_inMB1, RADAR_inMB2, TCA_Rg_inMB3, TCA_Jn_inMB4;
uint8_t DELAI_inMB5, ASbcl_inMB6, BUTEE_inMB7;
struct HuitBits
{
unsigned ALRM :1;
unsigned PTNctc :1;
unsigned RADAR :1;
unsigned TCAR :1;
unsigned TCAJ :1;
unsigned DELAI :1;
unsigned ASbcl :1;
unsigned BUTEE :1;
} MCPB_inp;
union {
uint8_t MCP_B; // la lecture
struct HuitBits MCPB_inp;
}U1;
..dans le main ..
CPrint("\r\n Mesure de la duree lecture PORTB MCP23017 \r\n");
Start_Chrono();
// MCP_B = MCP23017_ReadGPIOB();
MCP_B = I2C1_Read1ByteRegister(MCP23017_ADDR, MCP_GPIOB);
ALRM_inMB0= (MCP_B & 0x01 ) ; // pour gestion alarme Maison
PTNctc_inMB1=(MCP_B & 0x02 ) >> 1; // pour gestion commande Portillon
RADAR_inMB2 =(MCP_B & 0x04 ) >> 2; //pour Détection Radar Intrusion
TCA_Rg_inMB3=(MCP_B & 0x08 ) >> 3; // pour report analyse TCA (rouge)
TCA_Jn_inMB4=(MCP_B & 0x10 ) >> 4; // pour report analyse TCA (jaune)
DELAI_inMB5 =(MCP_B & 0x20 ) >> 5; // Choix avec (1) sans (0) décalage Vantaux
ASbcl_inMB6 =(MCP_B & 0x40 ) >> 6; // pour report intégrité boucle autosurveillance
BUTEE_inMB7 =(MCP_B & 0x80 ) >> 7; // Choix avec (1) sans (0) butée en position ouvert
Stop_Chrono(1);
CRLF1();
CPrint("\r\n Test 1 : lecture PORTB MCP23017 et isolation de chauqe bit dans varaible :\r\n");
sprintf(CRam1, "MCP_inp= 0x%2X soit% 3d soit ",MCP_B,MCP_B,MCP_B);
Print(CRam1);
Binarise_Octet(MCP_B);
CRLF1();
sprintf(CRam1, "ALRM= %d,PTNC =%d,Radar=%d,TCAR=%d ,TCAJ=%d,Delai=%d,ASbc=%d,Butee=%d\r\n",
ALRM_inMB0,PTNctc_inMB1, RADAR_inMB2, TCA_Rg_inMB3,
TCA_Jn_inMB4, DELAI_inMB5, ASbcl_inMB6, BUTEE_inMB7);
Print(CRam1);
__delay_ms(1000);
//******************************************************
CPrint("\r\n Test 2 : lecture PORTB MCP23017 avec structure et union :\r\n");
U1.MCP_B = I2C1_Read1ByteRegister(MCP23017_ADDR, MCP_GPIOB);
sprintf(CRam1, "MCP_B= 0x%02X soit %3d soit ",U1.MCPB_inp,U1.MCPB_inp);
Print(CRam1);
Binarise_Octet(MCP_B);
CRLF1();
sprintf(CRam1, "ALRM= %d,PTNC =%d,Radar=%d,TCAR=%d ,TCAJ=%d,Delai=%d,ASbc=%d,Butee=%d\r\n",
U1.MCPB_inp.ALRM,
U1.MCPB_inp.PTNctc,
U1.MCPB_inp.RADAR,
U1.MCPB_inp.TCAR,
U1.MCPB_inp.TCAJ,
U1.MCPB_inp.DELAI,
U1.MCPB_inp.ASbcl,
U1.MCPB_inp.BUTEE);
Print(CRam1);
CRLF1();
resultat sur terminal YAT
*** avec MB0=0 MB1=1 MB2=0 MB3=1 MB4=0 et MB5 à 7 =1
Mesure de la duree d'excution lecture PORTB MCP23017
SMT1 Nb Tics 432 uS
Test1 : lecture PORTB MCP23017 et isolation de chauqe bit dans varaible :
MCP_inp= 0xEA , soit234 , soit 11101010
ALRM= 0,PTNC =1,Radar=0,TCAR=1 ,TCAJ=0,Delai=1,ASbc=1,Butee=1
Test 2 :lecture PORTB MCP23017 avec structure et union :
MCP_B= 0xEA , soit 234 , soit 11101010
ALRM= 0,PTNC =1,Radar=0,TCAR=1 ,TCAJ=0,Delai=1,ASbc=1,Butee=1
changer d'entree MCP pour le test suivant, et appui sur Enter
**** Avec MB5=0 MB6=0 MB7=0
Test1 : lecture PORTB MCP23017 et isolation de chauqe bit dans varaible :
MCP_inp= 0x1F , soit 31 , soit 00011111
ALRM= 1,PTNC =1,Radar=1,TCAR=1 ,TCAJ=1,Delai=0,ASbc=0,Butee=0
Test 2 :lecture PORTB MCP23017 avec structure et union :
MCP_B= 0x1F , soit 31 , soit 00011111
ALRM= 1,PTNC =1,Radar=1,TCAR=1 ,TCAJ=1,Delai=0,ASbc=0,Butee=0
changer d'entree MCP pour le test suivant, et appui sur Enter
les 2 façons gaspillent le meme nombre de µS 430µs ou 426µS
avec version epurée du main :
attention à l'ordre des bits :la structure definition des bits commence par b0 ! et non b7
visu traditionelle d'un byte avec poids fort à GAUCHE ! B7........B0
Code : Tout sélectionner
void Binarise_Octet(unsigned char untel) // sens MSB first
{
unsigned int i,j ;
j=128;
for (i=0; i<8;i++)
{
if ((untel & j)==j)
{
PrintChar('1');
}
else
PrintChar('0');
j=j>>1;
}
}Nota :
dans la 2em methode ,on trimbale des noms de variables bit plus long ..avec prefixe U1.MCPB_in
nota:
la methode su Interrupt au changement d'etat n'apporte rien,dans la mesure ou l'I2C n'est pas reentrant..
car autilisé par ailleur (LCD,INA,..)
sinon PIC18F47K42 40 pin et I2C2 dedié aux MCP
votre avis sur la methode 1 ou 2 ?Laquelle vous parait plus judicieuse ..et pourquoi ?
ou autre ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Portail lourd motorisé 2 vantaux 24v
Merci Paul, et bonjour à tous.
Toutes ces remarques me font fortement craindre que mon choix d'utiliser une extension MCP au PIC crée trop de contraintes, notamment de durée de boucle.
Sauf erreur de ma part, il faut très (trop?) souvent rafraichir... Le MCP, bien sûr, mais aussi chaque changement de position des 4 cames, notamment pour les lectures aux INA, sans compter les états Obstacle, Radar, LCD, Leds, et tant d'autres encore...
Je me pose la question de n'utiliser qu'un seul PIC, donc sans MCP... mais lequel ?
Serait-ce une meilleure solution (ce qui implique de revoir le PCB de fond en comble... mais bon.)?
Je dois préciser que je souhaite n'utiliser que du boitier DIP : pas d'implantation CMS...
J'ai bien vu le 18F4620-I/P, mais je ne pense pas qu'il convienne, car je crois comprendre qu'il n'y a que 3 sorties PWM/CCP au lieu des 4 dont j'ai absolument besoin...
Pat ailleurs, un double sélecteur est nécessaire sur les ports ICSP pour disposer du nombre de ports nécessaire... si l'on peut effectivement utiliser les ports E0 à E2 en tant qu'entrées...
Mais peut-être n'ai-je pas bien fouillé?
Merci de vos commentaires éclairés.
A+
paulfjujo a écrit :Source du message La condition préalable est de rafraichir Value_MSB , pour avoir une date fraicheur OK de l'état des variables (bits)...
- Lire individuellement chaque bit me parait plus lourd à gérer, mais cela dépend de la réactivité du programme (durée temps de boucle principale)
- Ou faut-il mettre ce rafraichissement dans un timer à 100mS (ex: Tmr6) : je vais mesurer la durée du rafraichissement globale value_MB (et donc des bits)
Toutes ces remarques me font fortement craindre que mon choix d'utiliser une extension MCP au PIC crée trop de contraintes, notamment de durée de boucle.
Sauf erreur de ma part, il faut très (trop?) souvent rafraichir... Le MCP, bien sûr, mais aussi chaque changement de position des 4 cames, notamment pour les lectures aux INA, sans compter les états Obstacle, Radar, LCD, Leds, et tant d'autres encore...
Je me pose la question de n'utiliser qu'un seul PIC, donc sans MCP... mais lequel ?
Serait-ce une meilleure solution (ce qui implique de revoir le PCB de fond en comble... mais bon.)?
Je dois préciser que je souhaite n'utiliser que du boitier DIP : pas d'implantation CMS...
J'ai bien vu le 18F4620-I/P, mais je ne pense pas qu'il convienne, car je crois comprendre qu'il n'y a que 3 sorties PWM/CCP au lieu des 4 dont j'ai absolument besoin...
Pat ailleurs, un double sélecteur est nécessaire sur les ports ICSP pour disposer du nombre de ports nécessaire... si l'on peut effectivement utiliser les ports E0 à E2 en tant qu'entrées...
Mais peut-être n'ai-je pas bien fouillé?
Merci de vos commentaires éclairés.
A+
Portail lourd motorisé 2 vantaux 24v
- paulfjujo

Maître- Messages : 3259
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
la lecture MCP + repartition des variables bits ne prend que 430µS ! en mode pooling
18F4620 ? et pourquoi pas un 18F46K42 40 pin port D Bits + Porte E 3bits
et garder le MCP23017 sur I2C2 MCP en mode interrupt
je vais verifier cette option ...
Nota : En milieu industriel , les automates April SMC600 , utilisés pendant plus de 25 ans
ne reactualisaient les Entres/sorties que toutes les 35 à 40mS (watchdog à 50mS) avec des CPU 6809
........puis ensuite les PLC siemens à <5mS de temps de cycle
La question de base : evaluer la duree de boucle ...
et quel tolerance de deplacement angulaire de vantail correspondante à cette duree ?
l
la lecture MCP + repartition des variables bits ne prend que 430µS ! en mode pooling
18F4620 ? et pourquoi pas un 18F46K42 40 pin port D Bits + Porte E 3bits
et garder le MCP23017 sur I2C2 MCP en mode interrupt
je vais verifier cette option ...
Nota : En milieu industriel , les automates April SMC600 , utilisés pendant plus de 25 ans
ne reactualisaient les Entres/sorties que toutes les 35 à 40mS (watchdog à 50mS) avec des CPU 6809
........puis ensuite les PLC siemens à <5mS de temps de cycle
La question de base : evaluer la duree de boucle ...
et quel tolerance de deplacement angulaire de vantail correspondante à cette duree ?
l
Portail lourd motorisé 2 vantaux 24v
Quel serait l'intérêt de garder le MCP si le PIC 18F27K42 (40pins) peut traiter directement les entrées/sorties dont j'ai besoin ?paulfjujo a écrit :Source du message garder le MCP23017 sur I2C2 MCP en mode interrupt
Le déplacement angulaire dépend de la vitesse lente réglée. On pourra donc trouver un réglage correct de la durée en mode sans butée.paulfjujo a écrit :Source du message quel tolérance de déplacement angulaire de vantail correspondante à cette durée ?
Comme je l'ai laissé entendre, j'essaye de faire en sorte que ce projet puisse être adapté pour d'autres utilisateurs dont les configurations seraient différentes de la mienne.
A+
Portail lourd motorisé 2 vantaux 24v
- paulfjujo

Maître- Messages : 3259
- Âge : 75
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Babar64 a écrit :Quel serait l'intérêt de garder le MCP si le PIC 18F27K42 (40pins) peut traiter directement les entrées/sorties dont j'ai besoin ?paulfjujo a écrit :Source du message garder le MCP23017 sur I2C2 MCP en mode interrupt
avec PIC18F47K42 40pins
Oui, sans MCP si le rajout du PORT D 8 bits et 3 bits Port E est suffisant pour remplacer les 16 I/O du MCPLe déplacement angulaire dépend de la vitesse lente réglée. On pourra donc trouver un réglage correct de la durée en mode sans butée.paulfjujo a écrit :Source du message quel tolérance de déplacement angulaire de vantail correspondante à cette durée ?
Comme je l'ai laissé entendre, j'essaye de faire en sorte que ce projet puisse être adapté pour d'autres utilisateurs dont les configurations seraient différentes de la mienne.
A+
nota:
on peut tres bien Lire l'etat MCP en plusieurs points de la boucle principale , afin d'avoir une date fraicheur la plus faible possible
en particulier , en remplaçant les diverses tempo de xmS (relativement importantes et necessaires ) à la gestion du LCD .
idem pour le rafraichissment des mesures INA..
donc à mon avis , la problematique soulevée sur la duree globale de la boucle principale , peut etre levée.
D'autant que la reactivité sur IMax ALERT est imédiate du fait d'etre traitée en Hardware
Retourner vers « Coin Fourre-tout »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

