PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Pro Micro - Treiber Problem, oder was sonst?



basteluwe
23.04.2020, 10:11
Hallo Gemeinde,
ich habe gestern versucht einen neuen Pro Micro zu programmieren. Es ist kein Original sondern ein billiger Clone aus Fernost.

Beim ersten Anstecken am USB wurde er im Gerätemanager korrekt als "Pro Micro" an COM9 erkannt.
In der IDE konnte ich das Board "Pro Micro" und die COM9 problemlos auswählen. Kompilieren ging ohne Fehlermeldung und Hochladen schien ebenfalls ohne Probleme zu gehen. Allerdings hatte ich den Eindruck, daß das Hochladen SEHR schnell beendet war.

Seit dem Hochladen wird der Pro Micro am USB NICHT mehr erkannt! In der IDE ist der COM9 nicht mehr da und im Gerätemanager steht an betreffender Stelle: "unbekanntes usb-gerät (fehler beim anfordern einer gerätebeschreibung.)"
Beim Versuch die Treiber neu zu installieren, behauptet Windows, daß der beste Treiber bereits installiert ist. Deinstallieren des Geräts und Neuinstallieren bring das gleiche Ergebnis.

Nun komm ich auf das Board nicht mehr drauf, Mist!
Irgendwelche Ideen?

Andree-HB
23.04.2020, 17:25
Dieser Ardino (Clone) hat USB integriert ("based on the ATmega32u4"), wird also nicht über einen Wandler angesteuert - daher kann man ihn z.B. auch als HID-Device (wie eine Tastatur oder Maus) benutzen.
...habe ich gerade die Tage gemacht:
http://www.pixelklecks.de/projekteiii/zusatztastatur/

Einmal abziehen und wieder draufstecken, dann meldet er sich evtl. über einen anderen Com-Port

basteluwe
23.04.2020, 20:05
Einmal abziehen und wieder draufstecken, dann meldet er sich evtl. über einen anderen Com-Port
SO einfach ist es leider nicht. Das hatte ich natürlich sofort getestet. Ich hab sogar das Gerät komplett gelöscht und dann von Neuem installiert. Das Ergebnis ist das gleiche wie oben beschrieben.

HaWe
24.04.2020, 09:58
ich hatte mal so etwas bei einem meiner MCUs, der musste neu geflasht werden, dann hat es wieder funktioniert (habe ich aber nicht selber machen können).
Wenn sich der Aufwand für dich nicht lohnt: kauf dir einen neuen... ;)

Rabenauge
24.04.2020, 13:02
Manchmal hilft es auch, unter Prozessor die Variante "old bootloader" zu wählen.

Siro
24.04.2020, 13:35
Man kann durch eine falsche Programmierung den Bootloader deaktivieren
und dann meldet sich das Gerät garnicht mehr am USB an.

Wie schon beschrieben, hat er keinen, wie so oft übliche USB to RS232 Converter mit eigenem Treiber
FTDI oder Silabs, sondern es befindet sich der USB Code im Chip selbst.

Man muss den Bootloader nun separat aktivieren, das geht meistens über einen speziellen Pin.
Schau mal hier bitte rein, vielleicht hilft das weiter:
https://forum.arduino.cc/index.php?topic=255248.0

Wenn man den USB Code versehentlich überschrieben hat, kann man das wohl über den ISP
Programmer auch wieder hin bekommen.

HaWe
24.04.2020, 13:36
Manchmal hilft es auch, unter Prozessor die Variante "old bootloader" zu wählen.
das hilft IMO nur, wenn der COM-Port auch erkannt wid, dann aber das Hochladen trotzdem nicht klappt - dann hättest du Recht:
eine COM-Port-Erkennung aber wäre Vorraussetzung.

basteluwe
24.04.2020, 15:24
Danke für die Hilfe soweit! Auf jeden Fall hab ich erst mal HaWe's Rat befolgt, und einen neuen Micro bestellt.

Nun würde mich aber interessieren, wie denn das eigene Programm strukturiert sein sollte, damit es NICHT mit der USB-Routine kollidiert? Ich meine, solange ich dort nichts ändere, wird mir der Mist ja mit dem neuen Micro wieder passieren!?

HaWe
24.04.2020, 15:40
beliebte Fehler sind zB.: direkt an (versehentlich falsche) Speicheradressen schreiben oder cstrings über ihre Größe hinaus beschreiben, wie etwa
char test[5];
strcpy(test, "zulang");
wenn alles sauber programmiert ist, "dürfte" es nicht passieren.

basteluwe
25.04.2020, 10:35
beliebte Fehler sind zB.: direkt an (versehentlich falsche) Speicheradressen schreiben oder cstrings über ihre Größe hinaus beschreiben, wie etwa
char test[5];
strcpy(test, "zulang");
wenn alles sauber programmiert ist, "dürfte" es nicht passieren.

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:

/************************************************** *******************
* 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!

HaWe
25.04.2020, 11:25
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:

/************************************************** *******************
* 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.

basteluwe
26.04.2020, 14:12
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-vs-stdstring-vs-char-c/


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:

void ServiceName(char *name)
//{ info = name; }
{ strcpy(info, name);}
Leider ist dann die RDS-Anzeige leer. Mit {info = name;} läuft es problemlos!?


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.


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.

HaWe
26.04.2020, 14:21
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/threads/74810-Arduino-Pro-Micro-Treiber-Problem-oder-was-sonst?p=659541&viewfull=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...?

basteluwe
26.04.2020, 17:34
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/threads/74810-Arduino-Pro-Micro-Treiber-Problem-oder-was-sonst?p=659541&viewfull=1#post659541
OK, Danke! Ich ändere das dann mal :cool:

basteluwe
27.04.2020, 10:23
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):
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:
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.

Rabenauge
27.04.2020, 19:06
Hm, interessante Sache....möglicherweise hast du den dann gegrillt, indem du über USB 5V reingespeist hast?

basteluwe
28.04.2020, 11:20
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.