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 ---
Tout ce qui n'a pas de catégorie !
Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#191 Message par Babar64 » sam. 26 juil. 2025 11:55

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 .
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 :Source du message on pourrait se passer de la mesure tension d'induit ...?
J'avoue que je ne sais pas : Quelle serait son utilité ?

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.
Sx1+Sx2.jpg

Réglages_Sx1-Sx2.xls


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.
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3259
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#192 Message par paulfjujo » sam. 26 juil. 2025 16:52

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.
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#193 Message par Babar64 » ven. 1 août 2025 13:59

Bojour à tous,
paulfjujo a écrit :aucune commande portail possible (...)relancer le programme, récupérer les paramètres depuis l'eprom .... pour passer en exploitation
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 ! :eek: :shock: : lamentable!)

De retour sur le traitement des conditionnalités, je reste confronté à mes misérables limites (en gras dans le fichier au format rtf) :
Conditions.c
Je me doute que c'est assez pitoyable, mais est-ce qu'au moins ma démarche est cohérente ?
Merci de votre indulgence :wink:
A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3259
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#194 Message par paulfjujo » sam. 2 août 2025 15:35

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.

=================================================================================
// 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 ..


_Projet_H_TOUSSAINT_PORTAIL_Conditions_2025-0802.zip


:sifflotte:
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.
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#195 Message par Babar64 » dim. 3 août 2025 14:35

LO à tous,
paulfjujo a écrit :ATTENTION à ne pas confondre la désignation des pins
et l'image de l'état des pins
Ce serait plus ça ?

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
 

paulfjujo a écrit : fonction pour définir Test_conditions _permanentes
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.
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 ?
paulfjujo a écrit :il n'y a plus de voies analogique !
Exact. Du coup, ton fichier zip est à modifier...
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+
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3259
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#196 Message par paulfjujo » lun. 4 août 2025 20:33

bonsoir,

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 :

18F27K42_PMW_INA226_MCP23017_2025.X.zip




:!!: 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
:sifflotte: comme sur le schema d'ailleurs...

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

idea ! 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.
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#197 Message par Babar64 » mar. 5 août 2025 17:38

Merci Paul, et bonjour à tous.
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+
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3259
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#198 Message par paulfjujo » mar. 5 août 2025 20:32

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
Aide toi, le ciel ou FantasPic t'aidera

Portail lourd motorisé 2 vantaux 24v
Babar64
Avatar de l’utilisateur
Passionné
Passionné
Messages : 231
Âge : 76
Enregistré en : juillet 2021
Localisation : Euskal Herria

#199 Message par Babar64 » mar. 5 août 2025 21:41

paulfjujo a écrit :Source du message garder le MCP23017 sur I2C2 MCP en mode interrupt
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 quel tolérance de déplacement angulaire de vantail correspondante à cette durée ?
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.
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+
:idea: Pourquoi faire compliqué quand on peut faire inextricable

Portail lourd motorisé 2 vantaux 24v
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3259
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#200 Message par paulfjujo » mer. 6 août 2025 08:29

Babar64 a écrit :
paulfjujo a écrit :Source du message garder le MCP23017 sur I2C2 MCP en mode interrupt
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 ?
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 MCP


paulfjujo a écrit :Source du message quel tolérance de déplacement angulaire de vantail correspondante à cette durée ?
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.
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
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Coin Fourre-tout »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités