Programm läuft nur wenn ich es von einem bestimmten pc aus hochlade !?

Hallo alle
habe dieses kleine programm für eine schrittmotorsteuerung geschrieben.
zählt einfach die higt signale und sezt den direction pin (7) entsprechend dem wert von int I
auf 1 oder 0

int i = 0;
void setup() 
{
Serial.begin (9600);
attachInterrupt (0, Zahler, RISING);
  pinMode         (7, OUTPUT);
  pinMode         (10, OUTPUT);
  pinMode         (2, INPUT);
}
void Zahler ()
{
i++;
 Serial.println (i);
}
void loop() 
{
if (i<100)
{
tone (11,40);
}
 else
  {
i=200;
digitalWrite (7, HIGH);
while (i<300)
    {
     tone (11,40);
    }
digitalWrite (7, LOW);
i=0;
  }
}

über meinen arbeits pc kann ichs problemlos hochladen und es tut auch was es soll aber auf meinem privatlappy bleibt pin 7 auf high stecken und sezt den zähler “i” auch nicht am ende wieder auf null…

hoffe jemand weis weiter

Bitte setze Deinen Sketch in Codetags (oben links </> im Foreneditor oder [code] davor und [/code] dahinter - ohne die *).
Das kannst Du auch noch nachträglich durch Editieren tun. Bitte mach das, der Sketch ist besser zu lesen, besonders auf mobilen Geräten.

Lösche bitte auch die unnötigen Anhäufungen von Leerzeilen im Code.

Wenn sich der Code von einem Rechner hochladen läßt, vom anderen aber nicht, liegt das in der Regel an der Konfoguration des Rechners.

Welchen Arduino mit welchem USB-Chip benutzt Du? Evtl. muss da noch ein Treiber installiert werden.

Die wichtigste Frage lautet aber: Wie heißt die Fehlermeldung.

Gruß Tommy

Die Ausgabe mit "Serial.print() innerhalb der Interruptbehandlung ist ein schwerer Programmfehler!

Offensichtlich läuft der Inerrupt so oft, dass Dir der serielle Ausgangspuffer vollläuft, der maximal 63 Zeichen aufnehmen kann, un dann bist Du in einer Situation der Totverriegelung (dead-lock):

Die Interruptbehandlungsroutine möchte weitere Zeichen in den seriellen Ausgangspuffer schieben, was aber nicht funktioniert, weil dieser voll ist.

Und der serielle Ausgangspuffer bleibt auch voll, solange die Interruptbehandlung nicht beendet wurde und damit die Interruptsperrung aufhebt.

Das Problem ist: Während der gesperrten Interrupts innerhalb einer Interruptbehandlung können keine Zeichen aus dem seriellen Ausgangspuffer gesendet werden, der Puffer bleibt voll.

Gleichzeitig will die Interruptbehandlung aber neue Zeichen in den seriellen Ausgangspuffer nachschieben, was aber wegen des vollen Puffers nicht funktioniert.

Und so bist Du beim “endlosen Warten” wegen dead-lock Totverriegelung:

Serial.print() kann nichts in den Ausgangspuffer schieben, weil dieser voll ist.
Und der Puffer bleibt voll, weil wegen der laufenden Interruptbehandlung alle weiteren Interruptaufrufe gesperrt sind und daher nichts über Serial rausgesendet werden kann.

Und damit hast Du Dein Programm zum Stillstand gebracht.

Einfache Abhilfe: Kein Serial.print() innerhalb von Interruptbehandlungsroutinen, die so häufig laufen. fass ggf. der serielle Ausgangspuffer volllaufen könnte!

volatile + atomic vergessen.

@jurs ohne das Serial.println geht es jetzt tatsächlich ^^ war schon am verzweifeln schau mir die geschichte mit dem dead-lock nochmal genauer an

@Tommy56 kommt nicht wieder vor. der code lässt sich von beiden rechnern aus hochlden. hab nen uno mit smd chip weis leider nicht welchen

@combie bitte was?

danke für die schnelle antworten

[quote author=danke CAPTCHA link=msg=3251586 date=1494193690] ... @combie bitte was? ... [/quote]

Ja, so isser, unser Combie. Quasselstrippe.

Gruß

Gregor :-)

bitte was?

int i = 0; volatile int i = 0;

Suchtipp: AVR Gcc ATOMIC_RESTORESTATE

@combie danke für die hauaufgabe schau ich mir morgen durch

Netter Verschreiber mit echtem neuen Sinn

Aber klaro, er hat dir das volatile ja auch um die Ohren gehauen.