Forum: Compiler & IDEs Warteschleife


von Hannes (Gast)


Lesenswert?

hey zusammen, ich suche ne möglichkeit um Befehle auszuführen wenn der 
taster eine bis zwei sec gedrückt ist..

wie realisiere ich dass?


bsp:

if taster1 = 2sec gedrückt {

Befehle;

};

wie realisiere ich die 2 sec Drückzeit bevor die Befehle ausgeführt 
werden?

mfg

von Karl H. (kbuchegg)


Lesenswert?

Am besten gar nicht.

Um Warteschleifen macht man auf einem µC einen Bogen, wie der Teufel ums 
Weihwasser.

Aber wenns denn sein muss
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

Aber das hier ist deutlich besser
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29

von Hannes (Gast)


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?

von Klaus (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Hannes schrieb:
> kann mans so machen?

Nein
Und das hat erst mal nichts mit C an sich zu tun, sondern damit das 
deine Vorstellung darüber, wie Programme bzw. Algorithmen funktionieren, 
ganz einfach nicht stimmt.

von Hannes (Gast)


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.

von Karl H. (kbuchegg)


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.

von hannes (Gast)


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

von Klaus W. (mfgkw)


Lesenswert?

Was man hier machen kann, ist das Tutorial zu lesen.
Das hat den Sinn, nicht jedem einzeln die Grundlagen erklären
zu müssen.

Arbeite doch bitte erst mal das durch, und frage, wenn danach
noch etwas unklar ist.

von Karl H. (kbuchegg)


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.

von hannes (Gast)


Lesenswert?

hallo in diesem Thema ist fast das gleiche Problem beschrieben timer auf 
bestimmten wert zählen, hier wird mit nem interruptaufruf hochgezählt.

von Karl H. (kbuchegg)


Lesenswert?

Jetzt nicht mehr :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.