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 - 19.06.2009 11:23)
Als Antwort auf Re: CC bleibt bei I2C_Start hängen von GEMINI1606 - 19.06.2009 10:48
Ich nutze:
C-Control Pro Mega128, CC-Pro 128 Application Board, Pro-Bot128
> > 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


    Antwort schreiben


Antworten:

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