- 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
    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?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    ach so, OK.
    Aber was wäre dann im Zweifelsfall, wenn du immer einmal pro loop alle I2C Geräte nacheinander durchpingst...
    Ach Mensch! Nun hab ich aber richtig in die Ka..e gegriffen! Was ähnliches als das, was du hier oben vorschlägst, hatte ich nämlich gerade schon selbst versucht und es ist gründlich schief gegangen!
    Nun hab ich wohl den Arduino zerschossen!
    Ich hatte versucht, in die Loop den normalen I2C-Scanner zu integrieren (nicht den Checker von Dir!).
    Dabei hab ich wohl im Code gründlich Mist gebaut. Es wurde aber kein Compilerfehler angezeigt. Nach dem Upload lief jedenfalls gar nichts mehr! Egal dachte ich, dann kommt eben erst mal der normale Code wieder drauf = DENKSTE! Geht nicht mehr!!
    Ich kann nun gar keinen Sketch mehr hochladen! Bekomme nur noch die berüchtigte Meldung:
    avrdude: stk500_recv(): Programmer is not responding
    avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xb8
    Wobei bei jedem Hochladeversuch die Hex-Adresse am Ende der Meldung eine andere ist. Und nein, ich habe nichts an den Einstellungen verändert. Scheint, als wenn der Arduino irgendwie das Hochladen blockiert.
    Also hab ich jetzt erst mal ein noch größeres, hausgemachtes Problem zu lösen.

    Gruß Uwe

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Kurzes Update:
    Den Arduino hatte ich wirklich getötet, er lässt sich nicht mehr programmieren. Gestern hab ich einen neuen eingebaut und der Hänger ist immer noch da! Inzwischen kann ich das "Aufhängen" auch provozieren: Beim Druck auf die Tasten "Scan-Up" oder "Scan-Down" hängt er sich nun sicher auf. Manchmal nicht beim ersten Druck aber beim 2. oder 3. passiert das sicher. Darüber hinaus hängt er auch immer wieder völlig ohne dass irgendwelche Aktionen von aussen passieren.
    Ich habe in den Code am Anfang der Loop den I2C-Check für beide (OLED und Radio) eingebaut. Der läuft ohne Beanstandungen bis zum Aufhängen durch, dann stoppt die Schleife einfach OHNE irgendeinen I2C-Fehler zu zeigen. Nur zum Test habe ich falsche I2C-Adressen eingegeben, die er sofort als Fehler anzeigt. Der Checker funktioniert also.
    Was ich auch nicht verstehe ist, warum der Watchdog nicht reagiert!? Ich hänge mal den kompletten Code in der letzten Variante hier ran. Im Moment warte ich auf zwei neue SI4703-Module aus China.
    Was anderes, als auch das Radio-Modul zu wechseln, fällt mir nicht mehr ein, oder gibt es von euch noch Ideen?

    P.S.
    Eben habe ich mal ALLES was zum OLED gehört aus dem Code auskommentiert. Ich dachte, das vielleicht einfach Radio und OLED sich nicht mögen. Hat aber auch nichts gebracht. Auch wenn das Display praktisch nicht existiert und keine Anzeigeroutinen laufen, hängt sich der Code auf!

    Code:
    #include <Arduino.h>
    #include <Wire.h>
    #include <radio.h>
    #include <si4703.h>
    #include "U8glib.h"
    #include <avr/wdt.h>                          // only needed for Watchdog
    
    #define FIX_BAND     RADIO_BAND_FM            // the band that will be tuned by this sketch is FM
    #define FIX_STATION  8760                     // station at start-up is 87.60 MHz
    #define FIX_VOLUME   1                        // volume level at start-up
    
    U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);  // define type of display (OLED 0.96" 128x64 pix)
    
    SI4703 radio;                                 // create an instance of Class for Si4703 Chip
    
    int volume = FIX_VOLUME;
    int button_1 = 3;                             // button volume up at Pin 3
    int button_2 = 4;                             // button volume down at Pin 4
    int button_3 = 5;                             // button station swap at Pin 5
    int button_4 = 6;                             // button scan up at Pin 6
    int button_5 = 7;                             // button scan down at Pin 7
    int buttonState_1 = 0;
    int buttonState_2 = 0;
    int buttonState_3 = 0;
    int buttonState_4 = 0;
    int buttonState_5 = 0;
    int flag = 0;                                 // used for decission to show "Station Name" or "scan mode"
    int stationNr = 0;
    int fmFreq[10] = {8760, 8820, 9100, 9350, 9500, 10030, 10080, 10280, 10330, 10480};
    char* fmName[10] = {"   NDR 1 MV", "   NDR Kultur", "   NDR 1 MV", "   NDR 2 MV", 
                       "     N-JOY", "Deutschlandfunk", "  Antenne MV", "   NDR Info", 
                        "Radio Paradiso", "  Ostseewelle"};
    
    unsigned long startMillis;                    // for timing display interval
    unsigned long currentMillis;                  // -||-
    const unsigned long period = 1000;            // display interval = 1 second
    
    char vol[2];
    float volts;
    char akku[4];
    
    long readVcc() 
      {
      long result;                                // read 1.1V reference against AVcc
      ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
      delay(2);                                   // wait for Vref to settle
      ADCSRA |= _BV(ADSC);                        // convert
      while (bit_is_set(ADCSRA,ADSC));
      result = ADCL;
      result |= ADCH<<8;
      result = 1126400L / result;                 // back-calculate AVcc in mV
      return result;
      }
    
    /******************************
     *           Setup            *
     *****************************/
    void setup() {
    
      wdt_enable(WDTO_1S);                        // enable Watchdog, set time to 1 second
      
      radio.init();                               // initialize radio 
    
      Wire.begin();
      Serial.begin(9600);
      
      startMillis = millis();                     // start timer for display interval
      
      radio.setBandFrequency(FIX_BAND, FIX_STATION);
      radio.setVolume(volume);
      radio.setMono(false);
      radio.setMute(false);
    
      pinMode(button_1, INPUT);                   // define button Pins
      pinMode(button_2, INPUT);                   // -||-
      pinMode(button_3, INPUT);                   // -||-
      pinMode(button_4, INPUT);                   // -||-
      pinMode(button_5, INPUT);                   // -||-
      digitalWrite(button_1, HIGH);               // button-Pin Pull-up
      digitalWrite(button_2, HIGH);               // -||-
      digitalWrite(button_3, HIGH);               // -||-
      digitalWrite(button_4, HIGH);               // -||-
      digitalWrite(button_5, HIGH);               // -||-
    } 
    
    /******************************
     * Subroutine Display on OLED *
     *****************************/
    void displayData()                           
      {
      volts = (float)readVcc()/(float)1000;       // read Vcc and divide by 1000
        
      char s[12];
      radio.formatFrequency(s, sizeof(s));        // format frequency value to output like: "87,60 MHz"
    
      // begin debugging I2C failure
      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); 
      }
      // end debugging I2C failure
    
        u8g.firstPage(); 
        do {
        u8g.drawFrame(0,0,128,64);                // display frame around screen
        u8g.setFont(u8g_font_timB14);
        u8g.drawStr(15, 22, s);
        u8g.setFont(u8g_font_unifont);
        if(flag==0)
          {
          u8g.drawStr(4, 44, fmName[stationNr]);  // if fequency from array, take name from array too
          }
        if(flag==1)
         {
          u8g.drawStr(25, 44, "scan mode");       // if frequency from scan, show "scan mode"
         }
    
        if(volts > 3.3)                           // if Vcc > 3.3V display "Volume" & "Volt"       
            {
            u8g.setFont(u8g_font_6x13);
            u8g.drawStr(6, 59,"Volume: ");                          
            sprintf (vol, "%d", volume);          // change int "volume" to char "vol"                 
            u8g.drawStr(50, 59, vol);
            u8g.drawStr(68, 59,"Bat:");
            dtostrf(volts, 2, 1, akku);           // change float "volts" to char "akku"  
            u8g.drawStr(94, 59,akku);
            u8g.drawStr(115, 59,"V");
            }
           else                                   // if VCC >= 3.3V display "CHARGE BATTERY"
           {
            u8g.drawStr(6, 59,"CHARGE BATTERY");
           }
          } 
         while( u8g.nextPage() );
      }
      
    /******************************
     *         Main Loop          *
     *****************************/
    void loop() 
      {
    
      // begin debugging I2C failure
      Serial.println("Test läuft:  ");
      int addr=0x10;                      // für SI4703
      Wire.beginTransmission(addr);       // transmit to device I2C addr
      int ioerr=Wire.endTransmission();
      if(ioerr) {                         // Ausgabe eines Fehlers samt i2c-addr. 
      Serial.println("für SI4703 print:");
      Serial.print("Fehler bei addr 0x"); 
      if (addr<16) { Serial.print("0"); }
      Serial.print(addr,HEX); 
      Serial.print(" ioerr=");  
      Serial.println(ioerr); 
      }
      
      addr=0x3c;                          // für OLED
      Wire.beginTransmission(addr);       // transmit to device I2C addr
      ioerr=Wire.endTransmission();
      if(ioerr) {                         // Ausgabe eines Fehlers samt i2c-addr. 
      Serial.println("für OLED print:");
      Serial.print("Fehler bei addr 0x"); 
      if (addr<16) { Serial.print("0"); }
      Serial.print(addr,HEX); 
      Serial.print(" ioerr=");  
      Serial.println(ioerr); 
      }
      // end debugging I2C failure
       
      buttonState_1 = digitalRead(button_1);
      buttonState_2 = digitalRead(button_2);
      buttonState_3 = digitalRead(button_3);
      buttonState_4 = digitalRead(button_4);
      buttonState_5 = digitalRead(button_5);
      
      if (buttonState_1 == LOW) 
        {
          volume ++;
          if (volume == 16) volume = 15;
          radio.setVolume(volume);
          delay(100);
          displayData();
         }     
      else if (buttonState_2 == LOW) 
        {
          volume --;
          if (volume < 0) volume = 0;
          radio.setVolume(volume);
          delay(100);
          displayData();
          }     
      else if (buttonState_3 == LOW)
        {
          stationNr ++;
          if (stationNr == 10) stationNr = 0;
          radio.setFrequency(fmFreq[stationNr]);
          flag = 0;
          delay(500);
          displayData();
          }    
      else if (buttonState_4 == LOW)
        {
          radio.seekUp();
          flag = 1;
          delay(500);
          displayData();
          }
      else if (buttonState_5 == LOW)
        {
          radio.seekDown();
          flag = 1;
          delay(500);
          displayData();
          }   
      else 
        {
          currentMillis = millis();                   // get the current "time" (number of milliseconds since the circle started)
          if (currentMillis - startMillis >= period)  // test whether the period has elapsed
            {
             displayData();                           // call display routine
             startMillis = currentMillis;             // save new start time for next display circle
             }
        }
      wdt_reset();                                    // reset Watchdog
     }
    Geändert von basteluwe (12.03.2018 um 10:41 Uhr)

  4. #4
    HaWe
    Gast
    ich sehe keinen richtigen offensichtlichen Fehler, allerdings kommt mir deine Button-press-Abfrage etwas kritisch vor, was sich u.U. ungünstig während der Laufzeit auswirken könnte:
    Denn du liest einen Buttondruck, ohne auf Loslassen zu warten:

    Code:
     if (buttonState_1 == LOW) 
        {
          volume ++;
          if (volume == 16) volume = 15;
          radio.setVolume(volume);
          delay(100);
          displayData();
         }     
      else if (buttonState_2 == LOW) 
        {
          volume --;
          if (volume < 0) volume = 0;
          radio.setVolume(volume);
          delay(100);
          displayData();
          }
    ich mache das bei mir in solchen Fällen so:
    Code:
    // digitalRead(buttonPin_1);        // button_pressed == LOW?
    if(!digitalRead(buttonPin_1) ) {   
       while(!digitalRead(buttonPin_1) )  // wait for button_up == HIGH
          {delay(10);}   
       //  volume ++;
       //...usw...
    }
    
    // digitalRead(buttonPin_2);        // button_pressed == LOW?
    if(!digitalRead(buttonPin_2) ) {    
       while(!digitalRead(buttonPin_2) )  // wait for button_up == HIGH
          {delay(10);}
       //  volume --;
       //...usw...
    }
    vlt wäre das ja mal einen Versuch wert....
    Geändert von HaWe (12.03.2018 um 11:40 Uhr) Grund: comments

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    Denn du liest einen Buttondruck, ohne auf Loslassen zu warten
    Das ist richtig. Danke für den Hinweis. Das kannte ich so noch nicht, probiere es gleich aus.

    Gruß Uwe

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Nach längerer Zeit (andere Projekte) mal ein kurzes Update:
    Ich habe einen Neuaufbau vorgenommen und auch neue Module zur Verfügung. Inzwischen vermute ich die Fehlerursache direkt in den Si4703 Modulen. Die Software als Ursache sehe ich im Moment nicht. Beide verfügbaren Module zeigen das gleiche Verhalten. Ich habe die Stromaufnahme der Schaltung und der einzelnen Module gemessen. Bei normaler Funktion ist der Gesamtstrom 32 mA. Wenn der Hänger passiert, geht der Strom auf 16 mA zurück. Der Hänger betrifft offensichtlich zuerst (oder nur) das Radiomodul, erst danach friert u.U. auch der Arduino ein (nicht immer). Das vermute ich, weil dann die Stromaufnahme des Si4703 von normal 17 mA auf 2 mA runter geht.

    Zum Auslöser des Problems:
    Ich kann inzwischen den Stop selber auslösen und zwar durch Berühren verschiedener Kontaktpunkte (besonders VCC oder auch GND) mit metallischen Gegenständen (Pinzette, Schraubendreher). Antippen der metallischen USB-Buche löst das schon aus. Spätestens beim zweiten oder dritten Antasten hängt er! Durch Druck auf Reset am Arduino lässt er sich meist wieder starten. Eine Watchdog-Routine im Program springt NICHT an! Die Programmschleife hängt also wohl nicht!
    Eher selten stoppt er auch ohne direkte Berührung aber bei heftigen Bewegungen unmittelbar über der Schaltung. Das sieht für mich irgendwie nach statischen Problemen (Erdung o.ä.) aus.
    Zusätzliche Kapazitäten (100nF + 100uF) direkt an VSS & GND des Si4703 haben nichts gebracht.

    Irgendwelche Ideen? Bitte!!!

    Gruß Uwe

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.191
    Eventuell bringen Dioden mit geringer Kapazität am Antenneneingang etwas?!
    Scheint ja irgendwie ein Problem mit Statischer Aufladung zu sein.

Ä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
  •  

LiFePO4 Speicher Test