Programmlogik bei Einsatz von zwei PCF8574

Gast #5502057
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
#5502068
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)
Gast #5502076
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.
Gast #5502077
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
Gast #5502101
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.
#5502134
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.
Gast #5502191
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
#5502213
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.
Gast #5502437
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren