Arduino Mirco nach Programmieren nicht mehr erreichbar.

Hallo

Seit einiger Zeit Baue ich Schaltungen mit dem Arduino Board. In meinem neusten Projekt nutze ich den ENC28J60 (über SPI) und ein monochrom 1,3" Display (über i2c). Wenn ich den Source Code nun übersetze und auf den Arduino Micro übertrage ist dieser über USB nicht mehr erreichbar (auch nicht mehr zum Programmieren).

Als Library benutze ich für den ENC die Ethercard Bibliotheken und für das monochrom Display die Bibliotheken von Adafruit.
Durch Neuflashen des Bootloaders kann ich den Arduino wiederbeleben.

Wer kann mir helfen?

Gruß
Chris596

Könnte ein RAM-Problem sein. Benutzt Du die F() Makro?
Grüße Uwe

Der Micro hat das gleiche Problem wie die Leonardos: wenn Dein Sketch fehlerhaft ist und in einer Endlos-Schleife hängen bleibt (Uwe's Vermutung könnte der Grund dafür sein), wird auch die USB-Schnittstelle nicht mehr bedient. Ein Reflashen des Bootloaders behebt das (weil das ganze Flash überschrieben wird), alternativ kannst Du das Hochladen durch manuellen Reset und gutes Timing beim Upload auch hinkriegen.
Dies ist dem Konzept geschuldet, dass der Hauptprozessor sich auch um den USB-Bus kümmert. Wenn dieser "stehen bleibt", funktioniert natürlich auf dem Bus auch nichts mehr.

Hallo pylon,

Das war zunächst auch meine Vermutung daher habe ich in die Main loop einen delay von 40ms eingebaut um dem Prozessor sozusagen luft zum Arbeiten zu verschaffen. Dies war leider auch ohne erfolg.
Darüber hinaus habe ich das Netzwerk und das Display ein einzelnen Sketchen getestet hier haben beide ihre Aufgabe ohne Probleme lösen können.
Die einzige Schleife, die ich selber programmiert habe, ist die Main loop.
Wie könnte man auf einfache Art und weise so ein Problem finden?

Danke

Gurß
Chris596

Ein delay() verschafft keine Luft. Das ist busy waiting/aktives Warten. Während der Zeit kann nichts anderes gemacht werden.

EDIT:
Interrupts sollten da noch gehen, aber die würden wahrscheinlich so oder so ausgeführt.

chris596:
Die einzige Schleife, die ich selber programmiert habe, ist die Main loop.
Wie könnte man auf einfache Art und weise so ein Problem finden?

Stell mal den Sketch rein. Die loop-Schleife (while(1)) ist immer aktiv und so gewünscht. Eine for-Schleife die nicht hochzählt nicht, vielleicht ein Argument falsch gesetz.

chris596:
Hallo pylon,

Das war zunächst auch meine Vermutung daher habe ich in die Main loop einen delay von 40ms eingebaut um dem Prozessor sozusagen luft zum Arbeiten zu verschaffen. Dies war leider auch ohne erfolg.
Darüber hinaus habe ich das Netzwerk und das Display ein einzelnen Sketchen getestet hier haben beide ihre Aufgabe ohne Probleme lösen können.
Die einzige Schleife, die ich selber programmiert habe, ist die Main loop.
Wie könnte man auf einfache Art und weise so ein Problem finden?

Danke

Gurß
Chris596

Du hast mir nicht zugehört.
Jeder xx.print() verbraucht Ramspeicher. Wenn die 2,5kByte des ATmega32U2 voll sind werden Variablen bzw Stack überschrieben und der Micro reagiert nicht mehr und/oder macht irgendetwas nicht vorhersehbares.
also bitte gib in alle Serial.print("text"); und client Print("text"); das F() Makro
siehe FAQ Neuigkeiten und Probleme ab Arduino IDE 1.0 - #2 by uwefed - Deutsch - Arduino Forum
Grüße Uwe

Das RAM Problem gab es kürzlich auch hier:
http://forum.arduino.cc/index.php?topic=227113.0

Da ist der Controller anscheinend immer wieder neu gestartet

Hallo
Das ist mein Code:

#include <SPI.h>
#include <Wire.h>
#include <EtherCard.h>
#include <IPAddress.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>


#define DEBUG  // Send Serial Data for Debug

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);


//LED Variables
//Struct for Saving the Stripe state
struct light {
  uint8_t n;
  uint8_t r;
  uint8_t g;
  uint8_t b;
}lightCol;

//Initialize LCD Display
#define USEDISPLAY
#ifdef USEDISPLAY
void setupDisplay()
{
  //Display Setup
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D); //initzialize the Display and set the Adress to 0x3D for 128x64px display
  
  display.clearDisplay();
  delay(2000);
  
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(25,0); 
  display.println("Light Control");
  display.drawLine(0, 11, display.width()-1, 11, WHITE);
  display.display();
}

//Actual Info Screen Function
void PrintInfos(const char *Port, const char *ownip, const char *srcIP, const char *datarec)
{
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,13); 
  display.print("Port: ");
  display.println(Port);
  display.print("IP: ");
  display.println(ownip);
  display.print("SIP: ");
  display.println(srcIP);
  display.println("Data Rec: ");
  display.println(datarec);
  display.display();
}
#endif

//Network Connection
#define USENETWORK


#ifdef USENETWORK
//MY MAC important must be unique
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x31,0xF1 };
//Enternet Buffer size
byte Ethernet::buffer[700];
static uint32_t timer;

//callback that prints received packets to the serial port
void udpSerialPrint(word port, byte ip[4], const char *data, word len) {
  IPAddress src(ip[0], ip[1], ip[2], ip[3]);
  #ifdef DEBUG
  Serial.println(src);
  Serial.println(port);
  Serial.println(data);
  Serial.println(len);
  #endif
  
  lightCol.n = atoi(strtok((char *)data, ";"));
  lightCol.r = atoi(strtok(NULL,";"));
  lightCol.g = atoi(strtok(NULL,";"));
  lightCol.b = atoi(strtok(NULL,";"));
 
  //SetLED(&lightCol);
  PrintInfos((char *) port, "123", "135", data);
}

static byte session;

// called when a ping comes in (replies to it are automatic)
static void gotPinged (byte* ptr) {
  ether.printIp(">>> ping from: ", ptr);
}

void SetupNetwork(){
  if(ether.begin(sizeof Ethernet::buffer, mymac)== 0)
    #ifdef DEBUG
    Serial.println("Faild to access Eternet Controller");
    #endif
  if(!ether.dhcpSetup())
    #ifdef DEBUG
    Serial.println("DHCP Faild");
    #endif  
  ether.printIp("IP: ", ether.myip);
  ether.printIp("GW: ", ether.gwip);
  
  //Call this to report others pinging
  ether.registerPingCallback(gotPinged);
  
  //UDP
  //register udpSerialPrint() to port 1337
  ether.udpServerListenOnPort(&udpSerialPrint, 1337);
  
  timer = -9999999; // start timing out right away
  
  
}
#endif


//Setup Routine
void setup()
{
 //Setup Serial
 #ifdef DEBUG
 Serial.begin(9600);
 #endif
 
 #ifdef USEDISPLAY
 Serial.println("Setup Display");
 setupDisplay();
 #endif
 
 #ifdef USENETWORK
 Serial.println("Setup Network");
 SetupNetwork();
 #endif
}

void loop()
{
  #ifdef USENETWORK
  
  word len = ether.packetReceive(); // go receive new packets
  word pos = ether.packetLoop(len); // respond to incoming pings
  
  // report whenever a reply to our outgoing ping comes back
  if (len > 0 && ether.packetLoopIcmpCheckReply(ether.hisip)) {
    Serial.print("  ");
    Serial.print((micros() - timer) * 0.001, 3);
    Serial.println(" ms");
  }
   //this must be called for ethercard functions to work.
  ether.packetLoop(ether.packetReceive());
 
  #endif
  delay(70); 
}

Danke Uwe jetzt scheint der Arduino wieder erreichbar zu sein. Das F Makro kannte ich bisher noch nicht.

uwefed:

chris596:
Hallo pylon,

Das war zunächst auch meine Vermutung daher habe ich in die Main loop einen delay von 40ms eingebaut um dem Prozessor sozusagen luft zum Arbeiten zu verschaffen. Dies war leider auch ohne erfolg.
Darüber hinaus habe ich das Netzwerk und das Display ein einzelnen Sketchen getestet hier haben beide ihre Aufgabe ohne Probleme lösen können.
Die einzige Schleife, die ich selber programmiert habe, ist die Main loop.
Wie könnte man auf einfache Art und weise so ein Problem finden?

Danke

Gurß
Chris596

Du hast mir nicht zugehört.
Jeder xx.print() verbraucht Ramspeicher. Wenn die 2,5kByte des ATmega32U2 voll sind werden Variablen bzw Stack überschrieben und der Micro reagiert nicht mehr und/oder macht irgendetwas nicht vorhersehbares.
also bitte gib in alle Serial.print("text"); und client Print("text"); das F() Makro
siehe FAQ Neuigkeiten und Probleme ab Arduino IDE 1.0 - #2 by uwefed - Deutsch - Arduino Forum
Grüße Uwe