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 - 20.06.2009 19:35)
Als Antwort auf Re: CC bleibt bei I2C_Start hängen von GEMINI1606 - 19.06.2009 11:48

> > > > 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


    Antwort schreiben


Antworten:

Re: CC bleibt bei I2C_Start hängen (von ER - 23.06.2009 9:32)
Re: CC bleibt bei I2C_Start hängen (von Endress - 22.06.2009 10:30)
    Re: CC bleibt bei I2C_Start hängen (von Daniel - 26.06.2009 17:38)