Forum: Mikrocontroller und Digitale Elektronik I2C probelem


von chris (Gast)


Lesenswert?

ich ahb 2 probleme !
1. wie kann ich hier im forum beiträge über I2C finden ?


2. ich hab jetzt versucht I2C zu programmieren, jedoch ist das einzige 
was passiert das CLK von LOW auf High geht und auf high bleibt, data 
geht eine periode auf HIGH und dann wieder auf LOW. und das war es, hat 
wer eine idee was der fehler sein könnte ?



arbeite mit dem PIC 16F877

von Steffen (Gast)


Lesenswert?

Hallo Chris,

1. I2C geht nicht, da nur drei Buchstaben. (verstehe ich zwar nicht, da 
es etliche sinnvolle Suchbegriffe mit 2 oder drei Buchstaben gibt).

2. Da bräucht ich noch ein paar Informationen. Am besten den Quelltext. 
Ich nehme mal an, dass Du den integrierten I2C-Port verwendest. Eine 
falsche Einstellung und das Ding kann nicht gehen.

MfG
Steffen

von chris (Gast)


Lesenswert?

ja, ich verwende den internen I2C Port !


ich schreib einmal wie ich es mir gedacht habe:

ich habe einmal die beiden I2C Ports als Eingänge definiert,


 SSPADD = 0b00001001;    // 100kHz Takt
 SSPCON = 0b00001000;    // I2C MasterMode
 SSPCON.5 = 1;      // I2C an
 CKE = 0;                       // I2C parameter

das ist bei mir die ganze initialisierung

von chris (Gast)


Lesenswert?

und so möchte ich daten übertragen:


void I2C_FERTIG ()
{
 while (PIR1.3 == 0);
 PIR1.3 = 0;
}

void I2C_BUS_START ()    // Start - Bit
{
 SEN = 1;
 I2C_FERTIG ();
}

void I2C_BUS_START_rep ()  //
{
 RSEN = 1;
  I2C_FERTIG ();
}

void I2C_BUS_STOPP ()    // Stopp - Bit
{
 PEN = 1;
 I2C_FERTIG ();
}

void I2C_R (char x)    // Daten schreiben
{
 SSPBUF = x;
 I2C_FERTIG ();
}

void I2C_W ()      // Daten lesen
{
 RCEN = 1;      // PIC soll den Takt erzeugen
 I2C_FERTIG ();


 I2Cempfang = SSPBUF;
}

void RTC_INI ()
{
 I2C_BUS_START ();
 I2C_R (0xA0);    // zum lesen adressieren
 I2C_BUS_START_rep ();
 I2C_R (0x00);    // Adresse im pcf 8583
 I2C_BUS_START_rep ();
 I2C_R (0x00);    // 0 in das register schreiben
 I2C_BUS_STOPP ();
}

void RTC_auslesen ()
{
 I2C_BUS_START ();
 I2C_R (0xA0);    // Adresspointer auf die auszu-
 I2C_BUS_START_rep ();
 I2C_R (0x02);    // lesende adresse stellen
 I2C_BUS_START ();
 I2C_R (0xA1);    // zum lesen adressieren
 I2C_BUS_START_rep ();
 I2C_W ();    // Daten vom bus einlesen
 sek = I2Cempfang;
 I2C_BUS_START_rep ();
}

von chris (Gast)


Lesenswert?

in der letzten zeile des programms gehört natürlich

 I2C_BUS_STOPP ();
}

von Peter D. (peda)


Lesenswert?

Ich kenn mich mit den PICs nicht aus, aber I2C geht so:

Ein Start sendet man nur einmal bevor man die Slaveadresse sendet. Und 
dann wartet man das ACK des Slaves ab, sonst geht gar nichts.

Ein Repeat-start sendet man nur, wenn man die Richtung wechseln will, 
d.h. von Schreiben auf Lesen oder umgekehrt. Und dann kommt als erstes 
auch wieder die Slaveadresse mit dem Lese/Schreibbit, das ACK des Slaves 
usw...

Die Daten-ACKs erzeugt immer der Lesende und der Schreibende prüft sie.

Und nach dem Lesen des letzten Bytes muß der Master ein NACK senden, 
damit der Slave weiß, daß Schluß ist.


Peter

von chris (Gast)


Lesenswert?

was stimmt an der iniziasierung und am beginn der datenübertragung nicht 
?


bei mir beginnt er gar nicht daten zu übertragen !


void I2C_INI ()
{
 SSPEN = 1;
 SSPM3 = 1;
 SSPM2 = 0;
 SSPM1 = 0;
 SSPM0 = 0;
 SSPCON2 = 0;
 SMP = 1;
 CKE = 0;
 SSPADD = 10;
}

void I2C_BUS_START ()    // Start - Bit
{
 SEN = 1;
 while (SEN);
}

void I2C_W (char x)
{
 SSPIF = 0;
 SSPBUF = x;
 while (SSPIF == 0);
}



void RTC_INI ()
{
 I2C_BUS_START ();
 I2C_W (0xA0);
 I2C_W (0x00);
 I2C_W (0x00);
 I2C_BUS_STOPP ();
}

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.