www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zwei PIC16F877 via I2C


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Raoul __ (schwubba)
Datum:

Bewertung
0 lesenswert
nicht 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
  OpenI2C(SLAVE_7, SLEW_OFF); //not interrupt driven
  SSPADD=0b00001110;
  while(1)
    val = ReadI2C();
    ...
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
 OpenI2C(SLAVE_7, SLEW_OFF);  //not interrupt driven
 SSPADD=0b00001110;
 if (DataRdyI2C()){
   val = ReadI2C();
   ...
 }
springt der Code nie in den Block hinein (da sich der Slave anscheinend 
nicht angesprochen fühlt).

Der Mastercode macht in etwa folgendes:
  OpenI2C(MASTER, SLEW_OFF);
  SSPADD=39;  //@actually 16MHz Clock
  SSPCON1bits.WCOL = 0b0; //keine Ahung warum es vor dem ersten Write nötig ist
  IdleI2C();
  StartI2C();
  IdleI2C();
  if(WriteI2C(slave_adress) == 0) //0b00001110
    WriteI2C(data);
  IdleI2C();
  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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.