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
voidloop()
2
{
3
for(inti=0;i<sizeof(addresses);i++)
4
{
5
intaddr=addresses[i];
6
--RestwiebeinormalemSingle-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
@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)
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.
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
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?
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.
@ 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.
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.
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
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_taddr=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.
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.
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.