Ich versuche seit einigen Tagen 16bit Port Expander(MCP23016) mit I2C über den MSSP Anschluss meines PIC18F452 anzusteuern. Bisher ist es mir nicht gelungen das der Chip auch nur ein Lebenszeichen von sich gegeben hat. Im Daten Blatt steht das ein 33pF und ein 3,9kΩ an dem CLK Anschluss angesteckt werden muss. Ich hatte in meiner Bastelkiste diese krummen Werte leider nicht vorrätig. Deshalb verwendete ich einfach zwei parallele Kondensatorn mit 22pf und 10pf sowie zwei parallele Metallschicht Widerstände mit 22kΩ und 4,7kΩ. Kann es ein das diese Ersatzkonstruktion nicht ausreichend genau ist? (22pf, 3,87kΩ) Ich habe das Datenblatt des Portexpanders (http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME=A200%252FMCP23S17_MIC.pdf;SID=12TirYq38AAAIAAH2xdJQ13c563bdfb27c649372d97e1189e7689) schon eine Weile studiert und auch die I2C-Hardwarebenutzungsanleitung(Tolles Wort) von Sprut(http://www.sprut.de/electronic/pic/grund/i2c.htm) gelesen. Doch irgendwie habe ich nicht herausgefunden wie das Datenprotokoll für den MCP23016 auf der I2C Leitung auszusieht. Ich sendete daher bisher einfach erst die Registeradresse und dann die Daten. Kann auch sein, dass das falsch ist. Das Datenblatt deas PIC18F452 haeb ich von hier: http://www.reichelt.de/index.html?;ACTION=7;LA=3;OPEN=0;INDEX=0;FILENAME=A300%252FPIC18F242_PIC18F252_PIC18F442%2523MIC.pdf;SID=12TirYq38AAAIAAH2xdJQ13c563bdfb27c649372d97e1189e7689 Den Code den ich bisher schrieb:
1 | #include <p18f452.h> |
2 | #include <delays.h> |
3 | |
4 | #pragma config WDT = OFF // Watchdog Timer
|
5 | #pragma config LVP = OFF // Low Voltage programming
|
6 | #pragma config STVR = OFF // Stack Overfow Reset
|
7 | #pragma config BOR = ON // BrownOut Detect
|
8 | #pragma config BORV = 42 // BrownOut Voltage
|
9 | #pragma config OSC = HS // Taktbereich
|
10 | #pragma config CCP2MUX = ON // Anschluss Disabled(BB3) Enebled(BC1)
|
11 | #pragma config PWRT = OFF // Power On Timer
|
12 | #pragma config DEBUG = ON // Debug Process
|
13 | |
14 | //#pragma config MCLRE = OFF // Master Clear Reset
|
15 | void Senden(unsigned Data); |
16 | void main() |
17 | {
|
18 | SSPADD = 12; //I2C Initialisieren |
19 | TRISCbits.RC3 = 1; |
20 | TRISCbits.RC4 = 1; |
21 | SSPCON1 = 0b00001000; |
22 | SSPCON1bits.SSPEN = 1; |
23 | |
24 | PIR1bits.SSPIF = 0; //I2C Reservieren |
25 | SSPCON2bits.SEN = 1; |
26 | while(!(PIR1bits.SSPIF)) |
27 | {
|
28 | Nop(); |
29 | }
|
30 | PIR1bits.SSPIF = 0; |
31 | |
32 | Senden(0b00000010); //Adresse des Expanders |
33 | Senden(0x02); // Adresse auf das Register OLAT0 |
34 | Senden(0xFF); // Alles auf 1 setzten |
35 | |
36 | SSPCON2bits.PEN = 0; //I2C freigeben |
37 | while(!(PIR1bits.SSPIF)) // An dieser Schleife bleibt der Debugger immer Hängen |
38 | {
|
39 | Nop(); |
40 | }
|
41 | PIR1bits.SSPIF = 0; |
42 | }
|
43 | void Senden(unsigned Data) |
44 | {
|
45 | SSPBUF = Data; |
46 | while(!(PIR1bits.SSPIF)) |
47 | {
|
48 | Nop(); |
49 | }
|
50 | PIR1bits.SSPIF = 0; |
51 | }
|
Ich habe leider kein Oszilloskop und kann nicht einmal Prüfen ob der Pic überhaupt etwas auf den Port schreibt. Ich hoffe hier sieht jemand den Fehler. Ich bin momentan nur noch verzweifelt. ;-)