Zwei PIC16F877 via I2C

Gast #624977
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
#792590
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.