Warteschleife

Gast #1696362
Lesenswert?

kann mans so machen?


if(PINC &(1<<6))&&( _delay_ms (2000)) {
break;
};


bekomme aber noch einen Fehler angezeigt

#../pwmtaster.c:84: error: expected identifier before '(' token

das ist die Zeile in der das if steht, was ist da falsch?
Gast #1696374
Lesenswert?

Ähm, ja, du möchtest bitte ein C-Buch kaufen und/oder ein gutes Tutorial 
suchen, was du bitte durcharbeitest.  Das wird dir viel Zeit und Ärger 
sparen, denn man kann C nicht einfach durch ausprobieren lernen.
Gast #1696393
Lesenswert?

ich habe das problem dass ich in mich in einer while schleife befinde in 
dieser eine PWM durch Taster verändert werden kann. Ich möchte diese 
Schleife mit einem Taster der 2 sec gedrückt sein soll verlassen.
#1696418
Lesenswert?

Hannes schrieb:
> ich habe das problem dass ich in mich in einer while schleife befinde in
> dieser eine PWM durch Taster verändert werden kann. Ich möchte diese
> Schleife mit einem Taster der 2 sec gedrückt sein soll verlassen.

Siehst du.
Und das ist auf einem µC schon mal der falsche Ansatz.

Dein denken kreist um

  zuerst mach dieses
  dann mach jenes
  dann warten wir ein wenig
  und dann mach ich noch das

Die Denkweise ist auf einem µC nicht zielführend. Stattdessen musst du 
in Ereignissen denken.

Du hast deine Hauptschleife
1
int main()
2
{
3
 ....
4

5
  while( 1 ) {
6
    ...
7
  }
8
}

Diese Hauptschleife läuft ständig. In ihr werden mögliche Ereignisse 
abgeprüft (wie zb ob eine Taste gedrückt ist), die entsprechende Aktion 
ausgeführt und weiter gehst in der Hauptschleife. Was gar nicht geht: 
Innerhalb der Hauptschleife auf irgendetwas warten. So etwas ist Gift.

Im Grunde muss deine Denkweise so aussehen

Im Vergleich zu vorhin ist eine Zeitspanne x vergangen.
Was gibt es jetzt zu tun?

Du musst dir alles in diese Form zurechtlegen. Das kann zb auch heißen, 
das man sich Zähler zurechtlegt.
Weiß man, daß die Hauptschleife für einen Durchgang zb 2 Millisekunden 
benötigt, dann bedeutet das, dass nach 1000 Durchläufen durch die 
Hauptschleife 2 Sekunden vergangen sind. Wird die Taste gedrückt, dann 
setzt man einen Zähler zb auf 0. Bei jedem Durchgang durch die 
Hauptschleife erhöht man den Zähler und testet ihn. Hat er 2000 
erreicht, dann sind 2 Sekunden seit dem drücken der Taste vergangen.

Die Zahlen sind jetzt nur Hausnummern um das Prinzip zu verdeutlichen 
und in der Praxis wird man auch einen Timer dafür abstellen. Worum es 
geht ist die Denkweise. Weg von sequentieller Abarbeitung. Hin zu: Was 
gibt es jetzt im Moment zu tun, welches Ereignis ist im Vergleich zum 
letzten Durchlauf durch die Hauptschleife in der Zwischenzeit 
eingetreten? Und wenn man nichts anderes hat, dann muss man sich eben 
selbst 'Ereignisse schaffen', wie zb ein Zähler der regelmässig erhöht 
oder erniedrigt wird und bei dem ein bestimmter Zählerstand eine Aussage 
über irgendetwas erlaubt.
Gast #1696436
Lesenswert?

okay danke für deine erläuterung.

sowas ähnliches habe ich mir schon gedacht in vb.net geht man hin und 
setzt den Timer der einen Intervall von z.b. 100ms besitzt. dann geht 
man in dem SUB hin und zählt z.b. so eine Zeit hoch

warte = warte +1

dies wird jede 100ms gemacht bei z.b. warte = 10 ist somit 1 sec 
vergangen!

kann man das auch hier machen?

mfg
#1696446
Lesenswert?

hannes schrieb:
> okay danke für deine erläuterung.
>
> sowas ähnliches habe ich mir schon gedacht in vb.net geht man hin und
> setzt den Timer der einen Intervall von z.b. 100ms besitzt. dann geht
> man in dem SUB hin und zählt z.b. so eine Zeit hoch
>
> warte = warte +1
>
> dies wird jede 100ms gemacht bei z.b. warte = 10 ist somit 1 sec
> vergangen!
>
> kann man das auch hier machen?

Ja. Kann man. Wird man sogar.
Sogar mit den gleichen Begriffen.

Der Rest findet sich im AVR-GCC-Tutorial

Und noch was. Meistens ist die Form "Zähler wird erniedrigt wenn er noch 
nicht 0 ist" der Form "Zähler wird erhöht" deutlich überlegen.

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