Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > 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