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) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum