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

Comprendre les bases de la programmation PIC
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#41 Message par Temps-x » sam. 9 janv. 2021 01:31

Re

Code : Tout sélectionner


     
etatRC1=!RC1 0
     
etatRC2=!RC2 1
     
etatRC3=!RC3 2
     
etatRC4=!RC4 3
     
etatRC5=!RC5 4
     
etatRA3=!RA3 5
     
etatRA4=!RA4 6
     
etatRA5=!RA5 7


      clrf resA
      clrf resC
      clrf Ton

      movf PORTA
,W
      andlw 
B'00111000'

      
movwf resA

      bcf STATUS
,C
      rlf resA
,F                          B'01110000'
      
rlf resA,F                          B'11100000'

      
movf PORTC,W
      andlw 
B'00111110'
    
      
movwf resC

      bcf STATUS
,C
      rrf resC
,F                          B'00011111'


      
movf resA,W                         B'11100000'
      
iorwf resC,W                        B'00011111'    
     
      
movwf Ton                           B'11111111'                                       

 


Voilà en ASM, bon le principal c'est que tu es réussi à le faire :bravo:

djviper16 a écrit :Source du message Mes 8 interrupteurs pour programmer "x"

:roll: Le X m'appartient, j'ai déposé un copyright dessus

:sifflotte: ça va hurler demain avec tout le code ASM qui à était mis en section C exit


==> A+
Modifié en dernier par Temps-x le sam. 9 janv. 2021 01:52, modifié 1 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#42 Message par djviper16 » sam. 9 janv. 2021 01:50

PEDRO a écrit :Source du message je ne parle pas le C et je ne sais pas quel compilateur tu utilises, mais en MikroBasic, et je pense que c'est pareil en MikroC, l'une des solutions, si j'ai bien compris ton problème, est de faire :

Je suis avec CCS, je suis pas sûr d'avoir le droit de mettre .0 .1 .2 etc pour indiquer le bit de la variable.

Temps-x a écrit :Source du message Voilà en ASM, bon le principal c'est que tu es réussi à le faire

Bravo à toi surtout ! Je t'avoue que je n'arrive pas à décrypter ce que tu as fait.
Temps-x a écrit :Source du message       
inter4 : RA3      0
      inter3 : RA4      1 
      inter2 : RA5      2

      inter1 : RC1      3
      inter0 : RC2      4  
      inter7 : RC3      5
      inter6 : RC4      6
      inter5 : RC5      7


Tout à droite c'est la position des bits dans la variable ?

En fait j'ai crié victoire trop vite, ça ne fonctionne qu'à moitié et je ne comprends pas.

Par exemple si je fais if(Ton==0xFF) ça marche,
Ton==0x00 ça marche pas,
Ton==0xF0 ça marche,
Ton==0x0F ça marche,
Ton==0xCC ça marche,
Ton==0x5C ça marche pas,
Ton==0x4C ça marche pas,
Ton==0x05 ça marche pas,
Ton==0x07 ça marche pas,

A n'y rien comprendre ! :furieux:


Temps-x a écrit :Source du message
Le X m'appartient, j'ai déposé un copyright dessus

ça va hurler demain avec tout le code ASM qui à était mis en section C


:lol: :lol: :lol:
Modifié en dernier par djviper16 le sam. 9 janv. 2021 12:57, modifié 1 fois.

Comprendre les bases de la programmation PIC
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#43 Message par Temps-x » sam. 9 janv. 2021 01:59

Re

Je t'explique et tu le refait en C

1) Tu fais un ET logique sur le PORTA et tu récupère ça dans une variable A
2) Tu fait 2 rotations de bit sur la variable A

3) Tu fais un ET logique sur le PORTC et tu récupère ça dans une variable C
4) Tu fais 1 rotation de bit sur la variable C

5) Après tu fais un OU logique sur la variable A et variable C

6) Et tu récupère le résultat dans la variable Ton
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#44 Message par PEDRO » sam. 9 janv. 2021 02:01

djviper16 a écrit :Source du message Je suis avec CCS, je suis pas sûr d'avoir le droit de mettre .0 .1 .2 etc pour indiquer le bit de la variable.

Ca n'est pas bien long de faire un essai, et à mon avis il n'y a pas de raison car au niveau des instructions machine du PIC, sur les Ports, il n'y a pas d'instruction pour copier un octet entier, ça se fait en bit par bit.

Si ça fonctionne, tu pourras mettre l'ordre qui te convient

Comprendre les bases de la programmation PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#45 Message par satinas » sam. 9 janv. 2021 05:08

Bonjour

Ton = (portC.2<<0) | (portC.1<<1) | (portA.5<<2) | (portA.4<<3) | (portA.3<<4) | (portC.5<<5) | (portC.4<<6) | (portC.3<<7);

C'est pas mal ça, par contre je ne pense pas que l'on puisse écrire portC.2 avec CCS.
C'est ta question du tout début, et tu ne dis pas si tu lui as déjà fait accepter cette écriture d'une variable bit.
Le point est utilisé dans la directive #bit, qui a sa propre syntaxe, elle n'a rien à voir avec celle des instructions et variables C.
ça marche ça ?
unsigned int x = portC.2;
short b = portC.2;
C'est peut être possible en utlisant #byte

Plus loin, tu écris RC2<<0
portC et RC2 ils sont définis où ?

Pour moi c'est ça, déjà abordé par PEDRO en Basic, il y a peut être plus simple.

#byte PORTA = 0x05
#byte PORTC = 0x07

#bit b7 = PORTC.3
#bit b6 = PORTC.4
#bit b5 = PORTC.5
#bit b4 = PORTA.3
#bit b3 = PORTA.4
#bit b2 = PORTA.5
#bit b1 = PORTC.1
#bit b0 = PORTC.2

// avec des OR binaires
Ton = (b7<<7) | (b6<<6) | (b5<<5) | (b4<<4) | (b3<<3) | (b7<<7) | (b1<<1) | (b0<<0);
// avec des additions
Ton = (b7<<7) + (b6<<6) + (b5<<5) + (b4<<4) + (b3<<3) + (b7<<7) + (b1<<1) + (b0<<0);

On pourrait imaginer que b7<<7 ne marche pas, on ne peut décaler b7 car elle est binaire. Le C fait les calculs en int par défaut, donc il commence par convertir b7 en int (ou unsigned int) puis il fait les décalages.

Si on déclare les bits de Ton :
#bit t7 = Ton.7
#bit t6 = Ton.6
#bit t5 = Ton.5
#bit t4 = Ton.4
#bit t3 = Ton.3
#bit t2 = Ton.2
#bit t1 = Ton.1
#bit t0 = Ton.0

t7 = b7; t6 = b6; t5 = b5; t4 = b4; t3 = b3; t2 = b2; t1 = b1; t0 = b0;

Tu peux aussi calculer de façon identique avec les INPUT(PIN_XX), cela évite les #bit b.
Ou alors comme le dit Temps-x, travailler sur les octets PORTA et PORTC avec des & et <<, mais il n' y a pas de rotate en C, il faut le remplacer par des décalages. Cela devrait être plus rapide que la trentaine de décalages de bit suivie de la somme de 8 octets.

Autre méthode :
int i, Ton=0;
byte pins[] = { PIN_C2, PIN_C1, PIN_A5, PIN_A4, PIN_A3, PIN_C5, PIN_C4, PIN_C3 };
for (i=0; i<8; i++) {
Ton += INPUT(pins[i]) << i;
}

En revoyant le câblage :
Ton = (PORTC << 2) + (PORTA & 0x03);

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#46 Message par djviper16 » sam. 9 janv. 2021 12:35

Bonjour et merci pour vos réponses.

Voici mon programme actuel qui ne fonctionne qu'à moitié sans que j'en comprenne la raison :
Ça ressemble pas mal à ce que tu me proposes en solution 1 Satinas, sauf que je stocke les valeurs des bits d'entrée dans des variables "etat".

Code : Tout sélectionner

#include <16F684.h> 

#use delay(clock=4000000)    //fréquence de l'oscillateur interne : 4MHz
#fuses INTRC_IO,NOWDT,NOPUT,NOBROWNOUT,NOMCLR,NOPROTECT,NOCPD,NOPUT,NOIESO,NOFCMEN,BROWNOUT_NOSL    //il faut tous les mettre sinon ça marche pas
#use fast_io(A)                // permet d'utiliser set_tris_X(), sinon CCS affecte automatiquement les ports.
#use fast_io(C)                // permet d'utiliser set_tris_X(), sinon CCS affecte automatiquement les ports.


#bit MCLRE = 0x2007.5            //RA3 pull-up is enabled when MCLRE is ‘1’
#bit RAPU = 0x81.7
#byte ANSEL = 0x91
#byte CMCON0 = 0x19

//////TIMER1 REGISTRES//////
#byte INTCON = 0x0B            //INTCON REGISTER adresse 10h
#byte T1CON = 0x10            //T1CON REGISTER adresse 10h 
#byte TMR1L = 0x0E            //TMR1L REGISTER adresse 0Eh
#byte TMR1H = 0x0F            //TMR1H REGISTER adresse 0Fh
#byte PIR1 = 0x0C            //PIR1 REGISTER adresse 0Ch
#byte PIE1 = 0x8C            //PIE1 REGISTER adresse 8Ch
#bit TMR1IF = 0x0C.0        //bit Flag quand le timer déborde



//////ADRESSES PORTS ET BITS E/S//////
#byte portA=5                //adresse du port A
#byte WPUA=95                //adresse WPUA
#byte IOCA=96                //adresse IOCA
#byte portC=7                //adresse du port C
#bit RA0=portA.0            //affectation du RA0
#bit RA1=portA.1            //affectation du RA1
#bit RA2=portA.2            //affectation du RA2
#bit RA3=portA.3            //affectation du RA3
#bit RA4=portA.4            //affectation du RA4
#bit RA5=portA.5            //affectation du RA5
#bit RC0=portC.0            //affectation du RC0
#bit RC1=portC.1            //affectation du RC1
#bit RC2=portC.2            //affectation du RC2
#bit RC3=portC.3            //affectation du RC3
#bit RC4=portC.4            //affectation du RC4
#bit RC5=portC.5            //affectation du RC5



//////DECLARATION VARIABLES//////
int demisec;                //variable 0 à 2 -> pour compter le nombre de flag levés (un flag toutes les 0.5 sec)
int sec;                    //variable 0 à 59 -> pour faire une minute
int min;                    //variable 0 à 59 -> pour faire une heure
int hr;                         //variable 0 à 24
int Ton;                    //variable Tempo ON
int etatPortA;
int etatPortC;
int Toff;                    //variable Tempo OFF
int ConfTon;                //valeur attribuée à Ton
int ConfToff;                //valeur attribuée à Toff
int VarRA1;
int VarRA0;
short etatRC1;
short etatRC2;
short etatRC3;
short etatRC4;
short etatRC5;
short etatRA3;
short etatRA4;
short etatRA5;


void main()
{
//////PORTS ET BITS E/S//////    
ANSEL=0x00;
CMCON0=0xFF;
SET_TRIS_A(0xFC);              //(0)en décimal / (0x00)en hexa / (0b00000000) en binaire / PORT A en sortie
SET_TRIS_C(0xFF);
ANSEL=0x00;

MCLRE=0;                    //0 = RA3/MCLR pin function is digital input, MCLR internally tied to VDD
RAPU=0;                        //0 = PORTA pull-ups are enabled by individual port latch values
WPUA=0xFF;                     //1 = Pull-up enabled


//////VALEURS VARIABLES//////
demisec=0;
sec=0;
min=0;
hr=0;
VarRA1=0;
VarRA0=0;
Ton=0x00;

//////TIMER1 REGISTRES//////
INTCON=0xC0;                    //GIE et PEIE à 1 pour activer interruptions (bits 7 et 6)
T1CON=0x35;
TMR1L=0xDC;
TMR1H=0x0B;
PIR1=0x00;
PIE1=0x00;
TMR1IF=0;






    while(1)                
    
{


        if (TMR1IF==1)
        {    demisec++;
            TMR1IF=0;
            TMR1L=0xDC;
            TMR1H=0x0B; //0x0B

            if (demisec==2)
            {    sec++;
            demisec=0;
            VarRA1=!VarRA1;

            VarRA0=!VarRA0;
        
                if 
(sec==60)
                {    min++;
                demisec=0;

                    if (min==60)
                    {    hr++;
                        min=0;

                        if (hr==24)
                        {    hr=0;
                        }    
                    
}
                }
            }
        }
        

    if 
(RA2==0)
        {
        delay_ms(10);

        Ton=0x00;

        etatRC1=!RC1;
        etatRC2=!RC2;
        etatRC3=!RC3;
        etatRC4=!RC4;
        etatRC5=!RC5;
        etatRA3=!RA3;
        etatRA4=!RA4;
        etatRA5=!RA5;


        Ton = Ton | ((etatRC2<<0) | (etatRC1<<1) | (etatRA5<<2) | (etatRA4<<3) | (etatRA3<<4) | (etatRC5<<5) | (etatRC4<<6) | (etatRC3<<7));
    
        if 
(Ton==0x0F)
            {
            RA1=1;
            delay_ms(100);
            RA1=0;
            delay_ms(100);
            RA1=1;
            delay_ms(100);
            RA1=0;
            Ton=0x00;
            }
        }

    else
        
{RA1=0;}


    }
}



Comprendre les bases de la programmation PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#47 Message par satinas » sam. 9 janv. 2021 13:17

MCLRE est un flag de config hardware programmé en dur dans le pic, tu ne peux pas le modifier par soft.
On ne comprend pas ce que fait le programme, il faut expliquer la fonction des boutons, combien il y en a.
J'ai toujours pas compris le Ton = Ton | (...) C'est une serrure codée ? :-)

Comprendre les bases de la programmation PIC
djviper16
Débutant
Débutant
Messages : 60
Enregistré en : décembre 2020

#48 Message par djviper16 » sam. 9 janv. 2021 13:29

satinas a écrit :Source du message MCLRE est un flag de config hardware programmé en dur dans le pic, tu ne peux pas le modifier par soft.

Ah c'est pour ça que ça marche pas ! J'ai pas réussi à mettre le pull-up sur RA3, j'ai fini par mettre une résistance de 10k comme pour les entrées du portC.

J'ai mis une photo du projet sur une des pages précédentes. J'ai 8 interrupteurs et 2 boutons poussoir. Je veux me servir de ces 8 interrupteurs pour régler les valeurs des variables Ton et Toff sur 8 bit. Le bouton poussoir de gauche servant à lire les 8 interrupteurs et enregistrer la valeur dans "Ton", le poussoir de droite pareil pour "Toff".

Dans le programme actuel, quand j'appuis sur le bouton poussoir de gauche (RA2), je viens lire les 8 interrupteurs et écrire leur valeur dans la variable "Ton".

Pour vérifier si ça fonctionne, je fais clignoter une led sur RA1.

Sauf que ça ne fonctionne pas tout à fait.

Comprendre les bases de la programmation PIC
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#49 Message par satinas » sam. 9 janv. 2021 13:36

Puisque que tu remets à 0 Ton, ça sert a rien qu'il figure à droite.
Et même si tu le remets pas à 0, cette instruction remplit la totalité des 8 bits de Ton, et Ton est plutôt un byte qu'un int.
Ton = (etatRC2<<0) | (etatRC1<<1) | (etatRA5<<2) | (etatRA4<<3) | (etatRA3<<4) | (etatRC5<<5) | (etatRC4<<6) | (etatRC3<<7);
Je vois pas l'intérêt de la variable etatRC2, tu peux travailler directement avec RC2, dans le programme actuel.

Comprendre les bases de la programmation PIC
PEDRO
Amateur
Amateur
Messages : 127
Enregistré en : septembre 2015
Localisation : P.A.C.A

#50 Message par PEDRO » sam. 9 janv. 2021 13:59

djviper16 a écrit :Source du message Sauf que ça ne fonctionne pas tout à fait.

Peux-tu etre plus précis sur ce point : tu dis que ça ne marche pas tout à fait, donc il y a une partie qui marche
Peux-tu expliquer ce qui marche et ce qui ne marche pas

Encore une fois, je ne parle pas le C et je ne suis donc pas le mieux placé pour t'aider, néanmoins il y a quand meme quelques trucs que je comprend dans ton code en C et si j'ai bien compris ce que tu veux faire, je ne suis pas sur que l'architecture du programme soit optimale, notamment parce que j'ai cru y voir des variables pour des secondes, des minutes et des heures ce qui ne présente aucun interet dans une tempo sans affichage
Si tu veux, je veux bien discuter de l'architecture de ton programme, car cela est totalement indépendant du langage et du compilateur utilisé et peut-etre qu'en simplifiant cette architecture, tu vas t'affranchir de potentielles erreurs que je ne suis pas en mesure de déceler dans ton code

Il y a un autre point de tes propos qui a retenu mon attention et qui pourrait laisser penser que tu as peut-etre un soucis sur la configuration des Pins de ton PIC
A mes débuts, j'ai eu comme problème le fait qu'une entrée sur un PIC ne marchait pas bien, cela était du au fait que par défaut, le module comparateur de ce PIC était activé, le pin en question ne se comportait donc par comme une I/O normale ... jusqu'à ce que je comprenne ça et que j'ajoute une ligne de code pour désactiver les comparateurs et tout est rentré dans l'ordre.
Maintenant, je fais très attention à ce qu'il y a sur chaque pin que j'utilise et je regarde de près pour voir ce qui est activé par défaut

Dernière remarque à prendre avec des réserve : tu parles d'un problème pour activer le pull-up du A3. Je n'ai pas regardé le datasheet de ton PIC, mais le A3 est un pin très particulier sur un grand nombre de références que j'utilise, et sur ceux-là, le pull-up est toujours activé, sans possibilité de le désactiver


Retourner vers « Langage C »

Qui est en ligne

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