[Programmation] Probleme avec le bus SPI
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Probleme avec le bus SPI



  1. #1
    invited1b1c449

    Probleme avec le bus SPI


    ------

    bonjour a tous , voila j'ai un problème avec le bus spi car j'utilise 2 pic 16f877a un en Maitre et l’autre en Esclave , j'ai écrit le programme en Micro-Pascal , je décrit le programme , qu'on j’appuie sur le bouton de l'entre RB4 le Maitre lit la valeur envoyé par l'esclave qui est de la température et il l'affiche sur le portd , et qu'on je lance la simulation sur proteus l'esclave envoie les valeur mai le maitre ne lit pas la valeur correctement


    voici le programme du maitre :

    Code:
    program in_out;
     
    var
     
      bIntRB4 , bIntRB5: boolean ;            // variable boolean pour interruption
     
      lec_temp : byte;                              // variable a lire du PORTB
     
      Chip_Select : sbit at RC6_bit;                  // selection de l'esclave
     
      Chip_Select_Direction : sbit at TRISC6_bit;     // direction de la pin SS de selection de l'esclave
     
      temp : byte ;                                   //
     
      buffer : byte ;                                 //
     
    procedure Interrupt ;
     
    begin
     
     //interruption liée a l'etat logique de RB4 a RB7
     
     if INTCON.RBIF = 1 then
        begin
     
        INTCON.RBIF := 0; // remise a  zero du bit d'état de l'interuption RB4 a RB7
     
        lec_temp := PORTB ; // il faut lire  du PORTB
     
        bIntRB4 := true ;
     
     
       end;
     
    end;
     
     
    begin
     
     CMCON := 7 ;
     TRISA:=%00000000; // toutes ligne du port A en sortie
     TRISB:=%01111111; // toute ligne du  port B en entrée sauf RB7
     TRISC:=%00010000; // toutes ligne du port c en sortie sauf RC4
     trisd :=$00 ;
     portd :=$00 ;
     INTCON := $00 ;
     INTCON.RBIE:= 1 ;              // activation de l'interruption RB4 a RB7
     INTCON.RBIF:= 0 ;             // effacement du flag RBIF
     INTCON.GIE := 1 ;             // autorisation des interruption global
     OPTION_REG := $00 ;           //
     OPTION_REG.NOT_RBPU := 1 ;   // désactivation pull_up portB
     OPTION_REG.INTEDG := 1 ;    // interruption RB0 sur front montant
     
     PORTA := $00;               // effacer PORTA
     
     PORTB := $00;              // effacer PORTB
     
     PORTC := $00 ;             // effacer portc
     
     bIntRB4:= false ;                                   //
     
     bIntRB5:= false ;                                   //
     
     Chip_Select := 1;                                   // Deselect DAC
     
     Chip_Select_Direction := 0;                         // Set CS#  pin as Output
     
     SPI1_Init() ;
     
     while  true  do
     
                                    if  PORTB.4 = 1 then
     
                                         begin
     
                                            Chip_Select := 0 ;                 // selectionner l'esclave
     
                                            portd := SPI1_Read(buffer);  // lire la valeur contenue dan le buffer
     
                                            Delay_ms (50) ;                   //
     
                                            Chip_Select := 1 ;                //   deselectionner l'esclave
     
     
                                         end;
     
     
    end.
    voici le programme de l'esclave :

    Code:
    program Spi_Slave2;
     
    var
     
    b: word ;
     
    begin
     
     CMCON := 7 ;                             // desactivation des comparateur
     
     TRISA :=$FF ;                            // toute les ligne du PORTA   sont en entrée
     
     TRISD :=$00 ;                           //
     
     PORTD :=$00 ;                          //
     
     trisc :=%00011000 ;                  // SCLK en entrée et SDI en entrée SDO en sortie
     
     ADC_Init() ;                              //  initialisation convertisseur
     
     SPI1_init();                               // Initialize SPI module
     
     
      while true do
             begin
     
               b := ADC_Read (0) ;   // lecture du canal 0
     
               SPI1_Write(b) ;       // envoyer la valeur
     
               portd := b ;          //
     
             end ;
     
     
    end.

    -----
    Dernière modification par Antoane ; 27/08/2018 à 21h04. Motif: Ajout des balises code

  2. #2
    Seb.26

    Re : Probleme avec le bus SPI

    quelques idées en vrac :
    > avec le test "if PORTB.4 = 1 then", ton code tourne en boucle toutes les 50ms -> ajoute une attente pour que "PORTB.4 = 0" afin de ne faire qu'une fois ça (un anti-rebond ne ferait pas de mal).
    > vérifies la polarité de "Chip_Select"
    > vérifies si le "portb" de l'esclave donnes bien la valeur que tu attends (je vois que tu fais aussi "portd := b;" dans l'esclave)
    > vérifies si le "portb" du maitre donnes bien la valeur que tu attends (pour tester tu changes "portd := SPI1_Read(buffer);" par "portd := 0x55;" par exemple )
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

Discussions similaires

  1. problème avec l'utilisation de multimetre avec carte mère
    Par invitee7076f27 dans le forum Électronique
    Réponses: 22
    Dernier message: 11/11/2015, 14h02
  2. probléme avec une chaudiere bois avec ballon tampon
    Par invite4964a099 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 55
    Dernier message: 03/11/2015, 13h01
  3. Problème avec Inéquation avec valeur absolue et racine
    Par inviteda7b675e dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 23/09/2011, 19h48
  4. Réponses: 0
    Dernier message: 26/04/2011, 22h25
  5. Réponses: 10
    Dernier message: 22/03/2009, 11h34
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...