IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[PIC] Compilateur CCS C - initialiser struct bit à bit ?


Sujet :

C

  1. #21
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par knuthy Voir le message
    Juste pour répondre à la toute première question, il est possible de faire le travail sans utiliser le bit_clear() et le bit_set(), en utilisant les unions du C, un petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    union {
        struct {
                unsigned depart:1;   
                unsigned info:8;
                unsigned parite:1;
                unsigned arret:1;
                unsigned acquis:1;
        } PS2;
        unsigned champMem:12;      
    } data;
    .....
    Je ne crois pas que ceci soit garantit. Les champs de bits laissent beaucoup de liberté à l'implantation :

    n1124 dit

    6.7.2.1 Structure and union specifiers
    ....
    10 An implementation may allocate any addressable storage unit large enough to hold a bitfield.
    If enough space remains, a bit-field that immediately follows another bit-field in a
    structure shall be packed into adjacent bits of the same unit. If insufficient space remains,
    whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is
    implementation-defined. The order of allocation of bit-fields within a unit (high-order to
    low-order or low-order to high-order) is implementation-defined. The alignment of the
    addressable storage unit is unspecified.

  2. #22
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    sinon tu peux utiliser un 18fxxx
    car ces pic possedent deja une liason serie synchrone.

    tu peux me donner ton code.

    moi je n'arrive plus a recuperer les codes initialisation de la souris

    c'est à dire 0xAA et 0x00

    merci aussi à knuthy

    mais ton exemple me servira à autre chose

    car ton exemple permet d'initialiser toutes la structure par une valeur hexa

    alors que je cherchais à initialiser chaque bit un à un

  3. #23
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    c'est bizarre j'ai l'impression que j'arrive à recuperer des paquets de la souris
    mais pas sur

    as tu mis des resistances pull-up entre le pic et la souris ?

    moi des que je les mets j'ai plus rien

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    desolé, sans faire attention j'avais désactivé la notification par mail

    pour le pic en passant par l'intéruption externe c'est assez simple de faire le code, je suis en train de le tapper mais j'ai un petit probleme: j'ai grillé ma souris 3 boutons et je l'ai remplacé par une souris à molette et là ça fait planter...

    Est-ce que quelqu'un a de la doc sur le protocol avec la molette? il faut bien que l'info de la roulette soit envoyé

    moi j'ai mis des résistances entre mes cables et le +5v
    ton probleme viens peu etre de ton pic tu as bien mis les pin en réception?

    sinon si ça marche sans, laisse comme ça

  5. #25
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    aucun probleme

    finalement c'est bon pour les resistances
    j'ai meme utilisé la fonction pull up sur le port b
    cela evite de mettre des resistances.

    une petit question pour voir si j'ai bien compris en ce qui concerne la reception de données de la souris.

    quand on l'a banche on doit bien recevoir 0xAA et 0x00.

    mais avant chaque reception, vous faites comment ?

    moi je mets l'horloge et data en 1 pour bloquer la reception et ensuite je les mets en entrée c'est à dire (set_tris_b(0b00100011))



    j'espere avoir bien expliqué, a cette heure, je suis

    a bientot

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    pour la réception, dès qu'il y a du changement la souris envoie les données

    si par contre quelqu'un sait comment "mettre en veille" l'émission et récuperer un paquet au moment souhaité ce serait parfait pour moi

    pour l'instant je apres avoir reçus AA 00,j'envoi F4, peu etre qu'il faut faire autrement

  7. #27
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    Ok merci pour l'info

    je me concentre dessus la

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    petite question qui peut etre une piste pour le code:

    peut-on activer et désactiver le controle de l'intéruption externe au cours du programme?
    comment fonctionne l'intérustion sur un port complet? (différent de INT intéruption externe je crois)

  9. #29
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    euh
    quand tu dis interruption

    tu parles des interruptions que ce soit horloge ou sur changement d'etat d'un pin ?

    si c'est le cas
    c'est comme ca pour activer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	ENABLE_INTERRUPTS(global);
    	ENABLE_INTERRUPTS(INT_RB);
    et pour désactiver :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DISABLE_INTERRUPTS(INT_RB);
    voila j'espere avoir compris ta question

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    j'ai du mal à comprendre comment ça fonctionne sur le port b
    -est-ce que dès qu'une des entrées change de valeur on va en interruption?
    -est-ce qu'avec ccs on a besoin de remettre le flag à 0 pour sortir de l'interruption?

    (je débute sur les interruptions)

  11. #31
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    je t'explique car j'ai deja utilisé une fois
    c'est super simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ENABLE_INTERRUPTS(global);
    cela signifie que tu autorises les interruptions

    maintenant il faut lui dire quelle interruption tu desires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ENABLE_INTERRUPTS(INT_RB);
    cela signifie que tu autorises les interruptions de CHANGEMENT D'ETAT sur le port B (cela depend de ton pic, regarde dans la description de ton pic pour voir si c'est pareil, moi j'utilise le 16f628a)

    si j'ai mis "changement d'état" c'est que moi je suis tombé dans le piege.

    je pensais que c'etait quand ton pin etait à 1

    en faites non, des que tu changes d'etat sur n'importe quel pin du port b
    cela declenche l'interruption.

    maintenant pour lancer du code en fonction de ton interruption c'est simple
    tu fais une méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #INT_RB
    void rb_isr()
    {
    ton code
    }
    si tu veux lancer ton code quand le pin 4 du port b est à 1

    tu dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #INT_RB
    void rb_isr()
    {
    if (bit_test(changes,4))
    {ton code}
    }

    bon voila

    si j'ai mal expliqué, je reexplique demain
    la je suis mort, j'arrive pas à avancer

    j'arrive toujours rien à recuperer de la souris

  12. #32
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 141
    Par défaut
    si tu pouvais me passer juste la partie qui permet de recuperer le 0xAA et 0x00 de la souris
    ca pourrait m'aider


  13. #33
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    merci pour la réponse c'est très clair, mais ilme semblait que j'avais essayé mais je n'avais pas réussi, quelle est la différence avec l'interruption externe ?

    merci pour ton aide

    à demain

  14. #34
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    j'ai grillé mon pic donc j'ai pas encore changé mon code, pour l'instant il est très mal fait et le pic passe beaucoup de temps à attendre, d'ou la question sur les interruptions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    init_souris(){
       int init;
       init=souris_lecture();
       init=souris_lecture();
       souris_commande(0xf4);
       init=souris_lecture();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    souris_lecture(){
       int valeur=0;int1 par=0;
    	mesure=0;
       while(input(souris_sda)||input(souris_sclk)){
          delay_us(10);
    	mesure++;
       }
       for (i=0;i<8;i++){
          delay_us(55);
          while(input(souris_sclk)){
             delay_us(5);
          }
          if(input(souris_sda)){bit_set(valeur,i);par=par+1;}
          else {bit_clear(valeur,i);}
       }
       delay_us(55);
       while(input(souris_sclk)){
          delay_us(5);
       }
       par=par+input(souris_sda);
       delay_us(55);
       while(input(souris_sclk)){
          delay_us(5);
       }
       return valeur;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    souris_commande(int com){
       int1 par=0;
       souris_init_com();
     
       for(i=0;i<8;i++){
          int y;
          y=bit_test(com,i);
          souris_attente_ckl(y);
          par=par+y;
       }
       souris_attente_ckl(0);
       souris_attente_ckl(1);
       delay_us(60);
       souris_temps=input(souris_sda);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    reset_souris(){
       souris_commande(0xFF);
       init_souris();
     
    }

  15. #35
    Membre averti
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Par défaut
    Salut,

    A la lecture rapide de ce fil, je me rend compte qu'il y a mauvaise interprétation du fonctionnement du protocole PS2...

    Ce n'est pas possible d'utiliser l'USART du µC, car la longueur des trames n'est pas compatible avec ces USART.

    Ensuite, c'est toujours la "souris" qui donne le CLK, jamais le µC.

    Pour envoyer une commande à la souris, il faut passer CLK et DATA en sortie et les mettre respectivement à zéro pendant minimum 55µS. Ensuite relâcher la ligne CLK en la positionnant en entrée et attendre le front suivant de CLK pour commencer à émettre la donnée sur DATA.
    Un fois le stop bit émis, il faut passer la ligne DATA en entrée et attendre la réception d'un ACK(0xFA) de la souris.

    De plus, dans vos codes, je ne vois pas le calcul de la parité impaire nécessaire à chaque commande...

    David.

  16. #36
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    pour le bit de parité je n'ai pas bien compris comment ça marche, pour moi y a des cas où ça me parrait illogique

    pour l'attente de la clock je ne c pas tu as peut etre raison mais en faisant comme je fais j'y arrive, j'ai grillé mon programmateur donc j'attends le nouveau d'un jour à l'autre et je reprends ça

    pour recevoir des paquets de données tu sais comment faire (au lieu de recevoir en continu)??

  17. #37
    Membre averti
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Par défaut
    Il est important de gérer le bit de parité impaire lors de l'envoie d'une commande, sinon, la commande n'est pas prise en compte, et tu dois recevoir un NACK(0xFE) indiquant que la commande est invalide...
    En réception, tu peux sans problème ignorer le bit de parité.

    pour l'attente de la clock je ne c pas tu as peut etre raison mais en faisant comme je fais j'y arrive, j'ai grillé mon programmateur donc j'attends le nouveau d'un jour à l'autre et je reprends ça
    La ligne CLK se gère comme je l'ai expliqué dans mon précédent post.


    pour recevoir des paquets de données tu sais comment faire (au lieu de recevoir en continu)??
    Oui, il suffit simplement de bloquer le ligne CLK en la forçant à zéro.
    Un fois que tu la relâches, tu reçois les données mémorisées de la souris.

    David.

  18. #38
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 20
    Par défaut
    j'ai deja essayé de bloquer la clock, en effet je ne recois pas de données mais la souris ne m'a pas donné les déplacements qui avaient été fait

  19. #39
    Membre averti
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Par défaut
    Elle ne mémorise qu'un nombre limité d'octet, de mémoire c'est maximum 16, et une fois dépassé, tu reçois un overflow de la souris...

    David.

  20. #40
    Membre averti
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Par défaut
    Salut,

    Mon post#39 n'est valable que pour les claviers PS2...

    Pour recevoir les données par paquets :
    Envoyer la commande 0xF4
    Fréquence des paquets est gérée par la commande 0xF3.

    Ne pas oublier de calculer le bit de parité impaire, sinon la commande risque ne pas être prise en compte.

    David.

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/02/2014, 08h08
  2. [Turbo Pascal] Compilateur Turbo Pascal pour Vista 64 bits
    Par issss dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 07/06/2009, 23h48
  3. Réponses: 2
    Dernier message: 07/01/2007, 10h06
  4. Entier : accès bit à bit
    Par slylafone dans le forum C++Builder
    Réponses: 16
    Dernier message: 14/06/2005, 20h34
  5. Réponses: 5
    Dernier message: 03/06/2005, 14h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo