Forum: Mikrocontroller und Digitale Elektronik pic16f887 I2C Slave


von daniel (Gast)


Lesenswert?

Hallo

Möchte gerne einen PIC 16f887 als I2C Slave ansteuern, er soll vom 
anderen Prozessor nur daten erhalten und keine senden. Nun habe ich den 
i2c Bus so

void vI2CInit (void)
  {
  // Pin RC3 und RC4 vom PORTC als Eingaenge konfigurieren
  TRISC=(TRISC|0b00011000);
  // Busgeschwindigkeit einstellen
  SSPADD=0x06;    // Adresse 0x06
  // Modus setzen
  SSPCON=0x3E;    // Slave mode, Takt freigeben, Schnittstelle ein
  }
initialisiert und das Interuptflag SSPIF mit SSPIE freigegeben.

Wenn der andere Prozessor nun ein Telegramm sendet, empfange ich die 
direkt die Adresse 0x06.
Muss ich das ACK nun selber setzen oder wieso habe ich die Adresse im 
I2C Buffer? Was habe ich falsch gemacht?

gruss daniel

von Gerd M. (avrgerd)


Lesenswert?

Es wird auf dem I2C Bus immer die Adresse gesendet. Das dient der 
Ansteuerung mehrerer Busteilnehemer.

Wenn Du also "Eine" Adresse empfängst, musst Du nun vergleichen ob es 
"Deine" Adresse ist und auch nur dann entsprechend reagieren.
Eine unschöne Aussnahme wäre, wenn Dein Master und Slave "alleine" am 
Bus hängen, dann könntest Du annehmen, dass der Slave immer gemeint ist.

Wie gesagt, unschön und bei einem 2. Slave am Bus tödlich.

Gruß,
avrGerd

von daniel (Gast)


Lesenswert?

Danke Gerd M. für die schnelle Antwort
Ich lege jedoch dem PIC die Adresse auf die er ansprechen soll ins 
SSPADD Register, sollte er dan nicht selbst erkennen wann er 
angesprochen wird und wann nicht? so müsste ich ja immer selbst das ACK 
setzen, damit er das gesammte Telegramm sendet.

von Gerd M. (avrgerd)


Lesenswert?

Sorry, kenne mich mit den Details bei den Pic's nicht aus.

Sieht aber wie ein Hardware I2C Interface aus, welches Du benutzt.

Eigentlich sollte im Datenblatt das exakte Verhalten beschrieben sein.

Wichtig ist auch die Art und Weise wie die I2C Adresse im PIC behandelt 
wird.
Ist die Info schreiben/lesen in der Adresse mit verheiratet?

Das ist oft ein Verständnissproblem und führt oft zu Fehlern.
Prüf das bitte mal nach.


Gruß,
avrGerd

von daniel (Gast)


Lesenswert?

Ja genau es handelt sich um ein Hardwareinterface. Danke für den Tipp 
avrGerd, such erade den Aufbau des Registers. Bin leider noch nicht 
fündig geworden aber kann bstimmt einen einfluss haben.

von daniel (Gast)


Lesenswert?

Hallo nochmals
okey so wies aussieht muss ich das ACK selbst durchführen. Weis einer 
wie? oder gehts auch anders? stehe grad auf dem schlauch

von Oliver J. (skriptkiddy)


Lesenswert?

daniel schrieb:
> okey so wies aussieht muss ich das ACK selbst durchführen.
RTFM (13.4.1)
1
When an address is matched, or the data transfer after
2
an address match is received, the hardware
3
automatically will generate the Acknowledge (ACK)
4
pulse and load the SSPBUF register with the received
5
value currently in the SSPSR register.

Gruß Oliver

von daniel (Gast)


Lesenswert?

Super dann ist soweit alles in Ordnung.
Besten dank Oliver.
gruss daniel

von michael_ohl (Gast)


Lesenswert?

Aber das ACK kommt trozdem von allein. Du musst nur die Daten (in diesem 
Fall die Adresse) abholen sonst gibt es stress mit overflow.

Hab das ganze gerade für 2 PIC 16F887 und einen 16F886 zum laufen 
gebracht.

Der 16F886 multiplext 4 LED Bargraph Zeilen mit 16LEDs und die beiden 
16F887 kümmern sich um je 4*4 Stellen 7 Segment LED Anzeigen.

mfG
Michael

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.