befehl nach jedem 25ten Element der If Schleife

(Firma: DLR ___ www.dlr.de) #954184
Lesenswert?

Ich möchte ein Softstart für einen Motor programmieren. Das klappt mit 
PWM auch ganz gut, aber nun möchte ich, dass solange die Pegeldauer 
erhöht wird, eine LED blinkt.
Anfangs dachte ich, ich mache es einfach mit delay, aber dadurch wird 
die ganze schleife verzögert.
1
    PORTC |= (1 << PC5);
2
    _delay_ms(250);
3
    PORTC &= ~(1 << PC5);
4
    _delay_ms(100);
also dachte ich mir, ich mache es so, dass bei jedem 25ten Element die 
LED angeht und nach 50 Elementen ausgeht. Aber ich weiss leider nicht, 
wie ich das realisieren kann.
Bisher geht sie nach dem 25ten Element an, aber bleibt danach an.
1
ICR1 = 0x4E20;        // Periodendauer
2
OCR1A = 100;          // High-Pegel dauer
3
    PORTC |= (1 << PC5);  // LED AUS
4
for (i = 0; i < 1400; i++) 
5
{  
6
      OCR1A = OCR1A+1;
7
   _delay_ms(10);
8
   if (i==25)
9
    PORTC &= ~(1 << PC5);  // LED AN
10
}
11
   while( 1 )
12
    ;  
13
}
#954200
Lesenswert?

Ja, klar, i ist ja nur einmal 25. Entweder mit modulo
1
for (i = 0; i < 1400; i++) 
2
{  
3
  OCR1A = OCR1A+1;
4
  _delay_ms(10);
5
  if (( i % 25) == 0) {
6
    PORTC ^= (1 << PC5);  // LED Togglen
7
  }
8
}
wobei Modulo bei 25 ein ziemlicher "Bräter" ist, will heißen, ein MOD 25 
ist ziemlich aufwändig, besser wäre eine Zweierpotenz z.B. 16 oder 32) 
da dies der Compiler optimieren kann und nicht die Divisionsroutine zur 
Berechnung braucht. oder du machst es über eine zweite Variable:
1
for (i = 0; i < 1400; i++) 
2
{  
3
  OCR1A = OCR1A+1;
4
  _delay_ms(10);
5
  j++;
6
  if (j >= 25) {
7
    j = 0;
8
    PORTC ^= (1 << PC5);  // LED Togglen
9
  }
10
}
Gruß
Roland

edit: klausy war schneller

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren