salut toutle monde je ne parviens pas à transferer une donnée de plus de 8 bits.

Voici le code :
code master :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <16F883.h>
#device ADC=10
 
#fuses INTRC,NOWDT,MCLR,DEBUG,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT,NOCPD
#use delay(clock=8000000)   // (8000000)8MHz Clock ,31kHz
 
#use i2c(MULTI_MASTER, sda=PIN_C4,scl=PIN_C3,force_hw )// 
 
 
//#use i2c(MULTI_MASTER, sda=PIN_C4,scl=PIN_C3, force_hw) 
 
#define  LED         PIN_B4
#define	t 0x08
 
#define end_1 0xA0     //adresse de l'esclave
 
int8 val,val1,val2,val3;
 
 
//fonction d'envoie de donnée à l'esclave
void envoie_i2c(BYTE end_disp, BYTE adr, int8 data )
{
 
   i2c_start();               //commence la transmission
 
   i2c_write(end_disp);           //choisie l'addresse de l'esclave avec qui communiqué
 
   i2c_write(adr);           //envoie l'adresse de la donnée
 
   i2c_write(data);           //envoie la donnée
 
   i2c_stop();                //arrêt de la communication
 
   delay_ms(100);             //delay      
 
 
/*
	i2c_write( data );           //envoie la donnée
 
	i2c_write( data>>8 );           //envoie la donnée
 
	nb1=    data >> 8;
 
 
	i2c_write( data );           //envoie la donnée
 
	i2c_write( nb1 );           //envoie la donnée
 
   i2c_write( *((int8*)(&data)+0) );           //envoie la donnée
 
   i2c_write( *((int8*)(&data)+1) );           //envoie la donnée
*/
 
} 
 
void main()
{
//	set_tris_b(0xFF);
   	set_tris_c(0b10111111); 
 
	setup_oscillator(OSC_1MHZ,0);   //(8MHZ,31kHZ)set oscillator to 8Mhz 
 
 
	val = 200;
	val1 = 155;
	val2 = 230;
	val3 = 45;
 
 
	output_high(LED);
	delay_ms( 500);
	output_low(LED);
	delay_ms(500);
 
	while(TRUE)
   {       
 
         envoie_i2c(end_1, t,val );  //envoie une donnée a l'esclave      
         		output_high(LED);
         delay_ms(1000);
 
 
         envoie_i2c(end_1, t,val1 );  //envoie une donnée a l'esclave      
         		output_low(LED);
         delay_ms(1000);
 
         envoie_i2c(end_1, t,val2 );  //envoie une donnée a l'esclave      
         		output_high(LED);
         delay_ms(1000);
 
         envoie_i2c(end_1, t,val3 );  //envoie une donnée a l'esclave      
         		output_low(LED);
         delay_ms(1000);
 
 
   } 
 
 
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/////////////////////////////////////////
 
////SLAVE//////////////////////////
 
 
#include <16F877.h>
#device adc=10
 
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
 
#use delay(clock=4000000)
 
#use i2c(SLAVE,sda=PIN_C4,scl=PIN_C3,address=0xA0, force_hw)
 
#include "C:\mplab_projet\flex_lcd_aba.c"
 
 
 
#define LED PIN_B3
 
int state, address, buffer[0x08]; // address and array of Bytes, change size to suit your needs
 
short bit1 ;
 
#INT_SSP NOCLEAR
void ssp_interupt (void)
{
clear_interrupt(int_SSP);
 
state = i2c_isr_state();
 
if(state < 0x80) //le maitre est entrain d'envoyé des donnée
{
if(state == 0) //premier octet réçue est l'adresse de l'esclave
{ // output_high(LED);
}
if(state == 1) //second octet réçue est l'adresse
{
address = i2c_read();
}
if(state == 2) //troisieme octet reçu est la donnée
{
*( (int8* )( &buffer[address + (state-2)]) ) = i2c_read();
 
output_high(LED);
 
bit1= true;
 
 
}
 
 
}
 
/*
if(state == 0x80) //master is requesting data
{
i2c_write (buffer[address]); //send requested data
 
}
*/
 
}
 
 
void main()
{
set_tris_c(0xFF);
 
bit1 = false;
 
enable_interrupts(INT_SSP); //enable I2C interrupts
enable_interrupts(GLOBAL);
 
 
buffer[0x00] = 0b10000000;
buffer[0x01] = 0b10000001;
 
buffer[0x02] = 0b01000010;
buffer[0x03] = 0b01000011;
 
buffer[0x04] = 0b10000000;
buffer[0x05] = 0b10000001;
 
buffer[0x06] = 0b01000010;
buffer[0x07] = 0b01000011;
 
 
 
 
lcd_init();
delay_ms(10);
printf(lcd_putc,"\fcommunication I2C\n");//
 
printf(lcd_putc,"val : ");
 
 
while(TRUE)
{
 
delay_ms(100);
 
if(bit1) // attend la donnée
{
lcd_gotoxy(9,2);
printf(lcd_putc,"%u ",buffer[address]); //Lu
 
bit1=false;
}
else
{
}
 
}
 
 
 
}
merci pour votre aide