Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: CC bleibt bei I2C_Start hängen Kategorie: I²C-Bus (von Endress - 22.06.2009 10:30)
Als Antwort auf Re: CC bleibt bei I2C_Start hängen von Endress - 20.06.2009 19:35

> > > > > Hallo,
> > > > >
> > > > > ich habe den Code aus dem Buch übernommen und ein Temperaturmodul angehängt.
> > > > >
> > > > > Die C-Control hängt sich beim ersten I2C_Start() auf, auch wenn garkein I2C Slave im Bus hängt.
> > > > >
> > > > > Code ist bis auf die Adresse des Modul identisch :
> > > > >
> > > > > http://books.google.de/books?id=bnI1TIagSPQC&pg=PA85&dq=i2c+c-control&lr=
> > > > >
> > > > > Danke und Gruss, Endress
> > > > >
> > > > >
> > > > >
> > > > Hallo Endress,
> > > >
> > > > schick mal bitte den Code, so ist schwer zu sagen wo es hängt.
> > > >
> > > > GruÃ?
> > > > GEMINI1606
> > >
> > > Orginal Code:
> > >
> > > // I2C-Thermometer
> > > // erforderliche Library: IntFunc_Lib.cc, LCD_Lib.cc
> > >
> > > // Ã?ber ein I2C-Bus Thermometer Modul wird die aktuelle Temperatur erfasst und
> > > // über die Leitungen SDA und SCL an den MEGA32 bzw. MEGA128 übertragen.
> > > // Der ermittelte Wert wird auf dem Display angezeigt.
> > >
> > > // globale Variablendeklaration
> > > int MSDB, LSDB;
> > > char zeile1[9], zeile2[9];
> > >
> > > //-------------------------------------------------------------------------------
> > > // Hauptprogramm
> > > //
> > > void main(void)
> > > {
> > >     TempInit();             // I2C-Modul wird initialisiert
> > >     DisplayInit();          // LCD-Modul wird initialisiert
> > >
> > >     while (true)
> > >     {
> > >         I2C_Start();        // I2C starten
> > >         I2C_Write(0x9E);    // Temperaturmodul mit der Adresse 10011110 aufrufen
> > >         I2C_Write(0xAA);    // Die letzte konvertierte Temperatur wird eingelesen
> > >         I2C_Start();        // I2C erneut starten
> > >         I2C_Write(0x9F);    // Temperaturmodul mit der Adresse 10011111 aufrufen
> > >                             // Mit dem ersten Bit wird das Schreiben und Lesen
> > >                             // unterschieden 1 <=> lesen, 0 <=> schreiben.
> > >         MSDB=I2C_Read_ACK();    // Der MSDB-Wert wird gelesen und mit einem ACK quittiert.
> > >         LSDB=I2C_Read_NACK();   // Der LSDB-Wert wird gelesen und mit einem NACK quittiert.
> > >         I2C_Stop();         // I2C wird angehalten
> > >         Display();          // Der ermittelte Wert wird auf dem Display ausgegeben.
> > >         AbsDelay(1000);     // Nach einer Sekunde wird die nächste Messung durchgeführt.
> > >     }
> > > }
> > >
> > >
> > > void TempInit(void)
> > > {
> > >
> > >     I2C_Init(I2C_100kHz );  // I2C initialisieren
> > >
> > >     I2C_Start();            // I2C starten
> > >     I2C_Write(0x9E);        // Temperaturmodul mit der Adresse 10011110 aufrufen
> > >     I2C_Write(0xAC);        // Aufruf des 1-bate Konfigurationsregisters
> > >     I2C_Write(0x02);        // Die Datenübertragung des Moduls wird aktiviert
> > >     I2C_Stop();             // I2C wird angehalten
> > >
> > >     I2C_Start();            // I2C starten
> > >     I2C_Write(0x9E);        // Temperaturmodul mit der Adresse 10011110 aufrufen
> > >     I2C_Write(0xA1);        // TH-Register wird aufgerufen
> > >     I2C_Write(0x28);        // MSDB der maximalen Temperatur wird gesendet (+40°C)
> > >     I2C_Write(0x00);        // LSDB der maximalen Temperatur wird gesendet
> > >     I2C_Stop();             // I2C wird angehalten
> > >
> > >     I2C_Start();            // I2C starten
> > >     I2C_Write(0x9E);        // Temperaturmodul mit der Adresse 10011110 aufrufen
> > >     I2C_Write(0xA2);        // TL-Register wird aufgerufen
> > >     I2C_Write(0x00);        // MSDB der minimalen Temperatur wird gesendet (+0°C)
> > >     I2C_Write(0x00);        // LSDB der minimalen Temperatur wird gesendet
> > >     I2C_Stop();             // I2C wird angehalten
> > >
> > >     I2C_Start();            // I2C starten
> > >     I2C_Write(0x9E);        // Temperaturmodul mit der Adresse 10011110 aufrufen
> > >     I2C_Write(0x51);        // Ã?bertragung wird gestartet
> > >     I2C_Stop();             // I2C wird angehalten  
> > > }
> > >
> > >
> > > //-------------------------------------------------------------------------------
> > > // Display
> > > //
> > > void DisplayInit(void)
> > > {
> > >
> > >     LCD_Init();                 // Display initialisieren
> > >     LCD_ClearLCD();             // Display löschen
> > >     LCD_CursorOff();            // Display Cursur ausschalten
> > >     zeile1 = "I2C-Temp";        // Text der ersten Zeile wird zugewiesen
> > > }
> > >
> > > void Display(void)
> > > {
> > >     Str_WriteInt(MSDB, zeile2, 0);
> > >     LCD_CursorPos(0x00);        // LCD Cursor positionieren
> > >     LCD_WriteText(zeile1);      // Die erste Zeile wird ausgegeben.
> > >     LCD_CursorPos(0x42);        // LCD Cursor positionieren
> > >     LCD_WriteText(zeile2);      // Die Temperatur wird ausgegeben.
> > >     LCD_WriteChar(0x20);        // Ein Leerzeichen wird geschrieben.
> > >     LCD_WriteChar(0x43);        // Ein C wird ausgegeben.
> > > }
> > >
> > > wie gesagt ist es das Orginal Beispiel aus dem Buch MSR mit C-Control Pro von Rainer Schirm und
> > > Peter Sprenger.
> > >
> > > Gruss, Endress
> >
> > Hallo,
> >
> > hast du PullUP Widerstände an den Leitungen SCL und SDA ???
> >
> > GruÃ?
> > GEMINI1606
>
> Hallo Gemini,
>
> es handelt sich um das I2C Temperaturmodul von Conrad, da bin ich davon ausgegangen, dass die Pullups
> auf dem Modul schon vorhanden sind.
> Ich habe testweise 2 Pullupwiderstaende angesteckt, bringt auch nichts.
>
> Gruss, Endress

Mittlerweile bin ich etwas verzweifelt. Ich hab die ganze Geschichte nochmal so verdrahtet, wie es auch
im Buch vom Ulli Sommer angegeben ist ( mit 2   2,2 K Widerständen ) , ohne Erfolg.
Direkt beim I2C_Start bleibt das ganze hängen.
Ich hab auch ein neues Temperaturmodul verwendet, mit der Orginaladresse, um alle Fehler bei der
Addressierung auszuschliessen es funktioniert einfach nicht.

Hat nicht irgendjemand eine Idee, warum mir das Ding so gnadenlos hängen bleibt ?

Danke und Gruss, Endress


    Antwort schreiben


Antworten:

Re: CC bleibt bei I2C_Start hängen (von Daniel - 26.06.2009 17:38)