spi sur ATmega
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 35

spi sur ATmega



  1. #1
    invite3570b5f7

    Re : Deux " if " en C


    ------

    Ah OK merci j'y penserais la prochaine fois

    Maintenant mon but est d'envoyer cette séquence en SPI.
    Je dispose d'une tonne de MIC 5821 je en sais absolument pas comment ca fonctionne mais va falloir trouver

    Le problème c'est que j'ai 12 relais à commander, 13 LED, 4 BP, un buzzer.

    Ça rentre dans un ATmega 8535 mais si je peux apprendre à gérer le bus SPI ça le fera une connaissance pratique en +

    -----

  2. #2
    Jack
    Modérateur

    Re : Deux " if " en C

    La spi est beaucoup plus simple qu'une liaison série asynchrone à gérer. Tu devrais donc t'en sortir.

    A+

  3. #3
    invite3570b5f7

    Re : Deux " if " en C

    JACK : je vois que t'es de Metz, moi aussi !

    Je suis entrain de me documenter sur cette liaison SPI je pense avoir compris la majorité et comme je n'ai rien à faire aujourd'hui je vais en profité.

    Si vraiment je coince sur quelque chose je vous montre ce que j'ai fait et on en discutera

  4. #4
    invite3570b5f7

    Re : Deux " if " en C

    Re

    Alors d'après mes recherches j'ai vu que pour sélectionner le circuit, il faut utiliser par exemple un HC138, mais pour le moment je veux utiliser qu'un seul CI donc pas besoin.

    Je veux d'abord comprendre le fonctionnement.
    Mais c'est vrais que cette liaison SPI commence à me plaire, même si je ne comprend pas tout.

    Bon déjà j'ai rien trouvé comme exemple sur le net pour envoyer simplement un mot binaire 8 bits.

    Et aussi je ne comprend pas comment relier MISO et MOSI.

    Sur mon µC j'ai MISO et MOSI mais sur mon MIC5821 j'ai DATA IN, DATA Out...

    Bon je vais continuer à chercher un schéma d'exemple...

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Deux " if " en C

    il faut effectuer un chainage en connectant MOSI du µC à l'entrée série du circuit, puis la sortie série du circuit à l'entrée série du suivant, etc. La sortie série du dernier circuit sera rebouclée sur MISO du µC.

    Ainsi, plus besoin de 74HC138, tu sélectionnes tous les circuits en même temps. S'il y a 4 circuits possédant un registre de 8 bits par exemple, il faudra balancer une trame de 4 octets dans le registre de transmission de la spi.

    A+

  7. #6
    invite3570b5f7

    Re : Deux " if " en C

    Re,

    Merci pour ces explications.

    Donc en gros ma trame sera sur 32 bits ( long char ) si j'utilise 4 CI.

    Mais ca sera pas plus facile d'utiliser un port pour commander la sélection des CI ?

    Comme ca je reste sur des variables de 8 bits au lieu de renvoyer à chaque fois 32 bits si juste un bit change...

  8. #7
    Jack
    Modérateur

    Re : Deux " if " en C

    C'est à toi de voir. Avec la spi tu n'auras besoin que de trois fils, quel que soit le nombre de circuits que tu connecteras.

    A+

  9. #8
    Jack
    Modérateur

    Re : Deux " if " en C

    Donc en gros ma trame sera sur 32 bits ( long char )
    oui et non. Pour moi le mieux est de stocker dons un tableau de char. Ainsi, une simple boucle permettra de balancer la trame, en lisant le tableau octet par octet .

    A+

  10. #9
    invite3570b5f7

    Re : Deux " if " en C

    Ok lol je met ca de coté alors ^^ J'essaierais les différentes méthodes.

    Par contre je ne sais pas du tout comment m'y prendre !

    J'ai configuré ma fenêtre Wizard pour activer et initialiser le SPI mais après je ne sais pas comment j'envoi les infos, comment appeler le programme et tout.

    Sur le net rien de bien ... tous les programmes que j'ai vu font l'inverse, soit lire un CI alors que moi je veux lui ENVOYER les données.

    J'ai été voir dans les aides et rien.

    Ce que j'essaye de faire, c'est de créer une variable de 8 bits :
    Quand dans mon programme j'appel le sous programme SPI_Send ( par exemple ), il envoie les données et retourne au programme principale.

    Je vais continuer de fouiller le net je pense bien que ca doit se trouver !

  11. #10
    Jack
    Modérateur

    Re : Deux " if " en C

    Ta génération ne compte que sur le net pour trouver une solution

    Dans la mienne, on se tapait la doc. Si tu veux avancer dans la programmation des µC, ça reste quand même une étape incontournable.

    Bon courage.

  12. #11
    invite3570b5f7

    Re : Deux " if " en C

    Je viens de me taper la doc du µC + quelques autres docs mais j'ai quand même une question :

    - en effet, MISO MOSI CLK et SS sont sur le port B mais quand j'ouvre ma fenêtre wizard, j'active le SPI OK, mais aprés pour les ports, comment je les gères ?

    Je touche pas au PORTB ( en entrée par défaut ) ou je met en sortie ?
    Images attachées Images attachées  

  13. #12
    Jack
    Modérateur

    Re : Deux " if " en C

    je ne connais pas ton framework CCS. mais les lignes réservées à la spi dans le port B ne sont plus accessibles en temps qu'I/O parallèles. Tu ne dois donc pas toucher au port B.

    Il faut que tu trouves les registres associés à la spi. Iil doit normalement y avoir au minimum:
    un registre de contrôle
    un registre d'état
    un registre de donnée.

    Tous doit être détaillé dans la doc de ton µC.

    A+

  14. #13
    invite3570b5f7

    Re : Deux " if " en C

    Re

    Oui dans la doc j'ai trouvé les registres et à force je les connais par coeur.

    J'ai trouvé ça sur le net ça me permet de voir comment configurer le SPI sans passer par la Wizard.

    Bon j'ai absolument tout compris dans ce programme mis à part :

    le ('A') tout à la fin...c'est quoi ca ?

    Si j'ai bien compris, " cDATA " c'est une variable 8 bits qui va s'écrire dans le registre SPDR ??

    Code:
    #include <avr\io.h>
    #define DD_MOSI     PINB3
    #define DD_SCK     PINB5
    #define DDR_SPI    PORTB
    void SPI_MasterInit(void)
    {
    // Set MOSI and SCK output, all others input
    DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
    // Enable SPI, Master, set clock rate fck/16
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    }
    void SPI_MasterTransmit(char cData)
    {
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
    }
    int main(void) {
    SPI_MasterInit();
    SPI_MasterTransmit('A');
       while(1) { }
    }

  15. #14
    Jack
    Modérateur

    Re : Deux " if " en C

    le ('A') tout à la fin...c'est quoi ca ?
    bin c'est le caractère 'A' qui est transmis, enfin son code ASCII plus précisément.

    Si j'ai bien compris, " cDATA " c'est une variable 8 bits qui va s'écrire dans le registre SPDR ??
    cDATA est le paramètre de la fonction. C'est donc une variable locale.

    A+

  16. #15
    invite3570b5f7

    Re : Deux " if " en C

    C'est bien ce que je pensais ...

    Code:
    /*****************************************************
    
    
    Chip type               : ATmega8535
    Program type            : Application
    AVR Core Clock frequency: 8,000000 MHz
    Memory model            : Small
    External RAM size       : 0
    Data Stack size         : 128
    *****************************************************/
    
    #include <mega8535.h>
    
    #define DD_MOSI     PINB3
    #define DD_SCK     PINB5
    #define DDR_SPI    PORTB         // définition des broches et leurs noms
    
    
    void SPI_MasterInit(void)
    {
    
    DDRB = (1<<DD_MOSI)|(1<<DD_SCK);           // met MOSI et SCK en sortie
    
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);       // active la SPI en maître avec Fosc / 16 = 500KHz
    }
    void SPI_MasterTransmit(char cData)
    {
    
    SPDR = cData;                 // écris dans le régistre SPDR la valeur de cData
    
    while(!(SPSR & (1<<SPIF)));   // attend la fin de la transmission
    }
    
    void main(void) 
    
    {
    
    SPI_MasterInit();           // appel du sous programme initialisation
    
    SPI_MasterTransmit(0xf0);   // transmet 0xf0 à l'aide du sous programme
    
    
    
       while(1) 
       
       { 
       };
       
    }

  17. #16
    Jack
    Modérateur

    Re : Deux " if " en C

    Et ça fonctionne?

    A+

  18. #17
    invite3570b5f7

    Re : Deux " if " en C

    Pas su tout !

    Apparemment il manque des librairies dans mon programme ou je sais pas

  19. #18
    invite3570b5f7

    Re : Deux " if " en C

    Au fait on peu changer le titre du sujet ?

    On parle plus de " IF " mais de SPI

  20. #19
    Jack
    Modérateur

    Re : Deux " if " en C

    Citation Envoyé par joey57 Voir le message
    Au fait on peu changer le titre du sujet ?

    On parle plus de " IF " mais de SPI
    Oui, tu as raison. J'ai séparé les derniers posts pour créer une nouvelle discussion

  21. #20
    Jack
    Modérateur

    Re : spi sur ATmega

    Apparemment il manque des librairies dans mon programme ou je sais pas
    Des problèmes de compilation ou à l'exécution?

    A+

  22. #21
    invite3570b5f7

    Re : spi sur ATmega

    Merci pour avoir changé le titre

    Bah en fait j'ai utilisé la fenêtre wizard qui me configure tous mes PORTs

    J'ai tout vérifié une part une les configurations que m'a écris le Wizard, en regardant en // avec la doc de l'ATMEGA 8535 et tout est Ok tout est configuré comme voulu.

    En maître, horloge de 62500 Hz, repos à 0, SPI activé.

    Ensuite j'ai écris dans ma boucle While, SPDR = 0xFF et en simulant cette valeur rentre bien dans le registre.

    Mais c'est quand il s'agit de l'envoyer que je ne comprend pas.

    J'ai branché l'oscillo sur CLK et j'ai même pas de signal d'horloge donc la demande de transmission ne s'effectue pas.

    En fait je suis sure que mon problème vient du " sous programme " d'envoie.

    Code:
    unsigned char spi(unsigned char data)
    {
    data = SPDR;
    while ((SPSR & (1<<SPIF))==0);
    return SPDR;
    }
    Trouvé sur le net.

    Je comprend rien à ce code...à mon avis c'est pas ca.

  23. #22
    invite3570b5f7

    Re : spi sur ATmega

    Bon j'ai réussi à faire fonctionner mon MIC5821 en générant tout simplement la trame " manuellement "

    Je sais pas si c'est dans les normes ou si c'est du bricolage mais ca fonctionne.

    Voici le code :

    Code:
    while (1)
          {
          
          delay_ms(1000);
          Data_trans();
    
          }
    }
    Et voilà mes 2 sous programmes :

    Code:
    void tempo (void)
    
        {
        delay_ms(5);
        PORTB.0 = 1;
        delay_ms(5);
        PORTB.0 = 0;
        };
    
    
    
    
    
    void Data_trans (void)
        {
        
        PORTB.2 = 0;
        delay_ms(100);
        
        PORTB.1 = 1;
        tempo();
        PORTB.1 = 0;
        tempo();
        PORTB.1 = 1;
        tempo();
        PORTB.1 = 0;
        tempo();
        PORTB.1 = 1;
        tempo();
        PORTB.1 = 0;
        tempo();
        PORTB.1 = 1;
        tempo();
        PORTB.1 = 0;
        tempo();
        
        delay_ms(100);
        PORTB.2 = 1;
        
        };
    Le sous programme TEMPO me permet de générer le signal CLK.

    Le delais de 100ms peu etre supprimé bien évidemment ^^

  24. #23
    Jack
    Modérateur

    Re : spi sur ATmega

    Un truc qui me surprend beaucoup dans ton programme:
    Code:
    #define DD_MOSI     PINB3
    #define DD_SCK     PINB5
    #define DDR_SPI    PORTB         // définition des broches et leurs noms
    Je ne connais pas du tout les produits atmel, mais je viens de télécharger la doc et dans la "pin configuration", je vois que MOSI est sur PB5, MISO sur PB6 et SCK sur PB7.

    Peut-être ton outil de développement permet-il d'émuler une spi sur n'importe quelles pattes, mais dans ce cas ce n'est plus la spi intégrée qui est utilisée, donc plus question d'utiliser ses registres spdr, spsr ou les bits de ces registres.

    A+

  25. #24
    invite3570b5f7

    Re : spi sur ATmega

    Hé voilà ! Je l'avais bien vu pourtant et j'ai fait le malin en voulant changer ca directement dans l'initialisation du SPI !

    Du coup j'ai oublié / pas vu de le faire plus haut dans les DEFINED et maintenant ca fonctionne !

    J'ai écris une séquence qui change toutes les secondes et elle est bien transmise à mon MIC qui m'allume les LEDs.

    Merci Jack

    Bon j'ai juste par moment des erreurs dans les données elles sont mal envoyées mais je pense qu'il y'a des réglages à faire.

    Mes prochains objectifs :

    1) Faire fonctionner ce bus sans aucune erreur
    2) Mettre 4 CI de réception sur le bus.

  26. #25
    Jack
    Modérateur

    Re : spi sur ATmega

    tant mieux si ça fonctionne maintenant. L'idéal est d'avoir un oscillo numérique pour voir la tête des signaux et leur conformité.

    A+

  27. #26
    invite3570b5f7

    Re : spi sur ATmega

    Oui lol ! Mais j'ai qu'un oscillo analogique, les numériques coute très chère même en ocaz.

  28. #27
    Jack
    Modérateur

    Re : spi sur ATmega

    C'est possible aussi avec un analogique, mais il faut que le signal soit périodique. Il faut donc faire un bout de programme qui envoie le même caractère en boucle sur la spi.

    A+

  29. #28
    invite3570b5f7

    Re : spi sur ATmega

    Re,

    Je viens de faire un essais avec 4 CI MIC5821 mais bof bof ^^

    En fait j'ai 4 données différentes qui doivent être envoyées mais sur mes 4 bar-graphes de LED j'ai la même donnée : la dernière du programme.

    Voir photo : donnée = 19.

    Mais c'est bizard parce que j'arrive pas à gérer le STROBE ca change rien du tout.

    Sinon peu être que c'est plus facile d'envoyer, comme tu le disais, un mot de 32 bits.

    Mais je sais pas comment faire...

    Code:
    Chip type               : ATmega8535
    Program type            : Application
    AVR Core Clock frequency: 8,000000 MHz
    Memory model            : Small
    External RAM size       : 0
    Data Stack size         : 128
    *****************************************************/
    
    #include <mega8535.h>
    #include <delay.h>
    
    #define DD_MOSI     PINB5
    #define DD_SCK     PINB7
    #define DDR_SPI    PORTB         // définition des broches et leurs noms
    
    
    
    
    void SPI_MasterInit(void)
    {
    
    DDRB = (1<<DD_MOSI)|(1<<DD_SCK);           // met MOSI et SCK en sortie
    
    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPI2X);       // active la SPI en maître avec Fosc / 2 = 4MHHz
    
    };
    
    
    
    
    
    
    void SPI_MasterTransmit(char cData)
    {
    
    
    SPDR = cData;                 // écris dans le régistre SPDR la valeur de cData
    
    while(!(SPSR & (1<<SPIF)));   // attend la fin de la transmission
    
    
    };
    
    
    
    
    void main(void) 
    
    {
    
    SPI_MasterInit();           // appel du sous programme initialisation
    
    
    
    
    
       while(1) 
       
       { 
       
       
       delay_ms(500);
       
       PORTB.4 = 0;   
       SPI_MasterTransmit(0xAA);   // transmet 0xf0 à l'aide du sous programme 
       
       PORTB.4 = 1;
       
       PORTB.3 = 0;   
       SPI_MasterTransmit(0x73);   // transmet 0xf0 à l'aide du sous programme 
       
       PORTB.3 = 1;
       
       PORTB.2 = 0;  
       SPI_MasterTransmit(0x55);   // transmet 0xf0 à l'aide du sous programme 
       
       PORTB.2 = 1;
       
       PORTB.1 = 0;   
       SPI_MasterTransmit(0x19);   // transmet 0xf0 à l'aide du sous programme 
       
       PORTB.1 = 1;
       
       };
       
    }

    Sur le PORTB pin 4, 3, 2, 1 c'est les STROBES de chaque CI.
    Images attachées Images attachées  

  30. #29
    Jack
    Modérateur

    Re : spi sur ATmega

    Sinon peu être que c'est plus facile d'envoyer, comme tu le disais, un mot de 32 bits.
    Je disais plutôt qu'il s'agissait bien de 4 octets.

    Fais-voir ton schéma, enfin surtout comment sont connectés les MIC5821 et le µC.

    A+

  31. #30
    invite3570b5f7

    Re : spi sur ATmega

    Salut

    Voilà le schéma réalisé sur ma plaque proto.

    Piloté par le programme du post " 20h40 hier "
    Images attachées Images attachées  

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Utilisation de mémoire SPI sur une ligne SPI utilisé
    Par VIIV dans le forum Électronique
    Réponses: 1
    Dernier message: 30/12/2009, 13h11
  2. Compteur sur ATMEGA (en C), ports différents
    Par guicara dans le forum Électronique
    Réponses: 3
    Dernier message: 08/10/2009, 09h50
  3. MLI sur Atmega !
    Par invite0ab4261e dans le forum Électronique
    Réponses: 1
    Dernier message: 19/12/2008, 10h06
  4. [AVRStudio4 + Atmega128 + SPI] Probleme sur le port SPI
    Par inviteff7a2099 dans le forum Électronique
    Réponses: 1
    Dernier message: 03/12/2008, 03h05
  5. Atmega => SBI et CBI sur des registres > à 0x1F
    Par Toufinet dans le forum Électronique
    Réponses: 0
    Dernier message: 17/04/2008, 15h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.