Arduino Upload Problem

Hi, ich habe nen Problem beim Uploaden eines Programmes (egal welches).

Wenn ich auf Upload gehe kommt folgende Meldung:

http://nilsfeld.de/r/arduino/problems/problem_1.jpg

avrdude: stk500_getsync(): not in sync: resp=0x00
avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x51

Ich kann mit dieser Meldung nichts anfangen. Was heißt "resp"? 0x14/0x15 scheinen mir irgendwelche Speicheraddressen zu sein.

Wenn ich das Board vom PC Trenne und neu Verbinde oder den PC neustarte tritt das Problem immer wieder erneut auf.

Hat jemand von euch sowas schon gehabt ?

Ich bin über jede Antwort dankbar.

Gruß
Jomelo

Guten Morgen Jomelo,

es schein mir als sei die Kommunikation nicht in Ordnung! Kannst Du mal folgende Punkte prüfen (ich gehe von Windows aus):

-Wurde beim Anstecken des Boards der Treiber installiert oder konntest Du schon mal uploaden?
-Richtiges Board im Programm auswählen (unter "Tools", "Board",...)
-Com-Port einstellen (unter "Tools", "Serial Port",...)

Bei einem etwas älteren Arduino NG musst Du noch den Reset-Button drücken um das Programm aufspielen zu können.

Falls diese Hinweise nicht reichen sollten, beschreib doch bitte die genaueren Umstände :wink:

Gruß
Poldi

Dann muss ich wohl ne genau Beschreibung abgeben, also:

Umgebungen:

  • Board: Arduino 328 von 2009
  • Versuchs PC Windows Vista 64bit
  • Versuchs PC 2 Windows Vista 32bit und Windows XP

Was alles ging:

  • uploaden von Programmen, ausführen von Programmen

Letztes Programm an dem ich gearbeitet habe:

  • Umgang mit Zeigern um Funktionen kürzer zu machen

Beschreibung:
Beim Uploaden des Programms, mit den Zeigern ist der Kontroller beim uploaden mit der oben genannten Fehler Meldung stehen geblieben.
Das Arbeiten mit Zeigern hatte vorher an hand einer char Kette Funktioniert.

Bisher ausprobiert:

  • PC neustarten
  • Anderer PC
  • Anderes Betriebssystem
  • Anderes USB Kabel
  • Ältere Software
  • Reset Knopf und dann upload

Bis jetzt hat nichts geklappt. Ich vermute das ich irgend ein Problem mit dem Bootloader habe. Weiß aber noch nicht wie ich das nun beheben kann.

Symptome:
Sobald der Kontroller Spannung hat läd er das Programm, in diesem Fall einen Frequenzgenerator und die Diode "Pin 13" blinkt mit 10 Hz.
So wie es das alte Programm auch machen sollte.

Wenn ich versuche den Upload einzuleiten Blinkt einmal kurz die "RX" Diode (nur ein Impuls) und wärend dessen blinkt "Pin 13" weiter.
Also das Programm wird nicht gestoppt beim Uploaden ;-(

Im Moment weiß ich da auch nicht weiter.
Ich hoffe die Beschreibung ist genau genug, ansonsten liefer ich weitere Details nach.

Gruß
Jomelo

Was passiert denn, wenn Du ein normales Sketch, wie etwa das Blink Beispiel hochlädst? Zeigt Dein Board dann die gleichen Symptome?

Benutzt Du Pin 0 oder Pin 1 in Deinem Sketch? Die sind ja für die serielle Kommunikation frei zu halten, sonst kann der Bootloader nicht sinnvoll arbeiten...

Morgen zusammen!

Ich hatte eben den selben Fehler! Er trat auf, weil ich zu Debug-Zwecken ein Terminal im Hintergrund laufen hatte, welches mir Daten des Programms lieferte (Putty unter Ubuntu).

Somit war in meinem Fall der serielle Port einfach nur belegt!!!

Du schreibst

...Das Arbeiten mit Zeigern hatte vorher an hand einer char Kette Funktioniert...

Kann es sein das Du ähnliches gemacht hast und es gar nicht mit dem Programm auf dem Board zu tun hat? Manchmal sind es ja auch einfache Fehler, die einem die Nerven rauben :wink:

Gruß
Poldi

@Poldi
Das ist ein guter Hinweis.
Ich habe folgendes in meinem Main Programm:

 if(Serial.available() > 0) {
      menu_stopp = 0;
      Serial.flush();
    }

Wenn man das so betrachtet löscht er ja alles wieder was über Serial rein kommt, quasi auch die Datenübertragung, oder seh ich das falsch ?

Wie kann man ein Programm vom Arduino komplett löschen ?

edit 1:
@bohne
Ich kann kein Programm hochladen, egal was egal welcher pin.
In dem jetzigen Programm sind nur Pin 13 und 12 belegt.

So, ich habe jetzt noch 10mal das Uploaden ausprobiert ohne erfolg.

Habe dann weiter probiert,

  • reset knopfen drucken und uploaden ging auch nicht

Im Enteffekt hat es Funktioniert, aber nur wenn man folgende Reihenfolge genau beachtet:

  • Board Spannungslos machen

  • Reset knopf gedruckt halten

  • gleichzeitig Spannung wiederherstellen und Upload Button drucken

  • 1-2 Sekunden später Reset Button loslassen.

Das ganze hat aber auch erst beim dritten versuch geklappt.

Ich werde nun das ganze nochmal testen ob das auch ein zweites mal funktioniert.
Dafür muss ich das erstmal wieder schaffen das Teil zu "zerstören" :slight_smile:

Auf ein neues :slight_smile:

Gruß Jomelo

Edit 1:
- Kaputtmachen klappt
- Wiederherstellen klappt auch (1 Versuch mit etwas übung).
Nun gehts ans herausfinden, wieso das manchmal klappt und manchmal nicht.

Moin Jomelo.

Das klingt ja alles ziemlich merkwürdig. Ich werde den Verdacht nicht los, dass etwas mit Deinem Board nicht klappt. Du hast nicht zufällig ein zweites da mit dem Du das Verhalten testen kannst?

if(Serial.available() > 0) {
menu_stopp = 0;
Serial.flush();
}

Das Programm auf dem Board sollte beim Uploaden überhaupt keine Rolle spielen! Bei einem Reset horcht der Bootloader (ich glaube 3Sekunden lang) ob ein neuer Sketch geflasht wird oder nicht. Das Programm auf dem AT-Mega läuft zu diesem Zeitpunkt nicht!

Gruß
Jens

Ok, ich werde das in 2 Wochen mal testen, dann sind die Klausuren vorbei.
Da das ganze ein Projekt an der FH ist habe ich mehrere Boards zum testen.

Edit 1:
Der Code ist auf keinen Fall sauber, aber mit diesem Code habe ich das Board 3 mal abgeschossen.
Das klappt nicht jedes mal, aber ab und an. Meistens habe ich vorher versucht über den Serial Monitor Daten zu übertragen und dann den Upload zu starten.

//# INCLUDES:
//# ===================================



//# DEFINES:
//# ===================================
#define MENU_MAX_STRING_LENGHT 40


//# GLOBAL:
//# ===================================
  //# Timer ( schlecht gelöst, da die Funktion unten nicht unabhängig hiervon ist
  long genFreq_prev = 0; 
  
  //# 33 HZ 
  int Freq_pin_33 = 13;  
  int Freq_val_33 = LOW;
  int Freq_pre_33 = 0;

  //# 40 Hz
  int Freq_pin_40 = 12;
  int Freq_val_40 = LOW;
  int Freq_pre_40 = 0;
  
  
  //# Menu Date
  int menu_stopp = 0;
  #define MENU_0_CNT 4
  #define MENU_1_CNT 6
  #define MENU_2_CNT 6
  

  
  //# Menu Level 0    
  char menu_0[MENU_0_CNT][MENU_MAX_STRING_LENGHT] =
  { 
    {"Spiel"},                              // game
    {"Kontest"},                            // contest
    {"Einstellungen"},                      // settings
    {"Standby"}                             // standby
  };
  
  //# Menu Level 1
  char menu_1[MENU_0_CNT][MENU_1_CNT][MENU_MAX_STRING_LENGHT] = 
  {{
    // game
    {"0-6"},                                // 0-6
    {"0-10"},                               // 0-10
    {"0-XX"},                               // 0-X
    {"zurueck"},                            // back 0
    {"!"}
   },
   {
    // contest
    {"X Tore in X Minuten"},                // x goals x mins              
    {"schnellster Schuss in X Minuten"},    // fastes shoot
    {"zurueck"},                            // back 0
    {"!"}
   },
   {
    // settings
    {"Hardware"},                            // hardware
    {"Software"},                            // software
    {"Beleuchtung"},                         // lightning
    {"!"}                                    
   },
   {
    {"?"},                                  // -DO-
    {"standby"},                             // standby
    {"!"}
   }};
   
   //# Menu Level 2
   char menu_2[MENU_0_CNT][MENU_1_CNT][MENU_2_CNT][MENU_MAX_STRING_LENGHT] =
   {{
       // game
       {
          // 0-6
          {"?"},
          {"set_game"},
          {6},
          {"!"}
       },
       {
          // 0-10
          {"?"},
          {"set_game"},
          {10},
          {"!"}
        }     
    },
    {
    },
    {
    },
    {
    }
   };

//# FUNCTION: Frequenz Generator
//# ===================================
  int genFreq(int pin,int val, long interval) {    
    //## Intervall erfüllt                   millis*micros
    if(micros() - genFreq_prev > (1./interval*500*1000)) {
      
      //## neue Zeit setzen
      genFreq_prev = micros();  
      
      //## Value Setzen
      if(val == LOW) {
        val = HIGH;
      } else {
        val = LOW;
      }
      digitalWrite(pin, val);
    }
    //## Value zurückgeben
    return val;  
  }
  
//# FUNCTION: menu()
//# ===================================
  void menu(){  
    
    if(Serial.available() > 0) {
      menu_stopp = 0;
      Serial.flush();
    }    
    
    if(menu_stopp == 0) {
      menu_stopp = 1;
      for(int i=0;i<MENU_0_CNT;i++) {
        if(menu_0[i][0] == '!') {
          break;
        }
        Serial.print(i);
        Serial.print(") ");
        Serial.println(menu_0[i]);
        
        for(int j=0;j<MENU_1_CNT;j++) {
          if(menu_1[i][j][0] == '!') {
            break;
          }
          Serial.print(i);
          Serial.print(".");
          Serial.print(j);
          Serial.print(") - ");
          Serial.println(menu_1[i][j]);
          /*
          for(int k=0;k<MENU_2_CNT;k++) {
            if(menu_2[i][j][k][0] == '!') {
              break;
            }
            Serial.print(i);
            Serial.print(".");
            Serial.print(j);
            Serial.print(".");
            Serial.print(k);
            Serial.print(") - ");
            Serial.println(menu_1[i][j][k]);            
          }*/
        }          
      }    
    }    
  }
 
//# SETUP
//# ===================================
  void setup()  {
    //## Serial
    Serial.begin(9600);
    //## Outputs
    pinMode(Freq_pin_33, OUTPUT);             // 33 Hz  
    pinMode(Freq_pin_40, OUTPUT);             // 40 Hz
  }  
 
//# LOOP
//# ===================================
  void loop(){
    //## 33 Hz
    Freq_val_33 = genFreq(Freq_pin_33,Freq_val_33,10);    
    //## 40 Hz
    //Freq_val_40 = genFreq(Freq_pin_40,Freq_val_40,40); 
  
    menu();  
  }

Software ist "arduino-0016"

Hallo,

wir sind absolute Anfänger (haben insgesamt recht wenig Ahnung bis gar keine) und bei uns ist leider genau dasselbe Problem aufgetreten.

wir haben ein ATmega328p teil und arduino 0017

Kann uns Aufgeschmissenen vielleicht jemand helfen?
Das wäre seeehr nett! :wink:
lg

ich hatte das problem auch schon. Hatte scheinbar völlig harmlosen code auf dem Arduino, der wollte aber nicht.

die kombination resetknopf und upload hat bei mir geholfen. Allerdings hab ich das ungefähr 50x probiert. Kommt ziemlich auf timing an. Ich hatt den Finger noch auf dem Resetknopf wo in der software schon stand: uploading to ...

gruß

Kann man das Problem lösen, wenn man irgendwas austauscht? Microcontroller?

Ansonsten muss ich wohl das mit dem Resetknopf und dem upload probieren...

Ich habe bei ladyada folgendes zu dem Fehler avrdude: stk500_getsync(): not in sync: resp=0x00 gefunden.

Ich übersetze mal:

"Die Fehlermeldung "avrdude: stk500_getsync (): not in sync: resp = 0x00", bedeutet, dass der Arduino nicht reagiert. Es gibt Dutzende von möglichen Gründen.

Prüfen Sie Folgendes:

  • Wenn Du einen Arduino NG hast, drücke den Reset-Schalter drücken vor dem Hochladen.
  • Ist die richtige Serielle Schnittstelle eingestellt?
  • Ist der richtige Treiber installiert? (Im Fall von Windows ist damit der USB-Treiber gemeint)
  • Ist der Chip in den Arduino richtig eingesetzt? (Insbesondere, wenn der Arduino selbst gebaut wurde oder Bootloader selbst gebrannt wurde.)
  • Ist der richtige Bootloader auf dem Chip? (Insbesondere, wenn der Arduino selbst gebaut wurde oder Bootloader selbst gebrannt wurde.)

Beachte, dass es nahezu unmöglich ist, jeden dieser Fehler zu debuggen, denn es gibt viele mögliche Probleme. Versuche, alle Fehlerquellen auszuschließen."

In einer Fehlermeldung darüber wird angedeutet, dass es durchaus zu Problemen mit avr-gcc/avrdude und Vista kommen kann.

Dieses Problem hat mich lange geärgert, bis ich folgende Lösung fand:

  1. Arduino stromlos machen
  2. Resettaster drücken
  3. Arduino mit Netz E-verbinden
  4. Upload starten
  5. wenn Kompilierung abgeschlossen ist und der eigentliche Upload beginnt, 2-3 s danach Resettaster loslassen.
    Dieses Verfahren hat bei mir sofort! zum Erfolg geführt. Entscheidend ist, das Ziff. 5 konsequent umgesetzt wird! Dies wird in einigen Forenbeiträgen nicht korrekt dargestellt.
    Vorausgesetzt ist hier, dass alle Einstellungen und Verdrahtungen fehlerfrei sind.

Vielen Dank ponzelar,

das werde ich morgen wohl ausprobieren. Wie erkenne ich denn, wann die Kompilierung abgeschlossen ist?

z.B. wenn auf dem Monitor die Größe des Sketches angezeit wird.

Arduino schreibt dir zwischen Codefenster und Debugger "Done compiling" oder "Done uploading" rein.

Also ich hatte das problem eben auch:

Ich entwickelte ein kleines Programm welches auf Tasterdruck ein ton ausgibt. Den taster hab ich auf Pin 1 (TX) gelegt. Und zum probieren irgend ein Ton genommen und auf upload geklickt das lief ohne probleme. jetzt wollte ich nur den Ton verändern und klickte nochmals auf upload. Und da kam der Fehler über den wir hier reden.
(man war ich genervt)
hab dann nach langem hin und her und unzähligen upload versuchen den Taster auf Pin 2 gelegt und siehe da Uploading Done.
hoffe das war kein zufall. ist auf jeden ein versuch wert :wink:

hallo meisteroe

Das war kein Zufall;

Pin 0 und 1 werden für die serielle Schnittstelle verwendet.

Wenn Du da einen Taster oder sonstwas anhängst funktioniert die Übertragung des Sketches nicht mehr.

Grüße Uwe