Forum: Compiler & IDEs Taste drücken nicht halten


von My T. (mytrasher)


Lesenswert?

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

von mongo (Gast)


Lesenswert?

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.

von Marius (Gast)


Lesenswert?

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

von My T. (mytrasher)


Lesenswert?

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?

von My T. (mytrasher)


Lesenswert?

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

von mongo (Gast)


Lesenswert?

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.

von mongo (Gast)


Lesenswert?

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)
{}
}

von My T. (mytrasher)


Lesenswert?

klappen beide nicht, es leuchten einfach nacheinander die 7 leds sonst 
nichts ^^

von mongo (Gast)


Lesenswert?

Schaltplan des tasters bitte :-)  zieht er den pin auf low oder auf 
high?

von Joe S. (bubblejoe)


Lesenswert?

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.

von My T. (mytrasher)


Lesenswert?

mongo schrieb:
> Schaltplan des tasters bitte :-)  zieht er den pin auf low oder auf
> high?

ist lowactive... ist normaler stk500 mit ATmega8515

von mongo (Gast)


Lesenswert?

Dann mach das ausrufezeichen in der while schleife weg :-) dann müsste 
es hoffentlich funktionieren.

von My T. (mytrasher)


Lesenswert?

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...

von mongo (Gast)


Lesenswert?

Ausrufezeichen heißt nicht-verknüpfung :P

von My T. (mytrasher)


Lesenswert?

mongo schrieb:
> Ausrufezeichen heißt nicht-verknüpfung :P

wenn ich ! wegnehme heisst es bei NICHT tastendruck.... daher

von mongo (Gast)


Lesenswert?

Ja, bei NICHT Tastendruck soll er ja auch in der while-schleife bleiben 
und nix tun!

von My T. (mytrasher)


Lesenswert?

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 ^^

von mongo (Gast)


Lesenswert?

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);

}

von kopfkratzer (Gast)


Lesenswert?

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 ?

von My T. (mytrasher)


Lesenswert?

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

von My T. (mytrasher)


Lesenswert?

learning by doing ich lese mir das jedoch vieles finde ich durch fragen 
schneller und besser zu beantworten

von mongo (Gast)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von mongo (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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!

von My T. (mytrasher)


Lesenswert?

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

von mongo (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.