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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Additionner 2 octets
folkeu08
Débutant
Débutant
Messages : 64
Âge : 59
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#1 Message par folkeu08 » dim. 25 août 2024 00:37

bonjour,

Je cherche à additionner deux octets pour allumer en même temps les 2 premières led de mon MCP23S17.

Code : Tout sélectionner

// Port Expander module connections
sbit  SPExpanderRST at RC0_bit;
sbit  SPExpanderCS  at RC6_bit;
sbit  SPExpanderRST_Direction at TRISC0_bit;
sbit  SPExpanderCS_Direction  at TRISC6_bit;
// End Port Expander module connections

bit oldstate;                          // Old state flag d'un bouton


 
unsigned char i 0;
char A 0b00000001;
char B 0b00000010;
char G;

void main() {

PORTB 0;                              // All PORTB pins are cleared
//TRISB = 0b11111111;                   // All PORTB pins are configured as outputs

TRISB0_bit 1;                         // set RB0 pin as input
TRISB1_bit 1;                         // set RB1 pin as input
TRISB2_bit 1;                         // set RB2 pin as input
TRISB3_bit 1;                         // set RB3 pin as input
TRISB4_bit 1;                         // set RB4 pin as input
TRISB5_bit 1;                         // set RB5 pin as input
TRISB6_bit 1;                         // set RB6 pin as input
TRISB7_bit 1;                         // set RB7 pin as input

Spi1_Init();
Expander_Init(0);                       // Initialize Port Expander
Expander_Set_DirectionPortA(0,0x00);    // set expander's porta to be output
Expander_Set_DirectionPortB(0,0x00);    // set expander's portb to be output
Expander_SetBit_PortA(00x00);
//Expander_Set_PullUpsPortA(0, 0xFF);
//Expander_Set_PullUpsPortB(0, 0xFF);



  
while(1)
   {
    
//Expander_SetBit_PortA(0, 0x01);  //1ère led A0
    //Expander_SetBit_PortA(0, 0x02);    //1ère led A1
    // Expander_SetBit_PortA(0, 0x04);    //1ère led A2
    //Expander_SetBit_PortA(0, 0x08);    //1ère led A3
    //Expander_SetBit_PortA(0, 0x0B);    //1ère led A4
    //Expander_Write_PortA(0, 0x01);
    //Expander_Write_PortA(0, 0x02);
    //Expander_Write_PortA(0, 0x04);
    //Expander_Write_PortA(0, 0x08);
    
Expander_Write_PortA(00b00000000);
    
Delay_ms(2000);  /* One second pause */
    
Expander_Write_PortA(0A);
    
Delay_ms(1000);  /* One second pause */
    
Expander_Write_PortA(0B);
    
Delay_ms(1000);  /* One second pause */
    //Expander_Write_PortA(0, 0b00000000);
    //G = A ;
    
= (A|B);
    
Delay_ms(1000);  /* One second pause */
    
Expander_Write_PortA(0G);
  }



Lorsque je fais ce calcul G = (A|B);, aucune des deux ne s'éclaire alors quzavec la table de vérité, ca devrai le faire.
J'ai encore loupé quelque chose :mur:
François

Additionner 2 octets
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » dim. 25 août 2024 09:34

bonjour,


Si c'est OK,
sauf que tu eteins tes leds tout de suite apres ...
mets la tempo APRES l'ecriture dans l'expander

Code : Tout sélectionner


  G 
= A|B;
  Expander_Write_PortA(0, G);
  Delay_ms(2000);  /* two second pause */



testGDB.jpg


nota: GDB online est bien plus facile et rapide à utiliser pour un petit test que lancer MikroC ou XC8 !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Additionner 2 octets
folkeu08
Débutant
Débutant
Messages : 64
Âge : 59
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#3 Message par folkeu08 » dim. 25 août 2024 10:14

Bonjour Paulfjujo,

J'ai en fait fortement réduis la durée du délai et ca me l'affiche maintenant correctement.
Maintenant opération inverse, j'allume les 2 leds au départ et je cherche à les éteindre l'un après l'autre. Faut que je cherche le bon opérateur !
Le souhait est de trouver comment allumer ou éteindre la led concernée (en fonction de l'interrupteur on ou off) sans changer l'état des autres leds.
Je connaissais pas le debugger en ligne. C'est même intéressant pour moi qui utilise lazarus car il fait le Pascal.
Je reprends l'élec et un peu la prog après une bonne 10aines d'années d'arrêt. Il me faut remettre mes automatismes en route et remonter la logique.
François
C'est pas la durée des délai qui ont corrigé, c'est que j'avais oublié un délai à la fin de la boucle pour laisser l'oeil le temps de voir les 2 leds. J'exécutais la dernière et le première instruction de la boucle à la suite.

Additionner 2 octets
folkeu08
Débutant
Débutant
Messages : 64
Âge : 59
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#4 Message par folkeu08 » dim. 25 août 2024 11:35

Eteindre les leds une à une doit être un peu plus complexe car j'ai utiliser le premier qui me paraissait le plus logique (&) mais que nini.
Alors j'ai joué au débutant en essyant tous les opérateurs soit avec des 0 ou des 1 et ca éteint rien!
Dois-je passer par des masques ?
A+
Si c'est bon, c'est encore moi qui ai écrit une grosse bêtise comme mon nez au milieu du visage !
Normalement, je dispose de tout pour écrire mon programme en entier, hormis de jouer avec les interruptions.

Additionner 2 octets
gwion
Expert
Expert
Messages : 1121
Enregistré en : février 2022

#5 Message par gwion » dim. 25 août 2024 13:50

Si tu fais G = A&B; tu vas obtenir 1.

Additionner 2 octets
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3256
Âge : 75
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » dim. 25 août 2024 15:21

folkeu08 a écrit :Dois-je passer par des masques ?


Oui...
poids du bit dans le masque ...


test_masqueGDB.jpg


Attention, suivant les compilo ...
char peut etre signé ! 0 à 127 , sinon negatif au dela..
d'ou unsigned char avec mikroC

je prefere byte .. utilisé (jadis) avec turboC 2.00 , là on est tranquille
c'est au programmeur de decider s i on l'utilise avec signe ( bit 7) ou non
et c'est pas le compilo qui faisait sa loi ...

contrairement à MPLAB XC8 version 2.36 et C99 !
:furieux: Ultra chiant .. avec
char
unsigned char
int8_t
uint8_t
plus des cas ou il veut un int16_t , voir uint16_t
meme si la donnée à traiter est sur 8 bits ..1 octet ..1 byte
......sinon warnings à gogo

tout cela pour rester au plus pres des PIC16 ou 24, 32 et les familles ATMEL
pourquoi faire simple ,quand on peut faire compliqué

:sifflotte: MikroC est heureusement ,un peu plus tolérant..
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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