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); } }merci pour votre aide
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 { } } }
Partager