Forum: Compiler & IDEs Tastaureingabe ohne warten zu müssen abfragen


von Martin spors (Gast)


Lesenswert?

Hallo erstmal.
In dem Tutoria2l "I/O Grundlagen" stand am ende folgender Satz:

>>>Dieses Programm wartet so lange in eine Schleife ("loop:"..."rjmp
loop"), bis Bit 0 im Register PIND 0 wird, also die erste Taste
gedrückt ist.<<<

Ich habe auch ein Programm, das innerhalb einer schleife eine
tastaturabgabe macht. (Programm ist in C, nicht ASM) Jetzt stellt sich
dort das Problem, das die Schleife immer auf eine Tastatureinage
wartet, also nur durchläuft wenn ich eine Taste drücke.

Ich würd es aber gerne so habe, dass die schleife immer läuft und ich
die Taste dennoch abfragen kann. Die Tastenabfrage soll nämlich ein
frühzeitiges abbrechen der Schleife ermöglichen, wenn es eine andere
möglichkeit gibt, die Schleife auf Tastendruck zu beenden, als eine
simple Tastanabfrage wär mir das auch recht, solange ich nicht immer
was drücken muss, damit das Programm ausgeführt wird :-)

Danke für die Hilfe. cya

von Rahul (Gast)


Lesenswert?

Hallo Martin!
Wieso legst du die Taste nicht auf einen interruptfähigen Pin und
bastelst dir die entsprechende Interrupt-Routine?
Schön Gruß
Rahul

von Peter D. (peda)


Lesenswert?

@Rahul

"Wieso legst du die Taste nicht auf einen interruptfähigen Pin"

Weil sie dann prellt wie Sau, aber das hat man ja schon zur Genüge
durchgekaut. Es gibt doch viel einfachere Lösungen, z.B.:

http://www.mikrocontroller.net/forum/read-4-20549.html


Peter

von Rahul (Gast)


Lesenswert?

@Peter:

So wie ich Martin verstanden habe, möchte er sein Programm nicht mit
unnötigem Warten auf eine Taste anhalten. Wenn er den Flankenwechsle
der Taste mit einem Interrupt erkennt, kann er sie nachträglich immer
noch entprellen, sofern der Interrupt gesperrt ist (so kenn ich das
noch auch 8051-Zeiten).
Gruß Rahul

von Florian Pfanner (Gast)


Lesenswert?

Hallo,

ich schreibe solche schleifen in C so:

for(;;)
{
  if (PINB&0x01)
  {
    break;
  }

  //Tue irgendwas während der Schleife
  //z.b.:
  temp=temp+10;
  temp=temp-10;
}

Solange der PINB.0 LOW-Potential hat, wird die Schleife immer
wiederholt. In der Schleife kann z.B. eine Messwertabfrage o.ä.
stehen.
Wenn nun der PINB.0 High-Potential führt, wird meine for-Schleife
abgebrochen.

Gruß, Florian

von Martin spors (Gast)


Lesenswert?

Danke für die vielen Tipps. das mit dem Pin ist klar, das Problem ist
aber, dass es sich nicht um einen Schalter, sondern um eine Tastatur
handelt, die abgefragt werden soll, deswegen geht das ganze so leider
nicht :-(

von ---- (Gast)


Lesenswert?

doch, das geht genauso. Du mußt nur so schnell abfragen, daß du keinen
Tastendruck versäumst. Für einen µC kein Problem.

---- (QuadDash).

von Florian Pfanner (Gast)


Lesenswert?

Was für eine Tastatur??? - wenn es eine PC-Tastatur ist, so kannst du
die in einer Application note beschriebene schaltung verwenden. Da ist
alles Interruptgesteuert (Abfrage bzw. Empfangen der Tastatursignale).
Wenn du ein Zeichen empfangen hast, kannst du eine Variable setzen. In
der Schleife frägst du dann die Variable ab, ob eine Taste empfangen
wurde oder nicht und danach den weitern verlauf der schleife
bestimmen.

Gruß, Florian

von Rahul Ghose (Gast)


Lesenswert?

Sollte es sich um eine 4x4-Tastatur handeln, gibt es direkt bei Atmel
eine Application Note (AN240 etwa). Dabei handelt es sich um eine
hexadezimale Tastatur. Die Funktionsweise ist recht einfach und braucht
nur einen Port.
Eine PC-Tastatur abzufragen ist etwas unständlicher, aber lösbar.
Notfalls gibt es auch fertige Code-Schloss-IC.
Gruß Rahul

von Sam (Gast)


Lesenswert?

Was für möglichkeiten gibt es, eine Pc-Tastatur über die Ports
abzufragen, oder gibt es fertige Schaltungen oder Ics, wenn ja welche?

Gruß Sam

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Es gibt bei Atmel eine Appnote.

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.