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
satinas
Expert
Expert
Messages : 1498
Enregistré en : novembre 2015

#31 Message par satinas » ven. 18 déc. 2020 21:35

Salut,

soit output_bit(PIN_B5, !input(PIN_B5));
soit output_toggle(PIN_B5);

Le fait d'avoir un flag etat reflet de l'état de la pin n'est pas forcément superflu, car c'est plus facile à manipuler que PIN_B5.
Le fait que short soit une variable bit dans CCS est assez particulier, d'habitude c'est un entier.

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

#32 Message par djviper16 » ven. 18 déc. 2020 21:49

Ah merci, ça marche au poil !

Je n'ai pas la fonction "output_toggle" dans la doc de mon compilateur, mais je viens d'essayer et cette fonction est bien reconnue !
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

#33 Message par djviper16 » ven. 8 janv. 2021 22:46

Bonsoir et bonne année à tous,

Je suis en train de fabriquer un petit bidule que je nomme "temporisateur cyclique programmable".
Concrètement c'est pour activer un relais pendant "x" secondes toutes les "y" minutes. "x" et "y" étant des variables paramétrables par 8 interrupteurs.

J'utilise un PIC16F684, donc 2 ports A et C de 6 E/S chacun.

Mes 8 interrupteurs pour programmer "x" et "y" sont répartis de la sorte : 3 sur le port A, et 5 sur le port C.

Pour info mes interrupteurs sont câblés comme suit :
inter0 : RC2
inter1 : RC1
inter2 : RA5
inter3 : RA4
inter4 : RA3
inter5 : RC5
inter6 : RC4
inter7 : RC3

Sous forme de tableau ça donnerait ça :

Code : Tout sélectionner


Bit    I   7   I    6   I   5   I   4   I   3   I   2   I   1   I   0   
----------------------------------------------------------------------
PortA  I       I        I   3   I   4   I   5   I       I       I 
----------------------------------------------------------------------
PortC  I       I        I   6   I   7   I   8   I   1   I   2   I


Ca fait 3h que je cherche comment faire pour lire cet octet dispatché sur 2 ports différents. Peut-être un tableau ? Je ne sais pas.

Help ? :lol:


PS : je viens de lire le topic "Peut-on séparement gerer les bits en MikroC?" et j'ai l'impression que le problème n'est pas si différent.
Si j'ai bien compris il faudrait que je lise le portA et le portC en masquant les bits dont je n'ai pas besoin, que je stocke ça dans des variables puis que je les assemble pour créer mon octet. Si j'ai juste et bien je suis pas sorti de l'auberge ! :shock: D'autant plus qu'il faut que j'écrive le résultat en mémoire EEPROM, chose que je n'ai jamais faite non plus. :sifflotte:

J'ai testé ça mais sans succès, en plus il me dit qu'il manque une parenthèse fermée je pige pas...

Code : Tout sélectionner

    Ton 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)); 
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

#34 Message par Temps-x » sam. 9 janv. 2021 00:40

Bonsoir djviper16, satinas, et tout le forum,

paulfjujo a écrit :Source du message :sifflotte: sans aucune ligne de code ASM !!!


En version ASM, 10 lignes et c'est fini :langue:

Code : Tout sélectionner


    clrf lieu

    movf PORTA
,W
    andlw 
B'00111000'
    
    
movwf resA 
    call ecrit_eepromm lieu
,resA

    incf lieu
,F

    movf PORTC
,W
    andlw 
B'00111110'
    
    
movwf resC 
    call ecrit_eepromm lieu
,resC
    


Voilà, tu as pu cas étudier ça, c'est paulfjujo qui va être content. exit

==> A+
: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

#35 Message par djviper16 » sam. 9 janv. 2021 00:44

Oh ! Mais je suis chiant je le veux en C moi :lol:
Pour le portC ça serait plutôt ça non ? :

Code : Tout sélectionner

movf PORTC,W
    andlw B
'00111110'


J'ai écrit un truc qui a l'air de passer au niveau de la compilation, je vous tiens au jus :

Code : Tout sélectionner

        Ton = Ton | ((RC2<<0) | (RC1<<1) | (RA5<<2) | (RA4<<3) | (RA3<<4) | (RC5<<5) | (RC4<<6) | (RC3<<7));
Modifié en dernier par djviper16 le sam. 9 janv. 2021 00:49, modifié 1 fois.

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

#36 Message par Temps-x » sam. 9 janv. 2021 00:48

djviper16 a écrit :Source du message Pour le portC ça serait plutôt ça non ? :

Code : Tout sélectionner
movf PORTC,W
andlw B'00111110'


Exacte, :sifflotte: je n'avais pas fini d'écrire ce long code.... :lol: un futur adepte de l'assembleur :+1: :bravo:

==> A+
Modifié en dernier par Temps-x le sam. 9 janv. 2021 00:56, 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

#37 Message par djviper16 » sam. 9 janv. 2021 00:54

oula il va y avoir du chemin à faire !

Par contre ton programme il me semble pas qu'il "réorganise" les bits.
Je pratique pas l'assembleur mais j'ai l'impression que tu prends les bits qui t'intéressent dans le portA et que tu les écris dans "resA" puis pareil avec le portC.

Mais moi je veux mes 8 bits dans un seul et même octet ou variable 8 bit (Ton), et dans le bon ordre :mur:
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

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

#38 Message par Temps-x » sam. 9 janv. 2021 01:00

Re

resA et resC sont deux variables, et effectivement je prends juste les bits qui m'intéressent, puisse c'est ce que tu demandes.

djviper16 a écrit :Source du message Mais moi je veux mes 8 bits dans un seul et même octet ou variable 8 bit, et dans le bon ordre :mur:


Explique toi mieux, si j'ai compris tu veux tout mettre en une seule variable de 8 bits ?
: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

#39 Message par djviper16 » sam. 9 janv. 2021 01:19

Temps-x a écrit :Source du message Explique toi mieux, si j'ai compris tu veux tout mettre en une seule variable de 8 bits ?


Exactement ! Regarde mon petit tableau au dessus, j'ai indiqué les bits qui doivent constituer la variable "Ton".

C'est bon j'ai enfin réussi à faire un truc qui fonctionne, j'y ai passé toute la soirée et la moitié de la nuit :lol:

Code : Tout sélectionner

    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==0x5C)
            {
            RA1=1;
            delay_ms(100);
            RA1=0;
            delay_ms(100);
            RA1=1;
            delay_ms(100);
            RA1=0;
            }
        }

    else
        
{RA1=0;}


Il me reste encore à trouver le moyen de stocker cette variable "Ton" dans l'EEPROM.

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

#40 Message par PEDRO » sam. 9 janv. 2021 01:28

Bonjour à tous,

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 :

dim tavariable as byte

tavariable.0 = PortA.3
tavariable.1 = PortA.4
tavariable.2 = PortA.5
tavariable.3 = PortC.1
tavariable.4 = PortC.2
tavariable.5 = PortC.3
tavariable.6 = PortC.4
tavariable.7 = PortC.5



Ou alors, j'ai mal compris ton problème ...
Modifié en dernier par PEDRO le sam. 9 janv. 2021 01:39, modifié 1 fois.


Retourner vers « Langage C »

Qui est en ligne

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