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 :
voici le programme de l'esclave :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.
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.
-----