Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Logikfehler? Kategorie: Programmierung (von Markus H - 5.01.2012 15:20)
Als Antwort auf Re: Logikfehler? von André H. - 5.01.2012 13:33
Ich nutze:
C-Control II Unit, OSOPT V3.1
> Hallo Markus,
>
>
> > Ich betreibe am PCF 8574AP i2c Modul von André eine 4x4 Matrix Tastatur und ein
> > 4x20 Display, mit den Tasten A bis D möchte ich durch das "Menü" blättern,
> > funktioniert auch soweit ganz gut, was noch nicht funktioniert:
> > Ich möchte das Display nur alle ca. 3 sec. aktualisieren, bzw, wenn ich eine Taste drücke
> > sollte das Display aktualisiert werden.
> >
> > Hier mein Code:
> >
> ...
> > if system.timer() - timer2 >= 3000 or pcfkeyb.getchar(5) != 0 //Macht mir Probleme!
> ...
> >

> >
> > ich hab bei der "or" Verknüpfung schon einiges mit Klammern rumprobiert,
> > das Display wird immer nur auf Tastendruck aktualisiert!
> > Lasse ich den Ausdruck "pcfkeyb.getchar(5) != 0" weg, wird das DP alle 3 sec. aktualisiert!
> > Evtl. kann mir jemand weiter helfen.
> > Weiter wäre es schön, wenn ich auch die Taste "0" benützen könnte ;-)
>
> Die Funktionen getchar() und getbin() warten auf einen Tastendruck.
> Besser gesagt, auf ein Tastenereignis.
> Eine Rückgabe mit dem Wert 0 gibt es bei getchar() nicht. (siehe pcfkeyb.c2 Char[])
> Wenn Du nur bei irgendeinem Tastendruck reagieren willst, kannst Du den PCF8574
> direkt abfragen:
>
>  if system.timer() - timer2 >= 3000 or pcf.in(PCFaddr) != 0xF
>

> Die Bedingung wird True, sobald irgendeine Taste gedrückt wurde.
>
> Wenn die Funktioni nicht auf ein Tastenereignis warten soll, muÃ? Du hier getstate()
> verwenden. Hier wird Dir immer ein Bitmuster (16Bit) der gedrückten Taten zurückgegeben.
> Wenn Du also nur bei Taste '0' aktualisieren willst, kannst Du auch folgendes schreiben:
>
>  if system.timer() - timer2 >= 3000 or pcfkeyb.getbin()==0b10000000
>

> Allerdings erhöht das unnötig die Buslast am I²C-Bus.
> Besser wäre es, die Displayausgabe in eine eigene Funktion zu setzen, und diese
> entsprechend aufzurufen:
>
>  if system.timer() - timer2 >= 3000 anzeige();
>  if ports.get(pcfkeyb.IntPort) { if pcfkeyb.getchar(5)=='0' anzeige();}
>

>
> Deine Loop-Schleife ist, so wie ich es sehe, unnötig, da Du diese immer nach einem
> Durchlauf mit break verlä�t.
>
> MfG André H.

Hallo André,

danke, funktioniert super!
Das mit der "0" war ein kleines missverständnis, ich wollte, dass es mit allen Tasten
funktioniert auch mit der "0" und das tat es logischerweise bei mir nicht.

Mit Funktionen bin ich leider nicht fit! Wie müsste sowas aussehen? Wäre für andere
Anwendungen auch hilfreich. Ich hatte noch nicht die Zeit mich damit zu beschäftigen,
und auf anhib bin ich da nicht durchgestigen...

Danke und GruÃ?,
Markus


    Antwort schreiben


Antworten:

Re: Logikfehler? (von André H. - 8.01.2012 19:37)
    Re: Logikfehler? (von Markus H - 9.01.2012 19:45)