Hallo zusammen. Ich bin dabei eine Kommunikation von 2 PICs über I²C zu
realisieren. Da ich erstmal mit I²C selber klarkommen will, will ich
erstmal etwas in ein I²C-EEPROM schreiben und auslesen. Hierfür benutze
ich einen PIC16F1937 bei 8MHz internen Takt und 4xPLL:
1 | sbit button1 at RA0_bit;
|
2 |
|
3 | void init(){
|
4 | OSCCON = 0b11110010; // 1-PLL Enable, 1110-8MHz internal Oscillator,
|
5 | // 0-unimplemented, 10-Internal oscillator block
|
6 | ADCON0 = 0;
|
7 | ADCON1 = 0;
|
8 | ANSELA = 0;
|
9 | ANSELB = 0;
|
10 | ANSELD = 0;
|
11 | ANSELE = 0;
|
12 | DACCON0 = 0;
|
13 | CM1CON0 = 0;
|
14 | CM2CON0 = 0;
|
15 | LCDCON = 0;
|
16 | CCP1CON = 0;
|
17 | CCP2CON = 0;
|
18 | CCP3CON = 0;
|
19 | CCP4CON = 0;
|
20 | CCP5CON = 0;
|
21 | TRISA = 1;
|
22 | TRISB = 0b01110111;
|
23 | TRISC = 0;
|
24 | TRISD = 0;
|
25 | TRISE = 0;
|
26 | PORTA = 0;
|
27 | PORTB = 0;
|
28 | PORTC = 0;
|
29 | PORTD = 0;
|
30 | PORTE = 0;
|
31 | I2C1_Init(100000);
|
32 | }
|
33 |
|
34 | void main() {
|
35 | init();
|
36 |
|
37 | while(1){
|
38 | while(!button1);
|
39 | delay_ms(20);
|
40 | while(button1);
|
41 |
|
42 | I2C1_Start();
|
43 | I2C1_Wr(0b10100100);
|
44 | I2C1_Wr(0);
|
45 | I2C1_Wr(0);
|
46 | I2C1_Wr(0b00001010);
|
47 | I2C1_Stop();
|
48 |
|
49 | delay_ms(20);
|
50 |
|
51 | I2C1_Start();
|
52 | I2C1_Wr(0b10100100);
|
53 | I2C1_Wr(0);
|
54 | I2C1_Wr(0);
|
55 | I2C1_Repeated_Start();
|
56 | I2C1_Wr(0b10100101);
|
57 | PORTD = I2C1_Rd(0);
|
58 | I2C1_Stop();
|
59 | }
|
60 | }
|
Das funktioniert so nicht bzw. die LEDs, die an PORTD hängen zeigen
nichts an. Also hab ich zwischendurch eine "Debug"-Ausgabe gemacht:
1 | while(!button1);
|
2 | delay_ms(20);
|
3 | while(button1);
|
4 |
|
5 | I2C1_Start();
|
6 | I2C1_Wr(0b10100100);
|
7 | I2C1_Wr(0);
|
8 | I2C1_Wr(0);
|
9 | I2C1_Wr(0b00001010);
|
10 | I2C1_Stop();
|
11 | PORTD = 0x0F;
|
12 |
|
13 | while(!button1);
|
14 | delay_ms(20);
|
15 | while(button1);
|
16 |
|
17 | I2C1_Start();
|
18 | I2C1_Wr(0b10100100);
|
19 | I2C1_Wr(0);
|
20 | I2C1_Wr(0);
|
21 | I2C1_Repeated_Start();
|
22 | I2C1_Wr(0b10100101);
|
23 | PORTD = I2C1_Rd(0);
|
24 | I2C1_Stop();
|
und dort hab ich dann gesehen, dass die LEDs nichtmal die 0x0F
ausgegeben haben. Also hab ich den Code solange reduziert, bis die LEDs
angingen:
1 | while(!button1);
|
2 | delay_ms(20);
|
3 | while(button1);
|
4 |
|
5 | I2C1_Start();
|
6 | I2C1_Wr(0b10100100);
|
7 | //I2C1_Wr(0);
|
8 | //I2C1_Wr(0);
|
9 | //I2C1_Wr(0b00001010);
|
10 | I2C1_Stop();
|
11 | PORTD = 0x0F;
|
12 |
|
13 | while(!button1);
|
14 | delay_ms(20);
|
15 | while(button1);
|
16 |
|
17 | /*I2C1_Start();
|
18 | I2C1_Wr(0b10100100);
|
19 | I2C1_Wr(0);
|
20 | I2C1_Wr(0);
|
21 | I2C1_Repeated_Start();
|
22 | I2C1_Wr(0b10100101);
|
23 | PORTD = I2C1_Rd(0);
|
24 | I2C1_Stop();*/
|
Doch wenn ich dann das erste "I2C1_Wr(0);" wieder reinnehme, bzw die
"//" davor lösche, dass es nicht mehr auskommentiert ist, gehen die LEDs
nicht mehr an. Da frage ich mich, warum das so ist und mir ist beim
besten Willen nichts eingefallen. Hängt sich der PIC auf, wenn er vom
EEPROM nichts mitbekommt? Anderer Seits soll er ja auch nur schreiben
und es ist ja auch nicht sehr klug, dass das Programm abstürzt, nur weil
ein Slave nicht erreicht wird/werden sollte. Es hängt schon ein EEPROM
dran und sollte eigentlich so auch funktionieren.
Kann mir da jemand helfen?