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

Re: Logikfehler? Kategorie: Programmierung (von André H. - 5.01.2012 13:33)
Als Antwort auf Logikfehler? von Markus H - 5.01.2012 9:45
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, C-Control II Station, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, 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.



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

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