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
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
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?
Ä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.
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.
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.
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.
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
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.
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.
hallo in diesem Thema ist fast das gleiche Problem beschrieben timer auf bestimmten wert zählen, hier wird mit nem interruptaufruf hochgezählt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.