- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 33

Thema: FM-Radio mit Arduino Pro Mini und Si4703 - Programm hängt sich auf!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    daher pinge doch mal deine geräte kurz vorher an, wie ich oben beschrieben habe, bevor du sie ausliest und Daten schreibst, nur so wirst du wissen, wo und wann etwas nicht richtig funktioniert.
    Das "Anpingen" würde ich ja gern probieren, nur wie macht man das? Unwissenheit kann nerven, ich weiß!
    Gibt es einen Befehl in der Wire-Library (keinen gefunden), oder muß man das jeweils handisch coden, ähnlich wie im I2C-Scanner Code?

    Gruß Uwe

  2. #2
    HaWe
    Gast
    Zitat Zitat von basteluwe Beitrag anzeigen
    Das "Anpingen" würde ich ja gern probieren, nur wie macht man das? Unwissenheit kann nerven, ich weiß!
    Gibt es einen Befehl in der Wire-Library (keinen gefunden), oder muß man das jeweils handisch coden, ähnlich wie im I2C-Scanner Code?

    Gruß Uwe
    habe ich doch oben geschrieben!

    vor jedem einzelnen Geräte-Zugriff (Radio, OLED, was auch immer) IMMER zwischendurch diesen Code einfügen:
    Code:
    Wire.beginTransmission(addr); // transmit to device I2C addr
    int ioerr=Wire.endTransmission();
    if(ioerr) {   // Ausgabe eines Fehlers samt i2c-addr. 
      Serial.print("Fehler bei addr 0x"); 
      if (addr<16) { Serial.print("0"); }
      Serial.print(addr,HEX); 
      Serial.print(" ioerr=");  
      Serial.println(ioerr); 
    }
    am besten sogar noch mit Debug-Zusätzen wie
    Serial.println("vor Lautstärke:");
    ...
    Serial.println("vor Sender:");
    ...
    Serial.println("vor RDS:");
    ...
    Serial.println("vor OLED print:");
    ...
    usw usf

    Für addr musst du ntl dort jeweils die exakte i2c-Geräteadresse einsetzen (z.B. wenn OLED die Adresse 0x3c hat, dann jeweils vor OLED-Zugriff):
    Code:
    int addr=0x3c; // für OLED
    Wire.beginTransmission(addr); // transmit to device I2C addr
    int ioerr=Wire.endTransmission();
    if(ioerr) {   // Ausgabe eines Fehlers samt i2c-addr. 
      Serial.println("vor OLED print:");
      Serial.print("Fehler bei addr 0x"); 
      if (addr<16) { Serial.print("0"); }
      Serial.print(addr,HEX); 
      Serial.print(" ioerr=");  
      Serial.println(ioerr); 
    }

    PS:
    für diesen Code-Block kannst du ntl auch eine eigene Debug-Funktion spendieren
    Code:
    void i2c_debug(int addr, char * message) {
      Wire.beginTransmission(addr); // transmit to device I2C addr
      int ioerr=Wire.endTransmission();
      if(ioerr) {   // Ausgabe eines Fehlers samt i2c-addr. 
         Serial.println(message);
         Serial.print("Fehler bei addr 0x"); 
         if (addr<16) { Serial.print("0"); }
         Serial.print(addr,HEX); 
         Serial.print(" ioerr=");  
         Serial.println(ioerr); 
      }
    }
    Aufruf dieser Funktion ist dann ja wohl trivial
    Geändert von HaWe (18.02.2018 um 10:41 Uhr)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    habe ich doch oben geschrieben!
    Mist! Wer lesen kann hat tatsächlich Vorteile!
    Tut mir leid, das hab ich im ganzen Frust irgendwie ausgeblendet, werde ich aber natürlich nun versuchen.

    Seit ich die Anzeigeroutine aus der main-loop nur noch alle 5 Sekunden aufrufe oder auch nach Änderungen durch Tastendruck, hat das Script sich bisher noch nicht wieder aufgehängt!
    Ist aber sicher noch zu früh, sich zu freuen.

    Gruß und einen schönen Restsonntag,
    Uwe

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von basteluwe Beitrag anzeigen
    Ist aber sicher noch zu früh, sich zu freuen.
    Wenn man es beschreit!!!
    Na klar blockiert er immer noch! Subjektiv ist es zwar seltener geworden aber er spinnt nach wie vor von Zeit zu Zeit.
    Den I2C-check hab ich jetzt wie vorgeschlagen eingebaut aber auch der hat nichts angezeigt. Der Hänger passiert ja immer aus heiterem Himmel OHNE irgendwelche Interaktion. Am I2C zum Si4703 bringt der wahrscheinlich in der Form sowieso nichts, der Bus wird dort aktuell nur zum Schreiben benutzt. Das heisst, beim Tastendruck wird zwar Volume oder Frequenz geändert. Ich lese aber vom Radio-Chip nichts aus! Also passiert dort I2C-mäßig nichts, wenn keine Taste gedrückt wird, richtig? Deshalb zeigt der Checker dort auch keinen Fehler.
    Auch am Beginn der OLED-Printfunktion habe ich den I2C-Checker drin, ohne Erfolg! Keine Fehlermeldung trotz Hänger!

    Langsam fange ich an, an einen Hardware-Bug des Si4703 zu glauben. Komisch ist nämlich, das der Hänger mehrfach aufgetreten ist, wenn ich mich in der unmittelbaren Nähe des Geräts bewegt habe. Andererseits lässt sich auch DAS nicht reproduzieren. Vielleicht bestelle ich mir doch noch einen Ersatz und tausche noch mal.

    Gruß Uwe

  5. #5
    HaWe
    Gast
    am i2c-check siehst du genau, welcher Zugriff als letzter noch korrekt funktioniert hat und wann ggf. danach ein fehlerhafter Zugriff passiert ist.
    Der serielle Monitor muss ntl dabei auch immer ständig mitlaufen, aber das wird ja wohl klar sein

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    am i2c-check siehst du genau, welcher Zugriff als letzter noch korrekt funktioniert hat und wann ggf. danach ein fehlerhafter Zugriff passiert ist.
    Genau DAS funktioniert so nicht!
    Ich erklärs nochmal am Beispiel des Si4703 (den OLED lass ich jetzt mal aussen vor):
    Der I2C zugriff erfolgt NUR wenn ich eine Taste drücke. Und auch nur dann wird der I2C gecheckt. Das Aufhängen tritt aber nie beim Tastendruck auf, sondern IMMER wenn das Ding eigentlich nur einfach so vor sich hin spielt. Genau dann läuft aber ja der Checker NICHT!
    Also wird auch nichts angezeigt.
    Der Serielle Monitor läuft natürlich immer mit!

    Gruß Uwe

  7. #7
    HaWe
    Gast
    ach so, OK.
    Läuft denn auch kein OLED und nichts anderes auf dem I2C Bus?
    wie könnte ansonsten der I2C Bus blockieren, wenn niemand drauf ist?
    Aber was wäre dann im Zweifelsfall, wenn du immer einmal pro loop alle I2C Geräte nacheinander durchpingst, egal ob eine Taste gedrückt wurde?
    Oder ist es gar nicht der Bus, der blockiert?

Ähnliche Themen

  1. Unit 1.2 hängt sich auf
    Von Billy51 im Forum Open Source Software Projekte
    Antworten: 0
    Letzter Beitrag: 06.03.2011, 12:52
  2. Timer hängt sich auf?
    Von Ineedhelp im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 22.08.2008, 16:49
  3. Programm hängt sich auf
    Von martin66119 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 07.10.2007, 21:06
  4. LCD hängt sich auf
    Von hotijack im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 30.05.2007, 16:47
  5. Lade Programm geht nicht (hängt sich auf)
    Von REX im Forum Robby CCRP5
    Antworten: 1
    Letzter Beitrag: 11.09.2004, 04:19

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen