- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Arduino Pro Micro - Treiber Problem, oder was sonst?

  1. #11
    HaWe
    Gast
    Anzeige

    E-Bike
    Zitat Zitat von basteluwe Beitrag anzeigen
    Na gut, für das "sauber programmieren" leg ich besser nicht meine Hand in's Feuer. Ich bin ja eher so der "Cut & Paste"-Programmierer. Das fragliche Programm läuft zwar mit Arduino Pro Mini in zwei Versionen bisher problemlos. Trotzdem passierte beim Micro diese Pleite
    Ich habe einige wenige "char"-Befehle drin und schreibe zwei Variablen in den EEPROM.
    Hier ist das komplette Programm:
    Code:
    /*********************************************************************
     * FM-Radio mit RDA5708M, Leonardo Pro Micro 3.3V und OLED 64x32     *
     * Steuerung über vier Drucktaster:                                  *
     *    button 1 - volume down                                         *
     *    button 2 - volume up                                           *
     *    button 3 - scan frequency down                                 *
     *    button 4 - scan frequency up                                   *
     * Das OLED-display zeigt drei Zeilen:                               *
     *  1- "Empfangsfrequenz"                                            *
     *  2- "RDS Daten" wenn vorhanden, falls nicht dann "No RDS          *
     *  3- "Volume: 0-15"                                                *
     * Die Empfangsfrequenz und der Wert für Volume wird im EEPROM       *
     * gespeichert, so dass bei jedem Neustart die alten Werte gelten.   *
     *                                                                   *
     * U.Galepp April 2020                                               *
     ********************************************************************/
    
    #include <Arduino.h>
    #include <Wire.h>                                       // für I2C
    #include <radio.h>                                      // für allgemeine Radio-Befehle
    #include <RDA5807M.h>                                   // für spezifische RDA5807 Details
    #include <RDSParser.h>                                  // für RDS Daten Verarbeitung
    #include <EEPROM.h>                                     // für Datenspeicherung wenn Aus
    #include "er_oled.h"                                    // für spezielles OLED
    
    #define FIX_BAND     RADIO_BAND_FM                      // ausgewähltes Band ist FM
    
    RDA5807M radio;                                         // create an instance of class for RDA5807M chip
    
    RDSParser rds;                                          // get RDS parser
    
    int button_1 = 4;                                       // Taster für volume down an D4
    int button_2 = 5;                                       // Taster für volume up an D5
    int button_3 = 6;                                       // Taster für scan down an D6
    int button_4 = 7;                                       // Taster für scan up an D7
    int buttonState_1 = 0;
    int buttonState_2 = 0;
    int buttonState_3 = 0;
    int buttonState_4 = 0;
    
    int volume;                                             // integer Variable für Lautstärke
    int roll = 64;                                          // integer Variable für Laufschrift RDS
    int frequency;                                          // integer Variable für Frequenz
    byte storeVol;                                          // Speichervariable "Volume" für EEPROM
    byte storeFreq;                                         // Speichervariable "Frequenz" für EEPROM
    char vol[2];                                            // Zeichenkette Variable für Lautstärke (0-15)
    char* info;                                             // Zeichenkette Variable für RDS-Info
    unsigned long previousMillis = 0;                       // Laufvariable für Zeitmessung EPROM-Speicher
    uint8_t oled_buf[WIDTH * HEIGHT / 8];                   // Dimension für OLED Puffer
    
    /*** setup ***/
    void setup()
      {
      Serial.begin(57600);                                  // Start seriellen Terminal für Debugging
      er_oled_begin();                                      // OLED starten  
      radio.init();                                         // Radio initialisieren
      radio.setBand(FIX_BAND);                              // Radio auf ausgewähltes Band (FM) setzen
      storeFreq = EEPROM.read(0);                           // Speicherwert für Frequenz aus EEPROM holen
      frequency = (storeFreq + 825)*10;                     // Frequenzwert zu int für Radio-Chip wandeln
      radio.setFrequency(frequency);                        // Radio auf gespeicherte Frequenz setzen
      storeVol = EEPROM.read(1);                            // Speicherwert für Volume (byte) aus EEPROM holen
      volume = storeVol;                                    // byte zu int (volume) wandeln
      radio.setVolume(volume);                              // Radio auf gespeicherte Lautstärke setzen
    
      radio.attachReceiveRDS(RDS_process);                  // setup the information chain for RDS data.
      rds.attachServicenNameCallback(ServiceName);
    
      pinMode(button_1, INPUT);                             // Taster-Pins als Eingang definieren
      pinMode(button_2, INPUT);                             // -||-
      pinMode(button_3, INPUT);                             // -||-
      pinMode(button_4, INPUT);                             // -||-
      digitalWrite(button_1, HIGH);                         // Pull-Up Widerstände aktivieren
      digitalWrite(button_2, HIGH);                         // -||-
      digitalWrite(button_3, HIGH);                         // -||-
      digitalWrite(button_4, HIGH);                         // -||-
      }
    
    void ServiceName(char *name)
      { info = name; }
    
    void RDS_process(uint16_t block1, uint16_t block2, uint16_t block3, uint16_t block4)
      { rds.processData(block1, block2, block3, block4); }
    
    
    void loop() 
      {
    
    // alle 15 Sekunden Abfrage ob Volume oder Frequenz reändert? Wenn ja, dann in EPROM schreiben!
       if (millis() - previousMillis > 15000){              // Sind 15 Sekunden um?
        previousMillis = millis();                          // Zeit zurücksetzen
        frequency = (radio.getFrequency());                 // Frequenz aus Radio auslesen (int)
        storeFreq = (frequency/10)-825;                     // Frequenz (int) in Speicherwert storeFreq (byte) umrechnen
        volume = radio.getVolume();                         // Volume aus Radio auslesen (int)
        storeVol = volume;                                  // Volume (int) in Speicherwert storeVol (byte) umwandeln
        EEPROM.update(1, storeVol);                         // falls neuer Speicherwert von altem abweicht, dann update EEPROM
        EEPROM.update(0, storeFreq);                        // falls neuer Speicherwert von altem abweicht, dann update EEPROM
        }
    
    // Tastenabfrage für Lautstärke und Frequenzänderung
       if(!digitalRead(button_1) ) {                        // wenn Taster 1 gedrückt, Volume einen Schritt runter
        while(!digitalRead(button_1) )                      // warten auf Taster loslassen == HIGH
          {delay(10);}
          volume --;
          if (volume < 0) volume = 0;
          radio.setVolume(volume);
          }
    
       if(!digitalRead(button_2) ) {                        // wenn Taster 2 gedrückt, Volume einen Schritt hoch
        while(!digitalRead(button_2) )                      // warten auf Taster loslassen == HIGH
          {delay(10);}
          volume ++;
          if (volume >15) volume = 15;
          radio.setVolume(volume);
          }
    
       if(!digitalRead(button_3) ) {                        // wenn Taster 3 gedrückt, abwärts scannen   
        while(!digitalRead(button_3) )                      // warten auf Taster loslassen == HIGH
          {delay(10);}
          radio.seekDown();
          info = "";                                        // RDS-Info löschen
          delay(100);
          }
    
       if(!digitalRead(button_4) ) {                        // wenn Taster 4 gedrückt, aufwärts scannen   
        while(!digitalRead(button_4) )                      // warten auf Taster loslassen == HIGH
          {delay(10);}
          radio.seekUp();
          info = "";                                        // RDS-Info löschen
          delay(100);
          }
    
    // OLED-Ausgabe der Daten
       char s[12];                                          // Formatierung der Frequenzangabe
       radio.formatFrequency(s, sizeof(s));                 // -||-
    
       er_oled_clear(oled_buf);                             // OLED Puffer löschen (Anzeige leeren)
    
       radio.checkRDS();                                    // RDS Daten abrufen
    
       if (roll == 0)roll = 64;                             // wenn Laufschrift-Position ganz links, setze wieder auf rechts
    
        if(info == "")                                      // Wenn keine RDS-Info gefunden...
         { 
         er_oled_string(roll, 11, "No RDS", 12, 1, oled_buf); // ...zeige "No RDS"
          }
          else                                              // ansonsten... 
           {
           er_oled_string(roll, 11, info, 12, 1, oled_buf); // ...zeige RDS-Info
            }
        roll --;                                            // setze RDS-Position einen Pixel nach links
    
        er_oled_string(0, 0, s, 12, 1, oled_buf);           // schreibe Frequenz in erste Zeile OLED Puffer
        er_oled_string(6, 22, "Volume: ", 12, 1, oled_buf); // schreibe Zeichenkette "Volume:" in dritte Zeile OLED Puffer
        sprintf (vol, "%d", volume);                        // Umwandlung int "volume" zu char "vol"
        er_oled_string(49, 22, vol, 12, 1, oled_buf);       // schreibe Zeichenkette vol in dritte Zeile OLED Puffer
        er_oled_display(oled_buf);                          // gesammten Puffer im OLED darstellen
    
        // Ausgabe der Werte für Debugging (Terminal)
        Serial.print(" Frequenz: ");
        Serial.print(frequency);                            // Ausgabe der Frequenz
        Serial.print("   Volume: ");
        Serial.print(volume);                               // Ausgabe der Lautstärke
        Serial.print("   RDS Daten: ");
        Serial.println(info);                               // Ausgabe der RDS-Info
        Serial.print("V  ");
    
      } // End
    Wenn ihr da drinn einen Bug findet, der den USB killed, wäre ich sehr dankbar.
    Schönes Wochenende!
    was mir als erstes auffiel:
    die Zeile
    char* info;
    alloziert dafür keinen Speicherbereich, du schreibst also Daten ggf irgendwohin ins Speicher-Nirwana - richtiger wäre etwas in der Art wie
    char info[30];

    auch die Zeilen
    void ServiceName(char *name)
    { info = name; }
    tun nicht, was sie wschl sollen, denn man kann einem char* oder char[] cstring nicht mit "=" einen char array (einen anderen cstring) zuweisen (außer eine Konstante direkt beim Definieren);
    tatsächlich weist du hier nur einem Pointer auf eine Speicheradresse einen anderen Pointer auf eine andere Speicheradresse zu
    - richtiger wäre hier
    strcpy(info, name); // besser noch: strncpy verwenden!

    PS,
    auch Zeilen wie
    info = "";
    oder
    if(info == "")
    sind aus ähnlichen Gründen syntaktisch nicht korrekt ( das geht mit C++ String und std::string, aber nicht mit ANSI C cstring (char[] arrays).

    PPS
    wie ServiceName() funktionieren soll (zB. in rds.attachServicenNameCallback(ServiceName) ) verstehe ich allerdings auch nicht, denn du es hast es ja als void definiert, und ich sehe nicht, wo du an ServiceName() überhaupt eine cstring-Variable als Parameter übergibst.

    Ob so etwas insgesamt die FW aushebeln kann, kann ich ntl nicht sagen.
    Geändert von HaWe (26.04.2020 um 15:09 Uhr) Grund: PPS

  2. #12
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    die Zeile
    char* info;
    alloziert dafür keinen Speicherbereich, du schreibst also Daten ggf irgendwohin ins Speicher-Nirwana - richtiger wäre etwas in der Art wie
    char info[30];
    "info" ist der String für die RDS-Information, deren Länge unbekannt/variabel ist. Darum hab ich hier char* verwendet statt einer definierten Länge. Die Idee hatte ich von hier: https://www.geeksforgeeks.org/char-v...ing-vs-char-c/

    Zitat Zitat von HaWe Beitrag anzeigen
    auch die Zeilen
    void ServiceName(char *name)
    { info = name; }
    tun nicht, was sie wschl sollen, denn man kann einem char* oder char[] cstring nicht mit "=" einen char array (z.B. einen anderen cstring) zuweisen
    (außer eine Konstante direkt beim Definieren; tatsächlich weist du hier nur einem Pointer auf eine Speicheradresse einen anderen Pointer auf eine andere Speicheradresse zu)
    - richtiger wäre hier
    strcpy(info, name); // besser noch: strncpy verwenden!
    Liest sich logisch für mich und hab ich gerade ausprobiert:
    Code:
    void ServiceName(char *name)
      //{ info = name; }
      { strcpy(info, name);}
    Leider ist dann die RDS-Anzeige leer. Mit {info = name;} läuft es problemlos!?

    Zitat Zitat von HaWe Beitrag anzeigen
    PS,
    auch Zeilen wie
    info = "";
    odert
    if(info == "")
    sind aus ähnlichen Gründen syntaktisch nicht korrekt ( das geht mit C++ String und std::string, aber nicht mit ANSI C cstring (char[] arrays).
    OK, schau ich mir als Nächstes an.

    Zitat Zitat von HaWe Beitrag anzeigen
    PPS
    wie ServiceName() funktionieren soll (zB. in rds.attachServicenNameCallback(ServiceName) ) verstehe ich allerdings auch nicht, denn du es hast es ja als void definiert, und ich sehe nicht, wo du an ServiceName() überhaupt eine cstring-Variable als Parameter übergibst.
    Das kommt aus der verwendeten Library "radio.h". Ich habe die Code-Schnipsel aus dem in der Library enthaltenen Beispiel-Code "SerialRadio.ino" Zeile 177/178 entnommen.

  3. #13
    HaWe
    Gast
    das mit ausschließlich char* wird trotzdem nicht klappen, und im Originalbeispiel wird ja auch mit einem const string initialisiert, wodurch Speicher reserviert wird (so lang wie der string plus \0):

    char* str = "This is GeeksForGeeks";

    dies entspricht in etwa
    char str[22];
    strcpy(str, "This is GeeksForGeeks\0");

    ohne dies musst du mem allozieren, sonst schreibst du ins Nirwana.

    Bei deinem Code funktioniert es (scheinbar) trotzdem, weil du hier Pointer auf Speicheradressen einander zuweist und keine kompletten arrays kopierst. Das geht, würde ich aber nicht so machen, weil es gefährlich sein kann, sobald du andere "echte" cstrings kopierst. Schlimmstenfalls zerschießt du dir damit deine FW, und das ist genau die Art von Fehlern, die ich hier angesprochen habe: https://www.roboternetz.de/community...l=1#post659541

    Dennoch bleibt für mich völlig unklar, wann und wo du in deinem Code die Funktion
    void ServiceName(char *name)
    irgendwo überhaupt jemals mit einem cstring als Argument aufrufst...?
    Geändert von HaWe (26.04.2020 um 17:32 Uhr)

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von HaWe Beitrag anzeigen
    Bei deinem Code funktioniert es (scheinbar) trotzdem, weil du hier Pointer auf Speicheradressen einander zuweist und keine kompletten arrays kopierst. Das geht, würde ich aber nicht so machen, weil es gefährlich sein kann, sobald du andere "echte" cstrings kopierst. Schlimmstenfalls zerschießt du dir damit deine FW, und das ist genau die Art von Fehlern, die ich hier angesprochen habe: https://www.roboternetz.de/community...l=1#post659541
    OK, Danke! Ich ändere das dann mal

  5. #15
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Kurzes Update zum eigentlichen USB-Problem:
    Gestern kam das nachbestellte Ersatz-Board an und das ließ sich problemlos programmieren.
    Die beiden Pro-Micros sind allerdings NICHT baugleich!
    Hier der erste (der beim Programmieren gestorben ist):
    Klicke auf die Grafik für eine größere Ansicht

Name:	pro-micro-1.JPG
Hits:	4
Größe:	56,2 KB
ID:	34961
    Er wurde wie folgt beschrieben:
    "Dieser Pro Micro ist sowohl 3,3V, als auch 5V kompatibel (3,3V = J1 offen; 5V = J1 geschlossen)"
    Die Beschreibung war für mich irreführend! Das Bard hat keinen 3,3V Regler. Die Kompatibilität für 3,3V besteht nur darin, dass man das Board schon mit 3,3V von aussen speist. Für mich wäre das sowieso unbrauchbar gewesen.

    Das neue Board ist dieses:
    Klicke auf die Grafik für eine größere Ansicht

Name:	pro-micro-2.JPG
Hits:	3
Größe:	60,5 KB
ID:	34963
    Es wird wie folgt beschrieben:
    "Pro Micro Arduino komp. ATMEGA Board - 3.3V Volt VERSION"
    Interessant ist, dass beide Boards sich beim ersten Anstecken verschieden im Gerätemanager meldeten: Das erste wurde als Arduino Pro Micro erkannt, das Neue meldete sich als Arduino Lilypad.
    Auf jeden Fall lässt sich das neue Board problemlos programmieren.

    PS.
    Damit ist dann auch klar, dass die Ermordung des USB beim ersten Board NICHT am hoch geladenen User-Code lag.
    Geändert von basteluwe (27.04.2020 um 17:33 Uhr) Grund: PS

  6. #16
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.208
    Hm, interessante Sache....möglicherweise hast du den dann gegrillt, indem du über USB 5V reingespeist hast?
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  7. #17
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Hm, interessante Sache....möglicherweise hast du den dann gegrillt, indem du über USB 5V reingespeist hast?
    Möglich, werde ich aber wohl nie aufklären können.
    Gestorben ist der USB auf jeden Fall beim Programmieren oder als Ergebnis dessen. Und dabei hing das Board allein, ohne jede Beschaltung nur am USB-Port des Rechners.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Arduino Leonardo/Micro Frage
    Von Andi#87 im Forum Arduino -Plattform
    Antworten: 22
    Letzter Beitrag: 26.01.2019, 13:58
  2. Arduino Due + Treiber + Schrittmotor PROBLEM
    Von stevie3354 im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 31.01.2014, 00:11
  3. Blue Earth Micro-485 oder Micro-440
    Von Mandi Nice im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 02.11.2008, 08:26
  4. Fehler des Compilers? / LIB? oder sonst was.
    Von raptor_79 im Forum Asuro
    Antworten: 11
    Letzter Beitrag: 15.01.2008, 01:20
  5. Problem was sonst (neues RNBFRA) i2c funktioniert nicht
    Von paladin im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 1
    Letzter Beitrag: 17.12.2005, 16:38

Berechtigungen

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

12V Akku bauen