Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Kompass CMPS03


von Luca B. (lucabert)


Lesenswert?

Hallo, Leute!

Ich kämpfe seit Monaten gegen meinem Kompass CMPS03, angeschloßen an 
einem ATMega128.
Am Anfang dachte ich, dass das Programm, das ich geschrieben habe, 
spinnt (es ist gewachsen wie verrückt [vom ATMega8, zum Mega32 zum 
Mega128 und immer neue Geräte angeschloßen...] und konnte nix mehr 
verstehen).

Vor eine Woche habe ich mich entschieden, das Programm neu zu schreiben, 
aber die Probleme sind geblieben... :(

Also, ich versuche die Werte über I2C zu lesen. Um es zu machen (mit den 
Library vom Fleury), habe ich folgende Funktion geschrieben:

/**
* Empfängt den eingegebenen Anzahl vom Bytes vom dem angegebenen 
I2C-Device/Register
*
* @param uint8_t addr        Die I2C-Device
* @param uint8_t nRegister   Der I2C-Register
* @param uint8_t nBytes      Der Anzahl der zu empfangenen Bytes
* @param uint8_t *values     Die empfangenen Bytes
*/
void readI2CRegister(uint8_t addr, uint8_t nRegister, uint8_t nBytes, 
uint8_t *values)
{
  uint8_t iRet = 0, i = 0, nRead = 0;

  if(i2c_start(addr + I2C_WRITE))
    return;
  if(i2c_write(nRegister))
    return;
  delayUS(50);
  iRet = i2c_rep_start(addr + I2C_READ);
  if(!iRet)
  {
    while(nRead < nBytes)
    {
      if(nRead == (nBytes - 1))
        i = i2c_readNak();
      else
        i = i2c_readAck();
      values[nRead++] = i;
    }
  }
  i2c_stop();
}

die ich wie folgendermaßen aufrufe:

readI2CRegister(COMPASSI2C, 2, 2, values);

wo COMPASSI2C die I2C-Adresse des Kompasses ist.
Ich lese die Werte, aber nach einer Weile (30 Sekunden bis eine Stunde, 
total zufällig!) das Programm hängt und hilft nur ein Reset...

Mit dem Debugger kann ich nur sehen, dass genau die I2C-Kommunikation 
das Problem verursacht, da der µC immer dort hängt.

Nun habe ich mich entschieden, euch zu fragen...

Ist meine Funktion readI2CRegister falsch?
Wenn nicht, hat jemand eine Ahnung, warum das Programm so spinnt?

Damals hatte ich auch ein kurzes Testprogramm für den Kompass probiert 
und hat funktioniert, jetzt finde ich es nicht mehr...
Aber ich denke, ich mache nix anderes als dieses Testprogramm (außer, 
dass das Testprogramm im Basic geschrieben ist, und mein Programm im C).

Ich bin für eure Hilfe wirklich dankbar!

Grüße
Luca Bertoncello

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.