www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik I2C probelem


Autor: chris (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: chris (Gast)
Datum:

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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ();
}

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
in der letzten zeile des programms gehört natürlich

 I2C_BUS_STOPP ();
}

Autor: Peter Dannegger (peda)
Datum:

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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ();
}

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.