mikrocontroller.net

Forum: Compiler & IDEs Warteschleife


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Aber das hier ist deutlich besser
http://www.mikrocontroller.net/articles/Entprellun...

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
int main()
{
 ....

  while( 1 ) {
    ...
  }
}

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.

Autor: hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hannes (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt nicht mehr :-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.