Programmation en C Atmel, je suis perdu !
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Programmation en C Atmel, je suis perdu !



  1. #1
    Poseidon88

    Programmation en C Atmel, je suis perdu !


    ------

    Bonjour

    Je reviens avec mon projet qui avance bien.
    Il ne me reste plus qu'à réaliser une modification.

    Je vous rappel le fonctionnement globale.

    - 8 relais
    - 8 minidils
    - 8 BP secondaires
    - 1 BP principale

    Si avec mes MINIDILS je met ce code :

    CodeDIL = 00001111

    J'apuis sur le BP principale ( PIND.0 )

    Il va au sous programme activ_rel et envoie la séquence suivante via SPI.

    e = 0x01
    tempo
    e = 0x03
    tempo
    e = 0x07
    tempo
    e = 0x0F

    Donc les 4 premiers relais s'activent les uns après les autres et RESTENT allumés.

    Je ra-puis sur le BP principal, appel du sous programme desactiv rel et les relais s'éteignent les uns après les autres.

    J'ai essayé sur ma maquette et ca fonctionne très bien.

    Maintenant que les 4 premiers relais sont activés, imaginons que je veuille allumer AUSSI le relais 8.

    J'apuis sur le BP secondaire 8

    Donc PORTC = 10000000

    Et je doit obtenir e = e + PORTC = 10001111

    J'ai réussi à le faire mais y'a des beugs...quand je rapuis sur BP principale, les 4 remais doivent s'éteindre mais aussi le 8 ième !

    Je suis à cours d'idée après avoir cherché des jours...

    Si vous avez une sollution...Merci

    Code:
    void activ_rel(void)     // sous programme d'activation des relais.
        {
    
        e = 0x00;
        M = 0x01;
        
        for (i=0; i<=8; i++)
                {
                resultat = CodeDIL & M;
                        if (resultat > 0)
                                {
                                e = e + M;
                                trans();
                                delay_ms(100);
                                };
                M = M << 1;                
                };
           
        }; // fin.
    
    
    
    
    void desactiv_rel (void)
        {
        
        M = 0x80;
        
        for (i=0; i<=8; i++)
                {
                resultat = CodeDIL & M;
                
                        if (resultat > 0)
                                {
                                e = e - M;
                                trans();
                                delay_ms(100);
                                };
                M = M >> 1;                
                };
        
        }; // fin.


    Et la boucle principale :

    Code:
    while (1)
          {
          CodeDIL = ~PINA;   // Lecture du code mini-dils et inversion.
          
          if (PIND.0 == 0)
                    {
                    delay_ms(5);
                    BP = ~BP; 
                
                    if ( BP == 1 )
                            {
                            activ_rel();
                            };
                                 
                    if ( BP == 0 )
                            {
                            desactiv_rel();
                            };
                    delay_ms(300);    
                    };
                    
                    
          Y = ~PINC;      
          if (Y > 0)
                {
                delay_ms(300);
                Z = Z + Y; 
                e = e+Z;
               trans();
                };
                        
          W = 0x60;
          Z = 0;                            
          };
    };
    A partir de Y = ~PINC, c'est à modifier...j'ai fait n'importe quoi.

    -----

  2. #2
    invite29971eb1

    Re : Programmation en C Atmel, je suis perdu !

    Je n'y comprends rien à ton code...mais bref....

    pour activer n'importe quelle sortie d'un port sans toucher aux autres broches: PORTB|=(1<<n) ou n est le numéro du bit

    Pour désactiver n'importe quelle sortie: PORTB&=~(1<<n)

    On appelle ça du masquage et ça peut se faire sur plusieurs ports simultanément: PORTB|=(1<<m)+(1<<n) active deux sorties à la fois

    Si tu utilises Codevision, tu peux remplacer ça par: PORTB.n=0 ou 1

  3. #3
    Poseidon88

    Wink Re : Programmation en C Atmel, je suis perdu !

    Salut,

    Oui ca je sais que je peux écrire PORTB.0 = 1 par exemple.

    Mais j'ai une complication à gérer ... j'utilise le mode SPI pour activer mes relais.
    Donc un registre à décalage 8 bits.

    Donc si je veux activer le relais 1, il faut que j'envois 00000001.
    Ensuite j'envoi la donné.

    Si je veux activer les relais 1 et 2 je dois envoyer 00000011.

    Si je programme mes DILs pour activer les relais 1, 2, 3 et 4 je ne DOIS PAS envoyer le code 0x0F car sinon les 4 relais vont s'activer spontanément ! Or le but de ce montage c'est d'activer les appareils les uns après les autres avec une tempo de 5 secondes entre.

    C'est pour ca que je doit faire ca dans cet ordre :

    E = 0x01
    Tempo 5 sec.
    E = 0x03
    Tempo 5 sec.
    E = 0x07
    Tempo 5 sec.
    E = 0x0F


    E étant la variable 8 bits que j'envois dans le registre à décalage via SPI.

    Je vais étudier tes 2 codes PORTB&=~(1<<n) et PORTB|=(1<<n)

    Merci

  4. #4
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    Donc mon E vaut maintenant 0x0F.

    Si j'appuis sur le BPS 8 pour activer le huitième relais il me faut E = 8F.
    Ensuite j'envois la donnée E.

    Si je rappuis sur le BPS 8, je dois renvoyer la donné E = 0F.

  5. A voir en vidéo sur Futura
  6. #5
    invite29971eb1

    Re : Programmation en C Atmel, je suis perdu !

    Citation Envoyé par Poseidon88 Voir le message
    Donc mon E vaut maintenant 0x0F.

    Si j'appuis sur le BPS 8 pour activer le huitième relais il me faut E = 8F.
    Ensuite j'envois la donnée E.

    Si je rappuis sur le BPS 8, je dois renvoyer la donné E = 0F.
    donc
    E=0x0F;
    si BPS8
    E|=(1<<8);
    si BPS8
    E&=~(1<<8);


    ça te permet, dans ton code de n'intervenir que sur le bit 8. Ainsi, si ta séquence de premiers relais change, tu n'auras pas à reprogrammer cette partie.

    De plus, si à la place de 8, tu mets une constante genre:
    Code:
    #define RELAISF 8
    .
    .
    .
    E|=(1<<RELAISF)
    tu peux alors modifier l'ordre de de tes relais simplement en modifiant le #define. Ce sont de bonnes habitudes à prendre pour écrire du code facilement modifiable et réutilisable

  7. #6
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    OK donc je viens d’essayer ta manip ça fonctionne nickel j'ai juste fais une modif et ca donne ca :

    Code:
    if ( PINC.7 == 0 )
            {
            BPS = ~BPS;
            
            if ( BPS == 1 )
                {
                delay_ms(200);
                e=e+(1<<7);
                trans();
                };
            if ( BPS == 0 )
                {
                delay_ms(200);
                e=e+(0<<7);
                trans();
                };
            };
    Si je décale de 8, c'est trop, tout s'éteint.On dépasse les 8 bits en fait.

    Et je dois mettre e = e + ...

    Dans le deuxième décalage ca fonctionnait avec un " 1 " mais je trouvais plus logique de remplacer le " 1 " par un " 0 " pour désactiver le relais...

    Dis moi si je me trompe.

    Ensuite, sachant que j'ai 8 BPS, tu me conseil plutot de faire un Switch case et de faire Define RELAIS N ?

  8. #7
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    Euh rectification yavait un beug :

    Dans la boucle de désactivation il faut en fait laisser le " 1 " et mettre un " - " à la place du +.

    J'ai essayé avec 2 boucles et en fait ça ne faisait que s'additionner avec un +...

  9. #8
    invite29971eb1

    Re : Programmation en C Atmel, je suis perdu !

    Bah oui, 128 +0, ça fait toujours 0

    Et les bits sont numérotés de 0 à7.

    2<<7 c'est équivalent à 2 puissance 7 ou 128.

    Quelques bases de numération ne feraient pas de mal

  10. #9
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    Bah je connais les bases de numérotation mais pas l'habitude d'écrire des programmes.

    On en a fait genre 1 mois en cours pour commander des moteurs pas-à-pas.

    Sinon, mon programme fonctionne très bien, même avec les 8 BP

    Nickel

  11. #10
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    Re,

    Je voulais savoir si on peu remplacer cette écriture

    A = B + C
    D = A

    Par A = D = B + C

    Je précise que dans le programme A et D ne sont pas tout le temps égaux.

  12. #11
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    UP !

    Merci

  13. #12
    invite29971eb1

    Re : Programmation en C Atmel, je suis perdu !

    En théorie, je crois que c'est jouable mais ça reste du dirty-coding.

    Ca ne coute pas plus cher de mettre deux lignes, c'est plus lisibile et ça ne changera rien au code compilé

  14. #13
    Poseidon88

    Re : Programmation en C Atmel, je suis perdu !

    Ok d'accord je laisse alors.

    Et dernière question : à partir du moment où le programme fonctionne très bien ( resté allumé 3 jours de suites, avec des appuis sur les BP, j'ai même essayer de le maltraiter en appuyant sur tous les boutons alors que le programme tournait etc...)

    Est ce qu'il peut bugger ?? ou user le µC ?

    J'ai peur d'avoir mal écris ou organisé mon programme et donc de faire trop travailler mon µC pour rien etc...

Discussions similaires

  1. Programmation Atmel
    Par invite659e17ac dans le forum Électronique
    Réponses: 16
    Dernier message: 28/12/2010, 23h43
  2. Programmation avec microcontroleur atmel en C
    Par inviteeab0141b dans le forum Électronique
    Réponses: 8
    Dernier message: 08/06/2009, 13h37
  3. Programmation ATMEL 8535
    Par invite199eaed0 dans le forum TPE / TIPE et autres travaux
    Réponses: 1
    Dernier message: 10/07/2008, 10h03
  4. Programmation Atmel Mac
    Par invite4277dea9 dans le forum Électronique
    Réponses: 0
    Dernier message: 08/06/2008, 13h04
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...