Forum: Mikrocontroller und Digitale Elektronik MCP23016 16bit Port Expander an PIC(18F452) mit I2C über MSSP


von Tomas H. (pic_einsteiger)


Lesenswert?

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. ;-)

von Tomas H. (pic_einsteiger)


Lesenswert?

Weiß wirklich niemand weiter?
Hier muss es doch ein paar Leute geben die schonmal mit einem Pic als 
I2C-Master oder dem MCP23016 gearbeitet haben.

Da schreibt man sich in 20 Minuten die Finger wund, um das Problem 
möglichst genau zu erläutern und dann Antwortet keiner.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Solche Sausäcke gibt es auch nur hier, die Dir einfach nicht antworten 
wollen. Genau !

Ich habe mit den MCP23S17 gearbeitet. Der xxx16 ist ein programmierter 
PIC und eher very-old-school.

Die Sache mit SPI schien mir einfacher...

Mit I2C habe ich auch schon gearbeitet (mit anderen Bausteinen) und da 
kann man ganz tolle Fehler programmieren !
Nutze am besten als Vorlage ein funktionierendes Programm-Beispiel.
Und lies das Datenblatt wegen der Befehle. Microchip führt das immer 
sehr genau aus.

Ach ja,
im Datenblatt des PIC ist das Bit PEN so beschrieben, daß man es setzt, 
um eine Stop-Condition einzuleiten.
Lese es nach.

von Tomas H. (pic_einsteiger)


Lesenswert?

Stimmt PEN sollte wahrscheinlich gesetzt und nicht geleert werden. Das 
Probiere ich dann gleich morgen aus.

Ich würde gerne ein fertiges Beipiel nutzen, kenne aber leider keines.

Besonders bei den Befehlen vin ich mir unsicher:
1
  Senden(0b00000010); //Adresse des Expanders
2
  Senden(0x02);          // Adresse auf das Register OLAT0
3
  Senden(0xFF);          // Alles auf 1 setzten

Wie sieht bei dir der Code aus wenn du alle Bits am Port 1 löschen 
willst?
Kannst du mir einen Codeausschnitt zeigen?

Das Datenblatt das Expanders habe ich komplett durchgelesen.(Diese 
Bittabellen für den Bus aber nicht so ganz verstanden.)
Und auch einen Teil des I2C Teils im PIC18F452-Datenblatt.

von Andreas G. (beastyk)


Lesenswert?

Moin Tomas,

du solltest schon die Werte aus dem Datasheet genau einhalten.
In was für einer Sprache programmierste da? Ist das C?
Schau doch mal in die App. Note AN245 von Microchip, vielleicht hilft 
dir das weiter.

Gruß
Andi

von Tomas H. (pic_einsteiger)


Lesenswert?

Da es weder Basic noch Assembler ist muss es wohl C sein. :-)

Meinst du das: 
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en012075

Sieht sich sehr nützlich an. Werde ich auch morgen mal ausprobieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.