- Akku Tests und Balkonkraftwerk Speicher         
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 wkrug Beitrag anzeigen
    Die Pullups für I²C gehören natürlich auch mit rein.
    Wenn mit den Pullups externe Widerstände an A4 und A5 (SDA & SCL) des Arduino gemeint sind, dann gibt es die bisher bei mir nicht! Die Schaltung im ersten Post zeigt die aktuelle Situation.
    Ich lese, daß bei 5V Vcc 4,7k als Pullup OK sind. Ich habe ja aber nur die 3,3V Version. Dann sollte wohl 3,3kOhm besser sein, oder?


    Gruß Uwe

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    .. externe Widerstände an A4 und A5 (SDA & SCL) .. gibt es die bisher bei mir nicht .. bei 5V Vcc 4,7k .. die 3,3V Version .. 3,3kOhm besser sein, oder ..
    Wie fast immer hilft ein passendes Datenblatt. Beispielsweise dies hier, auf Seite 42. Anmerkung: ich habe bei 1,5 m (ein + einhalb Meter) Leitungslänge zu vier Slaves sogar 1,1 kΩ. Ausserdem hilft auch ein Oszilloskop und die kritische Betrachtung der Peaks - oder Nicht-Peaks *gg* bei der jeweils eingestellten Übertragungsrate (kann man die I²C-Frequenz bei arduion denn überhaupt festlegen?).
    Geändert von oberallgeier (14.02.2018 um 18:04 Uhr) Grund: Oh weh, Volt mit Kiloohm verwechselt :-/
    Ciao sagt der JoeamBerg

  3. #3
    HaWe
    Gast
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Wie fast immer hilft ein passendes Datenblatt. Beispielsweise dies hier, auf Seite 42. Anmerkung: ich habe bei 1,5 m (ein + einhalb Meter) Leitungslänge zu vier Slaves sogar 1,1 kΩ. Ausserdem hilft auch ein Oszilloskop und die kritische Betrachtung der Peaks - oder Nicht-Peaks *gg* bei der jeweils eingestellten Übertragungsrate (kann man die I²C-Frequenz bei arduion denn überhaupt festlegen?).
    Die Arduinos funktionieren im Allgemeinen perfekt mit Pullups zwischen 1,4k bis 10kOhm.
    Der ArduinoMega (5V) hat z.B. 10k Pullups fest eingebaut, der Arduino Due (3.3V) 1,47 k; beide funktionieren für I2C clock von 100kHz bis 1MHz
    Zum Vergleich:
    Der Raspberry Pi (3.3V) hat fest eingebaute Pullups von 1.8k, ebenfalls für I2C clock von 100kHz bis 1MHz (ggf. sogar noch schneller, nicht getestet)

    2.2k bis 4.7k sind also sicher immer ein guter Mittelwert.

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Danke für eure Antworten soweit.
    Ich habe jetzt nacheinander zwei Dinge getan:
    zuerst habe ich den Watchdog aktiviert (hoffentlich richtig?):
    • #include <avr/wdt.h> (ganz oben im Code)
    • wdt_enable(WDTO_1S); (im Setup)
    • wdt_reset(); (als letztes in der Hauptschleife)

    Trotzdem ist der Fehler wieder aufgetreten, ohne das der Watchdog reagiert hätte. Es hat also keinen Reset vom Watchdog gegeben. Das Ding friert einfach ein und gut ist.

    Danach hab ich 1,8k Pullups am I2C eingelötet. Leider hat auch das den Fehler nicht beseitigt! Auch danach ist er schon wieder 1x hängen geblieben!
    Ich bin also wieder am Anfang!

    Wat nu???

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.236
    Dann würd ich mal sagen, blockiert einer der Chips den I²C bus.
    Oder ein Chip selber hängt sich auf.
    Da war mal hier ein Threat drin, bei dem das gleiche passiert ist.
    Schau mal im aufgehangenen Zustand, welche Pegel am I²C Bus anliegen.
    Die Lösung war, wenn ich richtig bin, 8 bzw. 9 Clock Impulse auf SCL zu legen, aber lies Sicherheitshalber noch mal nach.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von wkrug Beitrag anzeigen
    Die Lösung war, wenn ich richtig bin, 8 bzw. 9 Clock Impulse auf SCL zu legen, aber lies Sicherheitshalber noch mal nach.
    Danke dafür! Ich habe mal gesucht und diesen Threat gefunden. Ich glaube, ich verstehe was die Jungs sagen. Leider ist das aber programmiertechnisch nicht wirklich in meiner Liga (C geht bei mir nur sehr mäßig, ich mach eher in Arduino).
    Frage 1: sollten diese 9 Clock Impulse nur gesendet werden, wenn sich was aufhängt oder regelmäßig (wann)?
    Frage 2: wie kriege ich das im Arduino-Sketch implementiert?

    Gruß Uwe

  7. #7
    HaWe
    Gast
    ich finde bare-metal-C-Tipps zu Arduino C++ Klassen wie Wire auch nicht so hilfreich, denn gerade die Wire Class ist bereits hoch optimiert.
    Eventuell reicht es, wenn du ab und zu einfach mal deine i2c-Devices "anpingst" , um zu sehen, ob ein Fehler zurückgegeben wird, und danach erst (wenn kein Fehler) deine Device-Lese-Schreib-Funktionen aufrufst:

    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); 
    }
    So kannst du checken, wie oft hier überhaupt wo was schief läuft.

    Aber mal eine ganz andere Frage :
    Wo in deinem Sketch (void setup() ) startest du denn überhaupt Wire mit Wire.begin() - irgendwie sehe ich es nicht....?
    Code:
    /**************************************************************************
     * This code is a modification/extract of several example-codes that come *
     * with different si4703-libraries. Libraries used are fetched from:      *
     *         http://www.mathertel.de/Arduino/RadioLibrary.aspx              *
     * Not sure if other libraries work with same code.                       *
     * 5 push-buttons control the radio (see comments in code)                *
     * OLED-display shows 3 lines:                                            *
     *  1- "frequency"                                                        *
     *  2- "station name" or "scan mode"                                      *
     *  3- "volume level" + "battery voltage" or "CHARGE BATTERY"             *
     * Code for voltage monitoring is fetched from:                           *
     * https://code.google.com/archive/p/ti...Voltmeter.wiki  *
     *                                                                        *
     * U.Galepp Jan./2018                                                     *
     **************************************************************************/
    
    #include <Arduino.h>
    #include <Wire.h>
    #include <radio.h>
    #include <si4703.h>
    #include "U8glib.h"
    
    U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);  // define type of display (OLED 0.96" 128x64 pix)
    
    #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
    
    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"};
    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() {
    
      radio.init();                               // initialize radio 
      
      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"
    
        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() 
      {
      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);
         } 
         
      else if (buttonState_2 == LOW) 
        {
          volume --;
          if (volume < 0) volume = 0;
          radio.setVolume(volume);
          delay(100);
          } 
          
      else if (buttonState_3 == LOW)
        {
          stationNr ++;
          if (stationNr == 10) stationNr = 0;
          radio.setFrequency(fmFreq[stationNr]);
          flag = 0;
          delay(500);
          }
          
      else if (buttonState_4 == LOW)
        {
          radio.seekUp();
          flag = 1;
          delay(500);
          }
    
      else if (buttonState_5 == LOW)
        {
          radio.seekDown();
          flag = 1;
          delay(500);
          }   
      else displayData();
     }
    Geändert von HaWe (17.02.2018 um 12:06 Uhr) Grund: code verschönert

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

Labornetzteil AliExpress