Forum: Mikrocontroller und Digitale Elektronik Zwei PIC16F877 via I2C


von Martin (Gast)


Lesenswert?

Hallo,

ich versuche schon seit einiger Zeit zwei PIC´s(16F877) mit I2C zu 
verbinden. Ein Master soll eine Hex Zahl an einen Slave rübersenden. 
Dies versuche ich mit C zu realisieren. Denn Master-Teil habe ich 
hinbekommen. Er sendet zuerst die Adresse und dann die Zahl. Nur der 
Slave-Teil will nicht richtig. In meinen SSPBUF (vom Slave) ist nur die 
Adresse drin. Die darauffolgende Zahl kommt nicht in den SSPBUF 
Speicher. Die ACK´s werden aber immer vom Slave angegeben, der Slave 
erkennt anscheinend die Informationen. Auch mein BF im SSPSTAT bleibt 
null.

Wie bekomme ich nun die Hex Zahl in den Slave, um sie ausgelesen?

Danke im voraus.

Gruß
Martin

von Raoul _. (schwubba)


Lesenswert?

Hallo!

Hast du den Fehler behoben? Falls ja, würde es mich sehr interessieren 
wie bzw. woran es gelegen hat. Ich selbst will gleiches realisieren, 
Kommunikation zwischen zwei PICs über I²C; stecke aber mit selbigen 
Symptomen, wie du beschrieben hast, fest.
Was ich noch von meinem Oszi entnehmen kann ist, dass der Slave (der 
sich eigentlich nicht angesprochen fühlt) mit dem 9.bit kein ACK zurück 
sendet.

Codeschnipsel Slave:
Mit
1
  OpenI2C(SLAVE_7, SLEW_OFF); //not interrupt driven
2
  SSPADD=0b00001110;
3
  while(1)
4
    val = ReadI2C();
5
    ...
lese ich interessanter weise immer die Slave Adresse, welche vom Master 
am Bus gelegt wird. Wahrscheinlich wird alles vom Bus vom SSP Modul 
aufgeschnüffelt... Dennoch mit
1
 OpenI2C(SLAVE_7, SLEW_OFF);  //not interrupt driven
2
 SSPADD=0b00001110;
3
 if (DataRdyI2C()){
4
   val = ReadI2C();
5
   ...
6
 }
springt der Code nie in den Block hinein (da sich der Slave anscheinend 
nicht angesprochen fühlt).

Der Mastercode macht in etwa folgendes:
1
  OpenI2C(MASTER, SLEW_OFF);
2
  SSPADD=39;  //@actually 16MHz Clock
3
  SSPCON1bits.WCOL = 0b0; //keine Ahung warum es vor dem ersten Write nötig ist
4
  IdleI2C();
5
  StartI2C();
6
  IdleI2C();
7
  if(WriteI2C(slave_adress) == 0) //0b00001110
8
    WriteI2C(data);
9
  IdleI2C();
10
  StopI2C();
Habe schon mit Brute-Force versucht die Adresse anzusprechen (eifacher 
7-bit Counter), da ich dachte, die Bits werden wohlmöglich verkehrt auf 
den Bus abgelegt, aber keinen Erfolg damit erziehlt.
Ich habe mit Assembler wenig zu schaffen gehabt, und will mich damit 
nicht viel beschäftigen müßen. Ich verwende die c18 Libraries von 
Microchip. Mittleweile (nach etwa drei Tage surfen und suchen) muss ich 
zugeben, dass man genügend Master Tutorials im Netz findet, aber keine 
wirklich brauchbare mit c18-Libs für Slaves.

Ich kann nur hoffen, dass du dein Posting gelegentlich beobachtest, bzw. 
jeman anderes sich meinem Problemchen annimmt! :)

lg & thx im vorhinein,
r

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.