Arduino Forum

International => Deutsch => Topic started by: -Jonas- on Mar 15, 2015, 08:10 pm

Title: delayMicroseconds(0) & Port-Manipulation
Post by: -Jonas- on Mar 15, 2015, 08:10 pm
hey leuts

ich bin gerade dabei, etwas mit mehrern servos bzw. brushless zu arbeiten...

dabei habe ich gemerkt, dass der Sketch irgendwie hängenbleibt, wenn ich ein delayMicroseconds(0); aufrufe. Kennt ihr das? muss man das dringendst umgehen oder liegt da der fehler nur bei mir?

so funktionniert der sketch:

Code: [Select]
void schreibeMotoren() {
  if(millis() - delayBetween > 20) {

    for(int i = 1; i < 6; i++) {
      delayBetweenMotors[i] = 1;
    }
    delayBetweenMotors[0] = 1500;
   
    PORTH = B11111111;
    PORTB = B11111111;

    for(int i = 0; i < 6; i++) {
      delayMicroseconds(delayBetweenMotors[i]);

        PORTB = B0;
        PORTH = B0;

    }
  }
}



und so nicht:

Code: [Select]
void schreibeMotoren() {
  if(millis() - delayBetween > 20) {

    for(int i = 1; i < 6; i++) {
      delayBetweenMotors[i] = 0;
    }
    delayBetweenMotors[0] = 1500;
   
    PORTH = B11111111;
    PORTB = B11111111;

    for(int i = 0; i < 6; i++) {
      delayMicroseconds(delayBetweenMotors[i]);

        PORTB = B0;
        PORTH = B0;

    }
  }
}



Grüsse jonas
Title: Re: delayMicroseconds(0) & Port-Manipulation
Post by: jurs on Mar 15, 2015, 09:18 pm
dabei habe ich gemerkt, dass der Sketch irgendwie hängenbleibt, wenn ich ein delayMicroseconds(0); aufrufe. Kennt ihr das? muss man das dringendst umgehen oder liegt da der fehler nur bei mir?
Ja, delayMicroseconds() mit einem Parameter von '0' aufzurufen, ist ein Fehler.
Denn es ist bekannt, dass die Funktion mit 0 als Parameter ein viel zu langes delay erzeugt.

Korrekt wäre es, die Funktion delayMicroseconds nur mit Parametern ab 1 oder höher aufzurufen.

Code: [Select]

for(int i = 0; i < 6; i++)
{
  if (delayBetweenMotors[i]>0)  delayMicroseconds(delayBetweenMotors[i]);
  ...


Wo es kein delay gibt, einfach kein delay aufrufen.
Title: Re: delayMicroseconds(0) & Port-Manipulation
Post by: uwefed on Mar 15, 2015, 09:19 pm
Bitte den ganzen Sketch

Meine Kristallkugel sieht einen Indexüberlauf im delayBetweenMotors[] -Array.

Grüße Uwe
Title: Re: delayMicroseconds(0) & Port-Manipulation
Post by: -Jonas- on Mar 15, 2015, 09:42 pm
danke jurs!

dann gibt es wohl noch eine check-schlaufe mehr -.- :D

@uwefed:
meinst du damit, dass der Array delayBetweenMotors[] gar nicht 6 Elemente hat? Wenn ja, dann hat deine Kugel leider versagt... aber sorry, ich habe die deklaration vergessen ins forum zu kopieren.

Title: Re: delayMicroseconds(0) & Port-Manipulation
Post by: uwefed on Mar 16, 2015, 07:36 am
@uwefed:
meinst du damit, dass der Array delayBetweenMotors[] gar nicht 6 Elemente hat? Wenn ja, dann hat deine Kugel leider versagt... aber sorry, ich habe die deklaration vergessen ins forum zu kopieren.
Wieso beantwortest Du nur die Hälfte meiner Fragen?
Grüße Uwe
Title: Re: delayMicroseconds(0) & Port-Manipulation
Post by: -Jonas- on Mar 16, 2015, 10:59 am
sorry uwefed.


hier der komplette Sketch:

Code: [Select]
unsigned long delayBetween;
int delayBetweenMotors[6];

void setup() {
  DDRB = B11111111;
  DDRH = B11111111;
}

void loop() {
  schreibeMotoren();
}
void schreibeMotoren() {
  if(millis() - delayBetween > 20) {

    for(int i = 1; i < 6; i++) {
      delayBetweenMotors[i] = 0;
    }
    delayBetweenMotors[0] = 1500;
   
    PORTH = B11111111;
    PORTB = B11111111;

    for(int i = 0; i < 6; i++) {
      delayMicroseconds(delayBetweenMotors[i]);

        PORTB = B0;
        PORTH = B0;

    }
  }
}


das ist nur ein Sketch zum Ausprobieren, der gibt noch nicht so viel sinn, da so oder so, egal wie gross das der delayBetweenMotors ist, beim ersten mal alle motoren ausgeschaltet werden.

beim definitiven werden dann nur die pins verändert, die verändert werden müssen. dort gibt es aber keine probleme.