Forum: Mikrocontroller und Digitale Elektronik Programmlogik bei Einsatz von zwei PCF8574


von David (Gast)


Lesenswert?

Hallo Freunde,

ich hab mal wieder 'ne Laienfragen:
Und zwar verwende ich zum Ansteuern von 16 Tastern zwei PCF8574, welche 
auf den Adressen 0x20 (a0,a1,a2 -> low, low, low) sowie 0x21 (a0,a1,a2 
-> high, low, low) angeschlossen sind.

Ich bin eigentlich mit allem soweit zufrieden, außer mit meinem 
Progrämmchen. Ich habe bei Adressen in einem Array abgelegt und arbeite 
dieses Array in einer Schleifen im Loop-Teil meines Programms ab. Etwa 
so:
1
void loop ()
2
{
3
  for (int i=0; i<sizeof(addresses); i++)
4
  {
5
    int addr = addresses[i];
6
    -- Rest wie bei normalem Single-Betrieb --
7
  }
8
}
Und genau das ist es, was mich stört. Gibt es keine elegantere Lösung 
beide PCF8574 anzusteuern? Ich möchte es aus Latenzgründen vermeiden zu 
viele For-Schleifen zu verschachteln.

Für Ideen offen ;-)

Thx and have a nice day
David

von Keyboarder (Gast)


Lesenswert?

Frag die Dinger in der Mainloop eben abwechselnd ab?

von Falk B. (falk)


Lesenswert?

@David (Gast)

>dieses Array in einer Schleifen im Loop-Teil meines Programms ab. Etwa
>so:

Vollkommen OK.

>Und genau das ist es, was mich stört.

??

> Gibt es keine elegantere Lösung
>beide PCF8574 anzusteuern? Ich möchte es aus Latenzgründen vermeiden zu
>viele For-Schleifen zu verschachteln.

Geht's noch? Glaubst du ernsthaft, daß die paar Mikrosekunden auch nur 
ansatzweise eine Rolle spielen? Du leidest unter Perfektonismus.

https://de.wikipedia.org/wiki/Perfektionismus_(Psychologie)

von Wolfgang (Gast)


Lesenswert?

David schrieb:
> Gibt es keine elegantere Lösung beide PCF8574 anzusteuern?

Setze einfach eine Ebene tiefer an und frage dich:
Gibt es keine elegantere Lösung, um 16 Taster mit PCF8574 abzufragen?

16 Tasten kannst du als 4x4 Matrix anordnen. Dann brauchst du nur einen 
einzigen PCF8574 für die Abfrage und brauchst dir keinen Gedanken zu 
machen, wie du zwei davon eleganter ansteuern kannst.

von David (Gast)


Lesenswert?

Ne Mirkosekunde hier, ne Mikrosekunde da. Und Zwack sind es zwei 
Mikrosekunden :-D

Is ja guuuut... Vielleicht habe ich einfach noch nicht die Erfahrung. 
Ich will nur nicht bereits am Anfang meines Projektes Fehler 
produzieren, die man einfach hätte vermeiden können.

Nachher steht man da und sucht nach dem Übeltäter und sieht den Wald vor 
lauter Bäumen nicht mehr. Ich sag nur Division mit Variablen :-(

Thx anyway
David

von David (Gast)


Lesenswert?

Wolfgang schrieb:
> 16 Tasten kannst du als 4x4 Matrix anordnen. Dann brauchst du nur einen
> einzigen PCF8574 für die Abfrage und brauchst dir keinen Gedanken zu
> machen, wie du zwei davon eleganter ansteuern kannst.

Das musst Du mir genauer erklären...
Wie kann ich die 8 Ports für einen 4x4 Matrix verwenden?

von David (Gast)


Lesenswert?

Alles klar mal schnell gegoogelt :-)

Meinst Du das:
1
zeilen = {0,1,2,3};
2
spalten = {4,5,6,7};
3
4
btns = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
5
6
7
#BEISPIEL Zugriff auf Indizes
8
9
   4  5  6  7
10
0  0  1  2  3
11
1  4  5  6  7
12
2  8  9 10 11
13
3 12 13 14 15

David

von Wolfgang (Gast)


Lesenswert?

Du sprichst gar nicht jede Taste einzeln an, sondern aktivierst bspw. 
durch Anlegen eines Bitmusters an die vier Spalten genau eine Spalte und 
liest in den Zeilen den Zustand von vier Tastern gleichzeitig ein, dann 
kommt die nächste Spalte. Wegen den µs und der daraus resultierenden 
Prozessorlast musst du dir immer vergegenwärtigen, dass sich der Zustand 
der Tasten nur langsam ändert und die Abfragehäufigkeit nicht so hoch 
sein muss.
Wenn es schnell gehen soll, ist SPI deutlich günstiger als I2C.

von Falk B. (falk)


Lesenswert?

@ David (Gast)

>Is ja guuuut... Vielleicht habe ich einfach noch nicht die Erfahrung.
>Ich will nur nicht bereits am Anfang meines Projektes Fehler
>produzieren, die man einfach hätte vermeiden können.

https://www.mikrocontroller.net/articles/AVR-GCC-Codeoptimierung#Prinzipien_der_Optimierung

>Nachher steht man da und sucht nach dem Übeltäter und sieht den Wald vor
>lauter Bäumen nicht mehr. Ich sag nur Division mit Variablen :-(

Auch die ist OK. Das ist immer eine Frage des wo und wie oft.
Krampfhaft jede echte Division zu vermeiden ist Unsinn.

von Peter D. (peda)


Lesenswert?

David schrieb:
> Ich habe bei Adressen in einem Array abgelegt

Man kann die Adressen auch aufsteigend verdrahten, dann reicht ein 
Zähler statt eines Arrays.

Um Laufzeit zu sparen, kann man auch den INT-Pin benutzen. Dann muß man 
erst abfragen, wenn sich auch was geändert hat.

von David (Gast)


Lesenswert?

Peter D. schrieb:
> Man kann die Adressen auch aufsteigend verdrahten, dann reicht ein Zähler statt 
eines Arrays.

Kannst Du mir das etwas verdeutlichen?

Peter D. schrieb:
> Um Laufzeit zu sparen, kann man auch den INT-Pin benutzen. Dann muß man erst 
abfragen, wenn sich auch was geändert hat.

Kannst Du mir das auch etwas veranschaulichen?

Im Moment mache ich es so wie ich oben kurz angerissen habe.
Zwei Arrays (Zeile, Spalte) und dann eine verschachtelte For-Schleife. 
Was mir daran aber nicht so gut gefällt, ist die sehr aufwendige 
Verdrahtung. Das mit so wenig gekreuzten Bahnen wie möglich zu zeichnen 
ist schon schwierig (fürs PCB-Layout relevant, ich möchte ungern auf 
Dupont oder Platinenverbinder setzen müssen).

David

von Peter D. (peda)


Lesenswert?

David schrieb:
> Kannst Du mir das etwas verdeutlichen?

David schrieb:
> welche
> auf den Adressen 0x20 (a0,a1,a2 -> low, low, low) sowie 0x21 (a0,a1,a2
> -> high, low, low) angeschlossen sind.
1
  for( uint8_t addr = 0x20; addr <= 0x21; addr++)
2
  }
3
  }

David schrieb:
> Kannst Du mir das auch etwas veranschaulichen?

Siehe Datenblatt. Der /INT-Pin ist ein bitweises EXOR aus dem aktuellen 
Eingangswert und dem zuletzt gelesenen. Ist er high, hat sich nichts 
geändert.

von Stefan F. (Gast)


Lesenswert?

Die Tastenmatrix ist keine Lösung für das Problemchen des TO, da man 8 
Zugriffe auf den Chip benötigt, um alle Taster einmal abzufragen. Ihm 
waren schon zwei Zugriffe zu viel, habe ich zumindest so verstanden.

Ich denke auch, dass die Lösung wohl eher darin besteht, bei jedem 
loop() Durchlauf nur einen Chip abzufragen.

Ich sehe allerdings keine Notwendigkeit dafür, was wohl an dem Mangel an 
Infos bezüglich liegt.

von Jobst Q. (joquis)


Lesenswert?

Wolfgang schrieb:
> Wenn es schnell gehen soll, ist SPI deutlich günstiger als I2C.

Vor allem braucht man erstmal wesentlich schnellere Finger, damit das 
eine Rolle spielt.

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.