Hallo, ich habe heute schon sehr viel Hilfe von euch bekommen, dennoch hoffe ich das ich noch paar fragen stellen darf :D Wie bewerkstellige ich z.b. wenn ich will das, nachdem eine schleife durchlaufen wird UND ich eine taste drücke das nach der schleife die durch meine gedrückte taste eine bestimmte aktion ausgeführt wird... im klartext...beispiel... led1 leuchtet danach led2 leuchtet danach led3 leuchtet drücke ich ne taste will ich das NACHDEM die oberen funktionen durchlaufen sind danach led 4 ,5 und 6 leuchtet..... die leds zum leuchten zu bringen ist nicht das problem... mein problem ist , DASS ich die TASTE gedrückt halten muss damit die nachfolgenden funktionen kommen... wie muss ich es machen damit ich nur 1 mal drücken muss und nicht halten? danke im vorraus
Mach nach den ersten drei Leds eine Warteschleife, in der du ständig den Wert des Tasters abfragst. Ist dieser gedrückt -> raus aus der schleife und weiter gehts.
per interrupt ? wenn du den taster drückst löst der interrupt aus, schaltet das interrupt erkennen aus und macht normal weiter bis die normale schleife fertig is dann macht er was du von ihm haben willst und schaltet nachher die interrupt erkennung wieder ein
mongo schrieb: > Mach nach den ersten drei Leds eine Warteschleife, in der du ständig den > Wert des Tasters abfragst. Ist dieser gedrückt -> raus aus der schleife > und weiter gehts. while(1) { if((PIND & (1 << PD0))) { long_delay(3000); PORTB = (1<<PB1); long_delay(3000); PORTB = (1<<PB2); long_delay(3000); } if(!(PIND & (1 << PD1))) { long_delay(3000); PORTB = (1 << PB7); long_delay(3000); } } wo sollte ich hier die warteschleife anbinden? bzw gehts noch einfacher?
Marius schrieb: > per interrupt ? > > wenn du den taster drückst löst der interrupt aus, schaltet das > interrupt erkennen aus und macht normal weiter bis die normale schleife > fertig is > > dann macht er was du von ihm haben willst und schaltet nachher die > interrupt erkennung wieder ein koenen sie mir nen beispiel mit meinem programm zeigen? danke
Hm, mit C kenne ich mich nicht aus. Ich versuche es mal while (1) { PORTB = (1<<PB0); long_delay(3000); PORTB = (1<<PB1); long_delay(3000); PORTB = (1<<PB2); long_delay(3000) while (!(PIND & (1 << PD0))) {} PORTB = (1<<PB3); long_delay(3000); PORTB = (1<<PB4); long_delay(3000); PORTB = (1<<PB5); long_delay(3000) } PB 0-2 sind die ersten drei LED´s, PB 3-5 die weiteren drei. Ich hoffe der Code ist richtig, hab nur in php ein bisschen Erfahrung.
oh, ist falsch. die schleife wird dauernd wiederholt, richtig lauten sollte es: while (1) { PORTB = (1<<PB0); long_delay(3000); PORTB = (1<<PB1); long_delay(3000); PORTB = (1<<PB2); long_delay(3000) while (!(PIND & (1 << PD0))) {} PORTB = (1<<PB3); long_delay(3000); PORTB = (1<<PB4); long_delay(3000); PORTB = (1<<PB5); long_delay(3000) while (1) {} }
klappen beide nicht, es leuchten einfach nacheinander die 7 leds sonst nichts ^^
Schaltplan des tasters bitte :-) zieht er den pin auf low oder auf high?
My Trasher schrieb: > die leds zum leuchten zu bringen ist nicht das problem... mein problem > ist , DASS ich die TASTE gedrückt halten muss damit die nachfolgenden > funktionen kommen... wie muss ich es machen damit ich nur 1 mal drücken > muss und nicht halten? danke im vorraus Das sollte normalerweise so schnell gehen, dass du das gar nicht registrierst. Les dir mal den Artikel zum Polling durch. Ansonsten müsstest du mit Interrupt arbeiten, aber eher ungünstig für Tasterabfragen.
mongo schrieb: > Schaltplan des tasters bitte :-) zieht er den pin auf low oder auf > high? ist lowactive... ist normaler stk500 mit ATmega8515
Dann mach das ausrufezeichen in der while schleife weg :-) dann müsste es hoffentlich funktionieren.
mongo schrieb: > Dann mach das ausrufezeichen in der while schleife weg :-) dann müsste > es hoffentlich funktionieren. was bringt es? ohne ! ist das ne komplett andere funktione ich will ja bei tastendruck...
mongo schrieb: > Ausrufezeichen heißt nicht-verknüpfung :P wenn ich ! wegnehme heisst es bei NICHT tastendruck.... daher
Ja, bei NICHT Tastendruck soll er ja auch in der while-schleife bleiben und nix tun!
danke ihnen so klappt es aber nicht so richtig :D er gibt den rest der schleife aus wen ich drücke aber ich wollte eigentlich... led 0,1,2,3... z.b. leuchten immer nacheinander auf wenn ich aber dan ne taste drücke soll es nachdem led 0,1,2,3... durchgelaufen ist z.b. dann 4,5,6 leutchen... was dein code macht ist... er stoppt und wartet bis ich taste drücke dann läuft er durch und stoppt... ende ^^
Also du meinst etwas wie ein Lauflicht mit Unterbrechung? Drücke dich (wäre dir sehr verbunden wenn du mich auch duzen würdest ;) ) ein bisschen präziser aus! Meinst du so? while (1) { PORTB = (1<<PB0); long_delay(3000); PORTB = (0<<PB0); PORTB = (1<<PB1); long_delay(3000); PORTB = (0<<PB1); PORTB = (1<<PB2); long_delay(3000); PORTB = (0<<PB2); while ((PIND & (1 << PD0))) {} PORTB = (1<<PB3); long_delay(3000); PORTB = (0<<PB3); PORTB = (1<<PB4); long_delay(3000); PORTB = (0<<PB4); PORTB = (1<<PB5); long_delay(3000); PORTB = (0<<PB5); }
Kann das ein das Du immer noch nicht das hier vorhandene AVR-GCC Tutorial durchgelesen hast ? Geh systematisch vor und arbeite das AVR-GCC tutorial mit Deinem Evaluationsboard durch, sonst wird das nichts wenn Du einfachste Grudnlagen nicht verstanden hast. Üblicherweise werden Tasterstellungen durch pollen erkannt und in einer globalen Variable gespeichert, KEINE Interrupts. Weißt Du was ein Programmplan/Ablaufdiagramm ist ? Wenn nein Grundlagen der Programmierung durchlesen und ausprobieren. Wenn ja warum hast Du Dir noch keines erstellt ?
mongo schrieb: > Also du meinst etwas wie ein Lauflicht mit Unterbrechung? Drücke dich > (wäre dir sehr verbunden wenn du mich auch duzen würdest ;) ) ein > bisschen präziser aus! > Meinst du so? ja jedoch will ich das die ersten leds immer wieder laufen bis ich ne taste zum befehl gebe was anderes zu machen nach der aktion soll die erste schleife wieder ohne unterbrechung laufen... bei deinem code hören die leds zu leuchten auf
learning by doing ich lese mir das jedoch vieles finde ich durch fragen schneller und besser zu beantworten
Achso! Jetzt glaube ich dich zu verstehen... Dann ist die beste lösung wirklich ein Interrupt. Wie du den initialisierst und ausführst musst du dir selber erarbeiten, hier kann ich dir nicht helfen da ich mein erstes C-Programm vor genau 1,5h geschrieben habe. Ich kann dir aber mal den Ablauf darstellen: while (1) { while (Flag_Taster_gedrückt = 0) { Led1 an aus Led2 an aus Led3 an aus } while (Flag_Taster_gedrückt = 1) { Led4 an aus Led5 an aus Led6 an aus Flag_Taster_gedrückt == 0 } } Der Interrupt könnte so ablaufen: function(Ta1_Int) { Flag_Taster_gedrückt == 1 } return (0)
My Trasher schrieb: > learning by doing funktioniert nicht bei den ganz einfachen Dingen. Du brauchst einen gewissen Grundstock an Wissen, bis du erst mal die richtigen Fragen stellen kannst. Zum Problem: Einen einzelnen Tastendruck zu erkennen ist erstaunlich komplex. Schieb das Problem noch vor dir her. Denn da tauchen noch Problemstellungen wie Tastenprellen auf. Sieh zu, dass du jetzt am Anfang deine Problemstellungen auf 'solange eine Taste gedrückt ist' umbaust. Selbst wenn das etwas künstlich ist.
mongo schrieb: > Achso! Jetzt glaube ich dich zu verstehen... Dann ist die beste lösung > wirklich ein Interrupt. Nein,. Mongo bitte. Seit Jahren erzählen wir jedem der es hören will und auch denen die es nicht hören wollen: Tasten werden nicht per externem Interrupt ausgewertet! Wie tun das nicht weil wir Arschlöscher sind, sondern weil Interrupts nicht vernünftig funktionieren und auch keine Erleichterung bringen. Für eine ordentliche Tastenauswertung braucht es keinen Interrupt und das Tastenprellen kriegt man damit auch nicht vernünftig unter Kontrolle. Um eine ordentliche Tastenauswertung zu machen, muss man einfach nur Pollen. Das kann man zb mit einem Timer und zugehörigem Interrupt machen. Davon ist der TO aber noch meilenweit entfernt. Man kann es zur Not auch ganz einfach in der Hauptschleife erledigen, zut Not auch mit einem kleinen _delay_ms, mit dem man die Prellzeit abfedert. In der Zwischenzeit: Auch Rom wurde nicht an einem Tag erbaut. Es gibt noch viel zu lernen. Einen Tastendruck zu erkennen ist im Moment nicht erste Priorität.
Naja, mir hat das "Auswerten per Interrupt" geholfen Interruptroutinen zu verstehen. Aber ich gebe dir recht, man soll es bzw muss es sogar im Hauptprogramm machen, bzw. mit (oder auch ohne) SW-Entprellung in einer Timerroutine. Und Trasher, bitte, tu allen einen Gefallen und lies dir das Tutorial durch, anstatt nun über eine Stunde rumzurätseln. Nichts für Ungut. mongo
mongo schrieb: > Naja, mir hat das "Auswerten per Interrupt" geholfen Interruptroutinen > zu verstehen. Ich wette mit dir, dass du über das Stadium der Bitoperationen schon lange hinweg bist :-) Du hast DIESES kleine Einmal-Eins mitlerweile im kleinen Finger. Der TO noch lange nicht. > Und Trasher, bitte, tu allen einen Gefallen und lies dir das > Tutorial durch, Vollste Zustimmung. Genau dazu wurde es geschrieben!
Karl Heinz Buchegger schrieb: > mongo schrieb: >> Naja, mir hat das "Auswerten per Interrupt" geholfen Interruptroutinen >> zu verstehen. > > Ich wette mit dir, dass du über das Stadium der Bitoperationen schon > lange hinweg bist :-) > > Du hast DIESES kleine Einmal-Eins mitlerweile im kleinen Finger. Der TO > noch lange nicht. > >> Und Trasher, bitte, tu allen einen Gefallen und lies dir das >> Tutorial durch, > > Vollste Zustimmung. > Genau dazu wurde es geschrieben! ok werd ich tun ^^ danke euch fur alles
Karl Heinz Buchegger schrieb: > Ich wette mit dir, dass du über das Stadium der Bitoperationen schon > lange hinweg bist :-) Deshalb auch die Empfehlung, ins Tut zu schauen :-) Noch eine kleine Überlegung für den TO: [c] while(1) { if (PIND & (1 << PD0)) { (LED 3,4,5 aufleuchten lassen) } else { (LED 0,1,2 aufleuchten lassen) } } PS: Um das Prellen brauchst du dich hier noch nicht zu kümmern, da du eine sehr hohe "Entprellzeit" von 9 sec durch deine Delays schon hast. Wenn du dich mit dem Tutorial intensiv beschäftigst, wirst du schnell Fortschritte machen!
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.