Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

SPI multi esclaves entre 16f88 avec PICC de ccs



  1. #1
    uranie-mc

    Question SPI multi esclaves entre 16f88 avec PICC de ccs

    Salut,

    J'ai besoin dans un projet de connecter plusieurs microcontroleurs avec une laison SPI.
    Pour faire des test j'utilise pour le moment simplement 3 16f88 avec un master et 2 slaves, ça fait un moment que je cherche a faire fonctionner l'affaire mais je n'arrive pas a mettre la main sur le problème :le fonctionnement est completement eratique, les microcontroleurs se bloquent dans la fonction de transfert pour le master et dans l'interruption pour les esclaves...

    Le maitre dois passer 4 octets a chaque esclaves, j'utilise CCS voila mon code:

    /*****************MASTER :*********************/
    /////////////////// les fusibles

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES INTRC_IO //Internal RC Osc, no CLKOUT
    #FUSES NOPUT //No Power Up Timer
    #FUSES MCLR //Master Clear pin enabled
    #FUSES BROWNOUT //Reset when brownout detected
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection
    #FUSES NOWRT //Program memory not write protected
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES FCMEN //Fail-safe clock monitor enabled
    #FUSES IESO //Internal External Switch Over mode enabled
    #use delay(clock=8000000)

    /////////////////// les reglages dans le main

    setup_adc_ports(NO_ANALOGS|VSS _VDD);
    setup_adc(ADC_OFF);
    setup_spi(SPI_MASTER|SPI_L_TO_ H|SPI_CLK_DIV_16);
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    setup_oscillator(OSC_8MHZ|OSC_ INTRC);

    set_tris_b (0b00000010); // B1 en entrée pour SDI

    //////////////////// Ma fonction de transfert

    void Envoyer(void)
    {
    // comme il y aura plus d'esclaves ensuite je prefere utiliser une boucle pour les selectionner
    for(D1=0;D1<2;D1++)
    {
    if(D1==0) // selectionne l esclave
    output_high(PIN_B6);
    else
    output_high(PIN_B7);

    // Envoie les données octet par octet a l'esclave
    for(D2=0;D2<4;D2++)
    {
    spi_write(info[D1][D2]);
    }

    output_low( PIN_B6 ); // deselectionne l'esclave
    output_low( PIN_B7 ); // deselectionne l'esclave
    }
    }
    }

    /*****************SLAVE :*********************/
    /////////////// Les fusibles
    #FUSES NOWDT //No Watch Dog Timer
    #FUSES INTRC_IO //Internal RC Osc, no CLKOUT
    #FUSES NOPUT //No Power Up Timer
    #FUSES MCLR //Master Clear pin enabled
    #FUSES BROWNOUT //Reset when brownout detected
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
    #FUSES NOCPD //No EE protection
    #FUSES NOWRT //Program memory not write protected
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOPROTECT //Code not protected from reading
    #FUSES FCMEN //Fail-safe clock monitor enabled
    #FUSES IESO //Internal External Switch Over mode enabled
    #use delay(clock=8000000)
    #use fast_io (ALL)

    /////////////// les reglages dans le main

    setup_adc_ports(NO_ANALOGS|VSS _VDD);
    setup_adc(ADC_OFF);
    setup_spi(SPI_SLAVE|SPI_L_TO_H );
    setup_timer_0(RTCC_INTERNAL|RT CC_DIV_1);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1) ;
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);
    enable_interrupts(INT_SSP);
    enable_interrupts(GLOBAL);
    setup_oscillator(OSC_8MHZ|OSC_ INTRC);

    set_tris_a (0b00000000); // tout en sorties
    set_tris_b (0b11000010); // B1,B7 et B6 en entrée (SDI et capteurs)

    //////////////////Mon interruption

    #int_SSP
    void SSP_isr(void)
    {
    Ordre=spi_read(); // Enregistre l'ordre en premier

    while(!spi_data_is_in());
    info1=spi_read(); // puis les 3 infos
    while(!spi_data_is_in());
    info2=spi_read();
    while(!spi_data_is_in());
    info3=spi_read();
    }



    Voila, j'ai vraiment passé beaucoup de temps la dessus à essayer de regler le problème seul, je pense que mon soucis vient principalement d'un manque de connaissance du fonctionnement réel des routines SPI de ccs.
    Malheureusement j'ai des partiels cette semaine et je n'aurais plus l'occasion avant un certain temps d'avancer mon projet

    Donc si quelqu'un a une connaissance des ces routines de ccs et trouve mon/mes erreurs je lui en serait éternellement reconnaissant (sisi!)
    Merci d'avance a ceux qui ont lu j'usque ici

    -----


  2. #2
    uranie-mc

    Re : SPI multi esclaves entre 16f88 avec PICC de ccs

    Un ptit up pour verifier que personne n'a d'idée

  3. #3
    hamsterfute

    Re : SPI multi esclaves entre 16f88 avec PICC de ccs

    Désolé de répondre si tard, je ne vais pas souvent sur le forum.

    Avant toute chose, ton code a l'air propre
    Les fuses ont l'air OK, le use delay aussi
    Déjà tes setup_XXXXX(), je les mettrais dans le main si j'étais toi après déclaration des variables et aussi après paramétrage des registres (a moins que tu n'aies donné que le bout de code que tu voulais checker puisque d'ailleurs on ne voit aucun main).

    Je serais toi, je ferais du débogage pas à pas c'est à dire d'abord, je cherche à maitriser le PIC maitre, vérifier à l'oscillo (ou avec une LED+résistance de 470 ohms si tu n'as pas d'oscillo sous la main) s'il envoie bien des données (sur la broche SDO). Ceci veut dire que tu enregistres ton fichier tel quel dans un fichier de secours et que tu zappes tous les esclaves. Tu gardes ton main et tu vires tous les setup_XXXX() excepté SETUP_SPI(XXX);
    tu essaies le spi_write(0x5A); en boucle et tu lances ton code. Si tu vois un signal carré (à peu près), déjà, ta config du maitre est bonne (au moins pour la lecture). Après, tu peux rajouter un esclave et sans la broche Slave Select pour un premier test. Fais lui allumer une diode s'il lit l'octet 0x01 et éteindre s'il lit l'octet 0x02 par exemple. Là tu as vérifié la communication avec un esclave dans un seul sens.
    Après, tu vérifies l'envoie dans les deux sens.
    Après, tu rajoutes un esclave ce qui implique donc le rajout de la broche Slave Select.
    Tiens moi au courant des résultats pas à pas et petite question :
    Quel est ton outil de programmation/débogage?

  4. #4
    hatem.elect

    Re : SPI multi esclaves entre 16f88 avec PICC de ccs

    Bonjour ,
    Dans le butde mon stage je doit utiliser le bus SPI du PIC24FJ64GA004 , et en m'inspirant de votre programme
    j'ai essayé de le faire mais sans succés
    j'arrive pas a génerer qque chose sur le maitre

    #include <24FJ64GA004.h>

    #FUSES WPOSTS1 //Watch Dog Timer PostScalar 1:1
    #FUSES CKSFSM //Clock Switching is enabled, fail Safe clock monitor is enabled

    #use delay(clock=20000000)
    #FUSES NOWDT //No Watch Dog Timer
    #FUSES NOWRT //Program memory not write protected
    #FUSES NODEBUG //No Debug mode for ICD
    #FUSES NOPROTECT //Code not protected from reading

    #FUSES IESO //Internal External Switch Over mode enabled
    #use delay(clock=16000000)

    #use spi(DI=PIN_B1, DO=PIN_B0, CLK=PIN_B2, ENABLE=PIN_B4, BITS=16)

    void main()
    {
    setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_1);
    setup_spi2( FALSE );
    setup_adc(ADC_OFF);
    setup_comparator(NC_NC_NC_NC);
    setup_vref(FALSE);


    set_tris_b (0b1000000000000010); // B1 en entrée pour SDI

    setup_timer1(TMR_DISABLED|TMR_ DIV_BY_1);
    // TODO: USER CODE!!



    while(1)
    {

    spi_write(0x5A);
    delay_ms(1000) ;
    }


    }

Sur le même thème :

Discussions similaires

  1. Programmer 16F877 avec CCS
    Par Panda184 dans le forum Électronique
    Réponses: 37
    Dernier message: 22/01/2010, 18h13
  2. pic 16f88 et SPI
    Par SkySaxon dans le forum Électronique
    Réponses: 21
    Dernier message: 17/07/2009, 08h14
  3. capteur temperature avec dsPIC en CCS
    Par sdow dans le forum Électronique
    Réponses: 1
    Dernier message: 11/02/2008, 23h36
  4. CCS avec mplab
    Par sdow dans le forum Électronique
    Réponses: 0
    Dernier message: 10/02/2008, 17h52
  5. difference entre 16F818 et 16F88
    Par alainav1 dans le forum Électronique
    Réponses: 1
    Dernier message: 28/06/2007, 11h22