Go Down

Topic: delayMicroseconds(0) & Port-Manipulation (Read 552 times) previous topic - next topic

-Jonas-

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

jurs

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.

uwefed

Bitte den ganzen Sketch

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

Grüße Uwe

-Jonas-

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.


uwefed

#4
Mar 16, 2015, 07:36 am Last Edit: Mar 16, 2015, 07:47 am by uwefed
@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

-Jonas-

#5
Mar 16, 2015, 10:59 am Last Edit: Mar 16, 2015, 10:59 am by -Jonas-
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.

Go Up