Forum: Mikrocontroller und Digitale Elektronik Viele Kippschalter (ca. 40) auslesen / Mikrocontroller wake-up


von Martin K. (quetzalcoatl1906)


Lesenswert?

Hallo,

ich versuche gerade herauszufinden wie ich am besten (möglichst wenige 
Ports am µC) und energieeffizientesten den Status von etwa 40 
Kippschaltern überwachen könnte.
Bisher habe ich im wesentlichen zwei Möglichkeiten gefunden:

1. Jeweils fünf (oder mehr) Widerstände mit steigendem Wert in Reihe an 
einen ADC-Pin anschließen, die jeweils durch einen Kippschalter 
überbrückt werden können. Bei geeigneter Wahl der Widerstände müssten 
alle Schalterstellungskombinationen unterschiedliche Werte am ADC 
ergeben. Würde man je fünf Schalter (=32 Kombinationen) an einen Pin 
legen würde das acht ADC Eingänge am µC benötigen.
2. Eine mxn Tastenmatrix, die entsprechend m+n Ports benötigen würde 
(z.b. (8+5))
Siehe z.b. 
https://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Tastenmatrix.htm 
oder http://www.controllersandpcs.de/pdfs/Tastenfeldabfrage.pdf
Hier jeweils die Variante mit einer Diode pro Schalter, um alle 
Kombinationen detektieren zu können und "Phantom-keys" zu umgehen.

Variante 1 könnte mit einem Atmega32 möglich sein, der hat wenn ich das 
richtig sehe acht 10bit (also 1024 Werte) ADCs, mit denen man die 32 
Kombinationen jeweils unterscheiden können müsste? Da habe ich nicht so 
richtig Erfahrung, vielleicht können die Widerstandsbauteiltoleranzen da 
Probleme machen (was man wiederum eventuell rauskalibriert bekommt).

Variante 2 scheint die Standardlösung zu sein (Taschenrechner usw.)?

Im Moment tendiere ich zur zweiten Variante (ist vermutlich nicht 
umsonst der Standard und scheint mir weniger fehleranfällig)


Meine Fragen dazu sind nun:
1. Zu welcher Variante würdet ihr mir raten?
2. Wie bekommt man soetwas energiesparend hin, also z.b. bei der Matrix 
ohne kontinuierlich alle Zeilen und Spalten durchzuscannen? Optimal wäre 
es ja, wenn der µC schläft und dann bei einem Schalterwechsel (egal 
welchem) aufgeweckt wird und dann geprüft würde welcher es war. Kann man 
da etwas mit Pin-change-interrupts machen? Ein AtmegaX8 hat da ja 
genügend Pins, aber wie man soetwas hardwareseitig dann implementiert 
ist mir nicht so klar.


Vielen Dank für eure Hilfe,
Martin

von Hans (Gast)


Lesenswert?

Es gibt portextender die auch ein Interrupt Signal ausgeben wenn 
irgendeine Taste gedrückt wird mit dem man den uC dann aufwecken kann

von Jörg R. (solar77)


Lesenswert?

74HC165N, Schieberegister, Parallel zu seriell

5 Stück davon

Martin K. schrieb:
> ...und energieeffizientesten...

...heißt in uA bzw. mA?

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Hallo  Martin,

warum würdest Du das nicht so machen wollen, wie es von  Helge A. 
(besupreme) am 19.10.2013 vorgeschlagen wurde, im 
Beitrag "Re: Taschenrechner Tastatur: Ist das möglich?"?

Oder wäre das^^ die Lösung für Dich?

VG Torsten

von Martin K. (quetzalcoatl1906)


Lesenswert?

Hallo und danke für die schnellen Antworten!

Also eher eine Variante drei? Mittels Porterweiterung für jeden Schalter 
einen eigenen Port schaffen? Wenn die Erweiterung einen Interrupt 
triggern kann zum Aufwecken verstehe ich glaube ich wie es gehen könnte, 
im Fall vom 74HC165 Schieberegister ist mir nicht ganz klar wie man das 
Aufwecken realisiert?

Energieeffizient heißt in diesem Fall, dass dass die Schaltung am Ende 
mit Batterien betrieben wird und diese natürlich möglichst lange halten 
sollten. µA wäre also natürlich deutlich besser als mA.

Viele Grüße,
Martin

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Martin K. schrieb:
> Also eher eine Variante drei? Mittels Porterweiterung für jeden Schalter
> einen eigenen Port schaffen?

40 Pullup-Wiederstände oder Wechselschalter?

Portextender brauchen auch Strom und Du verbrauchst dann 40 Ports, im 
Gegensatz zum Ansatz von Helge^^.

Alle 150ms die CPU wecken, scannen und wieder schlafen legen sollte 
reichen, um Strom zu sparen.

: Bearbeitet durch User
von Martin K. (quetzalcoatl1906)


Lesenswert?

Hi Torsten danke für die Antworten!

Bin nicht ganz sicher ob ich die Schaltung von Helge gerade richtig 
verstehe, daher eine Nachfrage: Kann man da auch mehrere Schalter 
gleichzeitig erkennen oder immer jeweils nur einen?

Was meinst du mit "40 Pullup-Widerstände oder Wechselschalter?" ?

Viele Grüße,
Martin

von Jörg R. (solar77)


Lesenswert?

Schade, der HT16K33 fragt „nur“ 39 Tasten ab, das aber per I2C. Er 
benötigt daher nur 2 Ports. Wenn tatsächlich 40 Tasten abgefragt werden 
müssen könnte die eine Taste über einen Extraport abgefragt werden.

https://cdn-shop.adafruit.com/datasheets/ht16K33v110.pdf

So ganz nebenbei steuert der Chip auch noch 128 Leds an, wofür er 
normalerweise verwendet wird. Es gibt fertige Breakouts mit dem Chip.

von Gerhard O. (gerhard_)


Lesenswert?

Vor vielen Jahren baute ich eine PIC LCD Anzeigeeinheit mit Keypad 4x5 
Fähigkeit. Das Besondere was ich hier erwähnen möchte ist, daß ich 
externe Pullups als wired OR über die BE Strecke eines PNP versorgte. 
Der Collector war mit dem INT Eingang verbunden. Vor dem Schlafen gehen 
wurden dann alle Matrixausgänge auf LOW geschaltet (HC595).

Wenn nun irgendeine Taste gedrückt wird, wird der PNP durchgeschaltet 
weil Strom über die Pullups fließt (10K) und weckt den uC auf der dann 
die Keypad abarbeitet. Der PIC hatte noch keine Pin Change Interrupt 
Eingänge. Jedenfalls funktionierte die Anordnung wie gewünscht ohne 
zusätzliche Stromaufnahme im Schlafmodus.

Vielleicht erwägst du so eine Möglichkeit. Es wurden nur 7 IO-pins + den 
Int Eingang benötigt. Die Keypad Eingänge wurden mit dem LCD Modul 
geteilt, so daß fast kein IO für die Keypad verschwendet werden mußte. 
Es war kein Problem den Keypad scan und LCD Service code nebeneinander 
abzuarbeiten. Die einzige LCD Leitung die nicht geteilt werden durfte, 
war die E-Strobe.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Das Besondere was ich hier erwähnen möchte ist, daß ich
> externe Pullups als wired OR über die BE Strecke eines PNP versorgte.

Hast Du dazu mal einen Schaltplan, eine Skizze oder einen Link?

Jörg R. schrieb:
> Schade, der HT16K33 fragt „nur“ 39 Tasten hat, …

Cool daran ist die 20ms-Entprellung und der Interrupt bei Änderungen.

Der Ruhestrom ist wohl 1..2mA. Aber auch beim andauernden Keyscan?

> … per I2C. Er  benötigt daher nur 2 Ports.

Vom verwendeten µC steht da nix. Meistens ist ein µC mit mehr Ports 
einfacher und billiger als jeder zusätzliche Baustein.

Im Datenblatt steht, dass ein HT16K33 ein Haufen Dioden benötigt:
> One small-signal diode is required per key switch …

Martin K. schrieb:
> Kann man da auch mehrere Schalter gleichzeitig erkennen oder immer
> jeweils nur einen?

Was meintest Du mit "alle gleichzeitig"?
Jeden einzeln, auch wenn mehrere Schalter eingeschaltet sind.
… aber ich schau gern morgen nochmal, wenn ich ausgeschlafen bin. ;)

Martin K. schrieb:
> Was meinst du mit "40 Pullup-Widerstände oder Wechselschalter?" ?

Das betrifft nur den Vorschlag zum Portextender mit 40 Eingängen: Wenn 
Du einen Umschalter zwischen High und Low hast, benötigst Du keinen 
Pull-Up-Widerstand, der unnötig Strom verbraucht.

: Bearbeitet durch User
von Jörg R. (solar77)


Lesenswert?

Torsten C. schrieb:
> Der Ruhestrom ist wohl 1..2mA. Aber auch beim andauernden Keyscan?

Der Chip lässt sich in den Standbymodus versetzen, Strom ist dann <10uA, 
Typisch ist 1uA.

>> … per I2C. Er  benötigt daher nur 2 Ports.
>
> Vom verwendeten µC steht da nix.

Verstehe ich nicht.

von Martin K. (quetzalcoatl1906)


Lesenswert?

Der HT16K33 sieht eigentlich ganz interessant aus, 39 Tasten wären auch 
in Ordnung. Wenn ich das richtig verstehe macht der exakt dasselbe wie 
die Matrixvariante im ursprünglichen Post. Eine Diode pro Schalter würde 
auch hier benötigt wenn man alle Kombinationen erkenne möchte, was hier 
erforderlich ist. Das ganze könnte dann mit 2 Ports gelesen werden, was 
natürlich auch ganz nett wäre.
Die Frage wäre wieder wie man das hier am effizientesten löst, man 
müsste wohl in gewissen Abständen auslesen und könnte nicht nur 
aufwecken, bei einer Zustandsänderung? Zwar gibt es einen "Wake-up" 
mode, allerdings würde er ja vermutlich immer aufgweckt sein solange 
einer der 39 Schalter in EIN-Stellung ist.

Da die Schaltung am Ende immer eingeschaltet sein soll (also nicht wie 
ein Taschenrechner oder ähnliches mit einer An/Aus-Taste), bin ich nicht 
sicher ob das ständige Abfragen eventuell zu viel Energie benötigt. Beim 
Operating current wird 1 mA angegeben. Ich weiß nicht ob man das so 
sehen darf, aber wenn man mal grob sagt eine Batterie hat 2000 mAh wären 
das ja etwa 80 Tage (natürlich kommt noch der Stromverbrauch des µC und 
eventuelle Peripherie dazu), was sich grundsätzlich ja erstmal noch ok 
anhört.

von Martin K. (quetzalcoatl1906)


Lesenswert?

Torsten C. schrieb:
> Was meintest Du mit "alle gleichzeitig"?
> Jeden einzeln, auch wenn mehrere Schalter eingeschaltet sind.
> … aber ich schau gern morgen nochmal, wenn ich ausgeschlafen bin. ;)

genau, ich meinte ob man auch alle möglichen Kombinationen der 
Schalterstellungen erkennen kann (sind ja in meinem Fall Schalter und 
keine Taster wo im Ruhestand alle Taster offen sind). In 
https://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Tastenmatrix.htm 
im Punkt fünf sah mir die Schaltung auf den ersten Blick ähnlich aus, da 
wurde allerdings gesagt, dass man nicht mehrere Tasten gleichzeitig 
erkennen kann (und mehrere Tasten gleichzeitig wäre ja in meinem Fall 
jede Kombination, bei dem mehr als ein Schalter in EIN-Stellung ist).

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Martin K. schrieb:
> allerdings würde er ja vermutlich immer aufgweckt sein solange
> einer der 39 Schalter in EIN-Stellung ist.

Nicht ganz. Nur wenn sich was ändert.
Aber gibt es auch einen Interupt beim Ausschalten?

Mit "sampling period" im Datenblatt sind wohl 10ms gemeint:
> A key press is debounced and an interrupt issued if at least one
> key that was not pressed in a previous cycle is found to be pressed
> during both sampling periods.

Ich habe hier keinen HT16K33 zum Messen!
Wer kann helfen? Es geht auch um den Stromverbrauch:
Torsten C. schrieb:
> Der Ruhestrom ist wohl 1..2mA. Aber auch beim andauernden Keyscan?
Martin K. schrieb:
> Da die Schaltung am Ende immer eingeschaltet sein soll…, bin ich nicht
> sicher ob das ständige Abfragen eventuell zu viel Energie benötigt.

: Bearbeitet durch User
von SCNR (Gast)


Lesenswert?

Torsten C. schrieb:
> 40 Pullup-Wiederstände

Man dar die Widerstände schon dauerhaft hinlegen. Die müssen nicht bei 
jedem Wake-Up wieder stehen.

von Jens (Gast)


Lesenswert?

Martin K. schrieb:
> ich versuche gerade herauszufinden wie ich am besten (möglichst wenige
> Ports am µC) und energieeffizientesten den Status von etwa 40
> Kippschaltern überwachen könnte.

Immer diese Salami-Taktik. Was hängt an den Kippschaltern noch dran? 
Oder soll mit den Kippschaltern nur Eingaben in den µC getätigt werden 
um Werte oder so festzulegen?

Kippschalter sind keine Taster, haben also auch dauerhaft eine bestimmte 
Stellung und schließen ggf. dauerhaft den Stromkreis. Somit sind alle 
simplen Matrix-Lösungen ungeeignet.

von Martin K. (quetzalcoatl1906)


Lesenswert?

Jens schrieb:
> Immer diese Salami-Taktik. Was hängt an den Kippschaltern noch dran?
> Oder soll mit den Kippschaltern nur Eingaben in den µC getätigt werden
> um Werte oder so festzulegen?
>
> Kippschalter sind keine Taster, haben also auch dauerhaft eine bestimmte
> Stellung und schließen ggf. dauerhaft den Stromkreis. Somit sind alle
> simplen Matrix-Lösungen ungeeignet.

Hi Jens,

genau deshalb die Frage, der Unterschied zu den Tastenmatrixlösungen ist 
halt, dass bei Tasten im Ruhezustand nichts geschlossen ist und in 
meinem Fall durchaus auch dauerhaft Schalter in EIN-Stellung sein 
können. In http://www.controllersandpcs.de/pdfs/Tastenfeldabfrage.pdf 
Abb. 9 wurde allerdings auch hierfür eine Matrix benutzt.

An den Kippschaltern ist nichts weiter angeschlossen. Erstmal muss nur 
jedes Umlegen eines Schalters detektiert werden, und zwar welcher 
Schalter es war und ob er nun in EIN- oder AUS-Stellung ist.

von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

Torsten C. schrieb:
> Gerhard O. schrieb:
>> Das Besondere was ich hier erwähnen möchte ist, daß ich
>> externe Pullups als wired OR über die BE Strecke eines PNP versorgte.
>
> Hast Du dazu mal einen Schaltplan, eine Skizze oder einen Link?
Habe Dir schnell eine Handskizze gezeichnet weil ich nicht in der Nähe 
meines PCs bin. Das LCD ist miteingetragen. Bei der Ansteuerung des LCDs 
sollten die HC164 Ausgänge alle auf 1 gesetzt werden um durch Drücken 
der Tasten keine Fehlfunktionen zu verursachen. Die Dioden sind nur zur 
Isolation der Keypad notwendig oder wünschenswert um Fehlansteuerung des 
LCDs zu verhindern. (Im Original hatte ich einen HC595 aus anderen 
Gründen im Einsatz. Für Dich funktioniert es mit dem HC164 mit weniger 
Steuerleitungen.

Die Keypad und das LCD wurden in einer Timer ISR transparent betrieben 
um Störungen im Rest des Programms zu vermeiden.

Im Schlafbetrieb sollen die HC164 Ausgänge vorher auf Null gesetzt 
werden damit bei Tastendruck durch den PNP Strom fließen kann und der uC 
dadurch aufgeweckt wird.

War halt vor 15 Jahren "meine" Lösung um Port pins einzusparen und ist 
nicht unbedingt das Gelbe vom Ei - Für mich hat es den Zweck als 
Hobbyprojekt allerdings einwandfrei erfüllt und beansprucht keinesfalls 
eine kommerzielle Lösung zu sein, um das gleich vorwegzunehmen.

Gruß
Gerhard
>
> Jörg R. schrieb:
>> Schade, der HT16K33 fragt „nur“ 39 Tasten hat, …
>
> Cool daran ist die 20ms-Entprellung und der Interrupt bei Änderungen.
>
> Der Ruhestrom ist wohl 1..2mA. Aber auch beim andauernden Keyscan?
>
>> … per I2C. Er  benötigt daher nur 2 Ports.
>
> Vom verwendeten µC steht da nix. Meistens ist ein µC mit mehr Ports
> einfacher und billiger als jeder zusätzliche Baustein.
>
> Im Datenblatt steht, dass ein HT16K33 ein Haufen Dioden benötigt:
>> One small-signal diode is required per key switch …
>
> Martin K. schrieb:
>> Kann man da auch mehrere Schalter gleichzeitig erkennen oder immer
>> jeweils nur einen?
>
> Was meintest Du mit "alle gleichzeitig"?
> Jeden einzeln, auch wenn mehrere Schalter eingeschaltet sind.
> … aber ich schau gern morgen nochmal, wenn ich ausgeschlafen bin. ;)
>
> Martin K. schrieb:
>> Was meinst du mit "40 Pullup-Widerstände oder Wechselschalter?" ?
>
> Das betrifft nur den Vorschlag zum Portextender mit 40 Eingängen: Wenn
> Du einen Umschalter zwischen High und Low hast, benötigst Du keinen
> Pull-Up-Widerstand, der unnötig Strom verbraucht.

von Martin K. (quetzalcoatl1906)


Lesenswert?

Hallo Gerhard,

vielen Dank für die Skizze.
Wenn eine Taste gedrückt wird, wird der Transistor geschaltet und der µC 
aufgeweckt, richtig? Das funktioniert aber doch dann nicht, sobald die 
Taste ein Kippschalter ist, der anschließend in eingeschalteter Stellung 
verbleibt oder?

von Jens (Gast)


Lesenswert?

Gerhard O. schrieb:
> Im Schlafbetrieb sollen die HC164 Ausgänge vorher auf Null gesetzt
> werden damit bei Tastendruck durch den PNP Strom fließen kann und der uC
> dadurch aufgeweckt wird.

Es sind aber Kippschalter, welche auch dauerhaft auf "gedrückt" stehen 
können. Damit fließt ständig Strom und es wird kein weiterer INT 
ausgelöst.

von Gerhard O. (gerhard_)


Lesenswert?

Jens schrieb:
> Gerhard O. schrieb:
>> Im Schlafbetrieb sollen die HC164 Ausgänge vorher auf Null gesetzt
>> werden damit bei Tastendruck durch den PNP Strom fließen kann und der uC
>> dadurch aufgeweckt wird.
>
> Es sind aber Kippschalter, welche auch dauerhaft auf "gedrückt" stehen
> können. Damit fließt ständig Strom und es wird kein weiterer INT
> ausgelöst.

Oh! Da habt ihr recht - Wie peinlich:-) . Ich erinnerte mich am Anfang 
nur an das 8x5 Keymatrix und vergaß, dass es eigentlich Schalter waren. 
Naja, vielleicht ein anderes Mal wenn es ein Tastenfeld werden sollte, 
könnte man das Konzept wieder ausgraben.

Jetzt muß ich aber selber Schlafen gehen. Wenn mir was einfällt melde 
ich mich wieder.

Eine Frage: Es geht Dir hauptsächlich um Stromsparen und IO einzusparen 
- Oder nicht? Also sollte der uC die meiste Zeit schlafen. Stimmt das?

von Peter D. (peda)


Lesenswert?

Du kannst einfach 5 Stück PCF8574/A nehmen, im Standby brauchen die 
~2,5µA. Die haben einen Interruptausgang bei Änderung.

von Martin K. (quetzalcoatl1906)


Lesenswert?

Gerhard O. schrieb:
> Eine Frage: Es geht Dir hauptsächlich um Stromsparen und IO einzusparen
> - Oder nicht? Also sollte der uC die meiste Zeit schlafen. Stimmt das?

Ja genau, je weniger Ports desto besser und je weniger Strom desto 
besser. Im Prinzip kann der µC die meiste Zeit schlafen, es wird 
vielleicht 1-3 mal am Tag ein Schalter umgelegt.

Peter D. schrieb:
> Du kannst einfach 5 Stück PCF8574/A nehmen, im Standby brauchen die
> ~2,5µA. Die haben einen Interruptausgang bei Änderung.

Das sieht doch eigentlich ganz gut aus!

von MaWin (Gast)


Lesenswert?

Martin K. schrieb:
> Zu welcher Variante würdet ihr mir raten?

13 pins hast du am steuernden uC also übrig. Nimm 10 an die 10 Schalter 
kommen. Nun sind mit dem geringsten Bauteilaufwand (nicht 40 Dioden, 
Preis eher egal kann so hoch wie 5 PCF8574 sein) 30 weitere Schalter 
auszuwerten: Ein uC mit 32 I/O wie Atmega16, von denen an 30 deine 
Schalter kommen und 1 zur seriellen Kommunikation mit dem Haupt-uC 
genutzt werden. Beide uC im sleep warten auf pin change brauchen weniger 
als 1uA, wenn die Schalter Umschalter zwischen plus und Masse sind, 
sonst wäre der Stromfluss durch interne ca. 90k pull ups erheblich, bis 
30x(5/90)mA.

Die Lösung erfordert nur 1 weiteres Elektronikbauteil und zieht minimal 
Strom (kein polling) und ist geeignet für
43 Schalter.

von Hans (Gast)


Lesenswert?

Die kleinen atmega haben doch nur zwei interrupts während deepsleep?

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Martin K. schrieb:
> Peter D. schrieb:
>> Du kannst einfach 5 Stück PCF8574/A nehmen, …
> Das sieht doch eigentlich ganz gut aus!

Es gibt noch Alternativen, z.B. drei MCP23017.
Interruptausgang bei Änderung hätte der auch.

Preise und Stromverbrauch unterscheiden sich minimal.

Ich weiß nicht, worauf es Dir ankommt.
Vielleicht macht auch das PCB-Routing einen Unterswchied.

von Peter D. (peda)


Lesenswert?

Zu beachten ist beim PCF8574/A, daß der Pullup bis zu 300µA betragen 
kann. Bei 40 Schaltern geschlossen, sind das max 12mA.

von Torsten C. (torsten_c) Benutzerseite


Angehängte Dateien:

Lesenswert?

Der TO (also Martin) hatte noch nicht bestätigt, dass er Umschalter 
verwendet. Bei den Portextender-Lösungen wären Umschalter (SPDT) 
Voraussetzung, um Pull-Up-Ströme zu vermeiden.

Sowohl MCP23017 als auch PCF8574/A können die internen Pull-Up-Ströme 
meines Erachtens ausschalten.

Nur für den Fall,
dass es doch SPST-Schalter werden müssen, habe ich nochmal über eine 
Matrix-Lösung mit einem µC nachgedacht, der regelmäßig geweckt wird.

Die SW muss ja alle Kombinationen detektieren, also ohne "Phantom-keys".

Vielleicht ginge das mit einem µC, der jeden einzelnen Pin zwischen 
Pull-Up und Pull-Down umschalten kann, z.B. MSP430, STM8 oder STM32.

Ich denke jetzt nicht weiter drüber nach.

Zwischenstand zum besseren Verständnis im Bild:
* PU0 = interner Pull-Up und eine 0 gelesen.
* PU1 = interner Pull-Up und eine 1 gelesen.
* PD0 = interner Pull-Down und eine 0 gelesen.
* PD1 = interner Pull-Down und eine 1 gelesen.

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Gab es eigentlich schon eine Aussage über die Reaktionszeit auf eine 
Änderung der Schalter?
Ist diese groß genug, dann könnte der μC einfach regelmäßig aufwachen, 
in ein paar μs eine 8x5 Matrix (mit Dioden wegen Mehrfachschaltung) 
durchklappern und sich dann wieder viele ms schlafen legen.
Die Wachzeit könnte für 100ms Reaktionszeit locker 0,1% betragen mit 
(Atega368P) aktiven 1mA bei 1MHz/3,3V und sleep 2μA mit Timer2/32kHz als 
Wecker. Im Mittel 3μA.
Wie gesagt, wenn man mit 100ms auskommt, wobei Schalter prellen und 
selbst wenn man die "konservativ" per RC-Gled entprellt, wird man nicht 
beliebig kurze Reaktionszeiten erreichen.
Und man braucht nur den AVR und eventuell einen Uhrenquarz.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Angehängte Dateien:

Lesenswert?

Carl D. schrieb:
> Gab es eigentlich schon eine Aussage über die Reaktionszeit auf eine
> Änderung der Schalter?

naja fast, das scheint kein Problem zu sein, denn
Martin K. schrieb:
> Im Prinzip kann der µC die meiste Zeit schlafen, es wird
> vielleicht 1-3 mal am Tag ein Schalter umgelegt.

Carl D. schrieb:
> dann könnte der μC einfach regelmäßig aufwachen,
> in ein paar μs eine 8x5 Matrix (mit Dioden wegen Mehrfachschaltung)
> durchklappern

Genau die Alternative aus Phantom-keys-rausrechnen.png (Bild oben) um 
nicht 8 x 5 machen zu müssen, denn 8 + 5 = 13 Ports.

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Peter D. schrieb:
> Zu beachten ist beim PCF8574/A, daß der Pullup bis zu 300µA betragen
> kann. Bei 40 Schaltern geschlossen, sind das max 12mA.

Das hat mich auch interessiert. Guter Hinweis.

Allerdings: Falls ich das Datenblatt 
(http://focus.ti.com/lit/ds/symlink/pcf8574.pdf) richtig interpretiere, 
wird ein Interrupt nur dann ausgelöst, wenn Takt anliegt bzw. sogar nur 
dann, wenn der Baustein tatsächlich adressiert und Daten über IIC 
übertragen werden-

Für ein Aufwecken aus dem Sleep ist der also nicht geeignet, denke ich.

von Joachim B. (jar)


Lesenswert?

Torsten C. schrieb:
> Der TO (also Martin) hatte noch nicht bestätigt, dass er Umschalter
> verwendet.
??? wie verstehst du das?
Martin K. schrieb:
> allerdings würde er ja vermutlich immer aufgweckt sein solange
> einer der 39 Schalter in EIN-Stellung ist.


Ich denke mit Matrix & PCint bei Pegelwechsel sollte es doch klappen, 
ohne pollen

von Carl D. (jcw2)


Lesenswert?

Torsten C. schrieb:
> Carl D. schrieb:
>> Gab es eigentlich schon eine Aussage über die Reaktionszeit auf eine
>> Änderung der Schalter?
>
> naja fast, das scheint kein Problem zu sein, denn
> Martin K. schrieb:
>> Im Prinzip kann der µC die meiste Zeit schlafen, es wird
>> vielleicht 1-3 mal am Tag ein Schalter umgelegt.
>
> Carl D. schrieb:
>> dann könnte der μC einfach regelmäßig aufwachen,
>> in ein paar μs eine 8x5 Matrix (mit Dioden wegen Mehrfachschaltung)
>> durchklappern
>
> Genau die Alternative aus Phantom-keys-rausrechnen.png (Bild oben) um
> nicht 8 x 5 machen zu müssen, denn 8 + 5 = 13 Ports.

Eigentlich handelt es sich doch um mehrere Probleme. Eins, das auch 
schon mit kunstvollen Hardware angegangen wurde, ist das, das mit dem 
ich mich beschäftigt hab: wie weckt man das Ding in Falle eines 
"Schaltereignisses" auf. Und wenn man Reaktionszeiten eher in Sekunden 
denn in μs benötigt, ist die einfache Antwort: regelmäßig unabhängig von 
der Schalterbetätigung, weil die Pullups, die dies erkennbar machen 
würden, mehr Energie brauchen, als das regelmäßige Pollen.
Wie man die Matrix dann baut, ist eie ganz andere Frage. Wenn man es wie 
bei 4. In folgendem Link macht:
https://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Tastenmatrix.htm
dann kann man mit 7 PortPins
 7x7 - 7 (die Dioden-Diagonale)
-> 42 Tasten unterscheiden.
Auf die fehlende "Weck"-Möglichkeit dieser Schaltung kann man ja 
offenbar verzichten.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> Torsten C. schrieb:
>> Der TO (also Martin) hatte noch nicht bestätigt, dass er Umschalter
>> verwendet.
> ??? wie verstehst du das?

Hat Martin schon gesagt, ob er Einschalter (SDST) oder Umschalter (SPDT) 
hat?

Bei SPDT kann er zwischen High und Low umschalten, ohne Ruhestrom und 
ein Portexpander könnte einen Interrupt auslösen.

Bei SPST wäre regelmäßiges Aufwachen mit Polling günstiger.

von Peter D. (peda)


Lesenswert?

Theor schrieb:
> wird ein Interrupt nur dann ausgelöst, wenn Takt anliegt

Nö, siehe:
8.2.2 Simplified Schematic Diagram of Each P-Port Input/Output

Der Interrupt wird ausgelöst, sobald der Pin sich vom vorher gelesenen 
Wert unterscheidet.

von Mike J. (linuxmint_user)


Lesenswert?

Joachim B. schrieb:
> Ich denke mit Matrix & PCint bei Pegelwechsel sollte es doch klappen,
> ohne pollen

Sicher. Einfach etwas größere PullUps wählen, vielleicht um die 1MOhm, 
bei Interupt abfragen, Arbeit erledigen und wieder in den PowerDown 
schlafen legen. So etwas ist doch total alt und keine Neuerung. Mit 
0,2µA zieht die Schaltung dann viel weniger als seine PullUps.

von Sven L. (svenl)


Lesenswert?

Ich würde auch PCF8574 nehmen!

Der #INT ist ein OpenDrain-Ausgang. Die Interrupt-Leitungen kannst Du 
alle parallel schalten (OR). Bei einem Interrupt liest Du einfach alle 5 
Stück PCF aus (für die 40 Eingänge).

Für eine EMV-versuchte Umgebung würde ich mich nicht auf die Weak 
Pull-Ups des PCF verlassen und externe Pull-Up-Widerstände vorsehen. Die 
Schalter würde ich in diesem Fall mit mind. 1 mA bestromen.

Durch kurze Verzögerung (5-20 ms) zwischen Interrupt und Lesen des 
I²C-Bus entprellst Du Deine Schalter gleich noch... Im Prinzip brauchst 
Du nicht einmal den Interrupt, sondern liest zyklisch in einem festen 
Raster (10 ms) aus.

Billiger und effektiver bekommst Du das kaum noch hin.

Viele Grüße!

Sven

von Joachim B. (jar)


Lesenswert?

Sven L. schrieb:
> Ich würde auch PCF8574 nehmen!

kann man machen aber es wurde schon vorgerechnet das 40 PCF Ports 
dauerhaft auf low nicht effektiv sind.

effektiver ist dann wirklich der PCint Pin change IRQ

von Sven L. (svenl)


Lesenswert?

Ja wenn er nicht mal die 4 mA für alle Inputs low übrig hat, dann muss 
er das mit Multiplexing lösen, indem er die Ausleserate und den 
Stromfluss kontrolliert.

Hmm...wenn ich 'ne Kiste mit 40 Schaltern dran baue, dann ist der 
Stromverbrauch meistens nicht so das Problem, dass man auf jedes µA 
achten muss.

Aber gut, es sind nicht meine Anforderungen.

Sven

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Sven L. schrieb:
> Die Schalter würde ich in diesem Fall mit mind. 1 mA bestromen.
Sven L. schrieb:
> wenn er nicht mal die 4 mA für alle Inputs low übrig hat
Du meinst 40mA, oder?

Nochmal: Wozu die Debatte? Falls der TO (Martin) SPDT-Umschalter nimmt 
und zwischen High und Low umschaltet, wäre die ganze Debatte doch 
hinfällig.

von Sven L. (svenl)


Lesenswert?

Nein, ich meinte 4 mA bei Nutzung der Weak Pull-Ups. Ohne in's 
Datenblatt zu schauen, waren das so um die 50 kOhm, oder waren es nur 50 
µA? Weiß es nicht genau...

Bei 1 mA je Schaler sind es natürlich 40 mA insgesamt. Aber allein die 
mechanische Anordnung von 40 Schaltern oder Tastern wird so groß, dass 
er eine vernünftige Entstörung braucht...

Viele Grüße!

Sven

Edit: Gerade noch einmal nachgesehen: 400 µA Sink/Source per Pin. Sind 
bei 40 Schaltern immerhin auch 16 mA.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Sven L. schrieb:
> Hmm...wenn ich 'ne Kiste mit 40 Schaltern dran baue, dann ist der
> Stromverbrauch meistens nicht so das Problem, dass man auf jedes µA
> achten muss.

da bin ich voll bei dir!
und auch deinen Vorschlag hatte ich schon gemacht, ach ne hier nicht 
weil das ein anderer tat:

Hans schrieb:
> Es gibt portextender die auch ein Interrupt Signal ausgeben wenn

aber wenn der TO nicht mag.....

Martin K. schrieb:
> Energieeffizient heißt in diesem Fall, dass dass die Schaltung am Ende
> mit Batterien betrieben wird und diese natürlich möglichst lange halten
> sollten. µA wäre also natürlich deutlich besser als mA.

was willste machen?

Beitrag #5685622 wurde vom Autor gelöscht.
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Joachim B. schrieb:
> was willste machen?

Portextender mit 40 SPDT-Schaltern ohne Pull-Up und der Pull-Up am IRQ# 
kann ruhig ein paar mA haben, da er ja nur ganz kurz auf Low geht, beim 
Umschalten.

von Martin K. (quetzalcoatl1906)


Lesenswert?

Hi,

also ob Einschalter oder Umschalter ist egal, wichtig ist nur den Status 
zu erkennen, also können das genauso gut Umschalter sein.
Die Reaktionszeit ist nicht so kritisch, 1-2 Sekunden wären schon ok, 
vielleicht auch etwas mehr.

Wenn ich das richtig verstehe, wäre in diesem Fall dann die 
Matrixvariante mit regelmäßigem Abfragen jede Sekunde die günstigste?
Der einzige Vorteil vom PCF8574 wäre in dem Fall, dass er schneller 
reagiert, allerdings im Mittel vermutlich etwas mehr Strom benötigt? 
Oder ist das mit Umschaltern besser, das habe ich noch nicht so ganz 
verstanden leider.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Martin K. schrieb:
> Wenn ich das richtig verstehe …
Ich fürchte, nicht 100%ig:

Alle Vorteile liegen meines Erachtens bei PCF8574/MCP23017 
Portexpandern:
* Super schnell trotz
* minimalem Stromvervbauch bei
* wenigen Port-Pins am µC.

Die IRQ#-Ausgänge der Portexpander kannst Du alle an den gleichen PCINT 
Pin change IRQ hängen.

Die Portexpander würde ich auf der Schalter-Frontplatte verbauen, dann 
hast Du nur wenige Leitungen von der Frontplatte zum µC.

… falls das^^ vom Aufbau so vorgesehen ist.

Eine Matrix-Variante ohne "Phantom-keys" mit AVR sehe ich noch nicht
und schrieb:
> Ich denke jetzt nicht weiter drüber nach.

: Bearbeitet durch User
von Martin K. (quetzalcoatl1906)


Lesenswert?

Ja, gefühlt gefällt mir die Portexpandervariante auch besser. Scheint 
mir irgendwie die einfachste Lösung zu sein und wenn die interrupts alle 
an einem Eingang hängen können und man viele pins spart ist das denke 
ich erstmal am saubersten für mich. Falls ich dann am Ende ein paar µA 
mehr verbrauche wird das vermutlich nicht so schlimm sein, da habt ihr 
schon recht. Ich denke damit werde ich es erstmal versuchen!

Vielen Dank für die ganzen Ideen und Anregungen!

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Peter D. schrieb:
> Theor schrieb:
>> wird ein Interrupt nur dann ausgelöst, wenn Takt anliegt
>
> Nö, siehe:
> 8.2.2 Simplified Schematic Diagram of Each P-Port Input/Output
>
> Der Interrupt wird ausgelöst, sobald der Pin sich vom vorher gelesenen
> Wert unterscheidet.

Tut mir leid. Dein Satz ist zwar so richtig, der Einspruch insgesamt 
aber nicht, denke ich, denn ob das geschieht, hängt davon ab, wie ich 
schon sagte, ob ein Takt anliegt.

Denn damit etwas gelesen wird, muss es einen Read-Impuls geben, Siehe 
genau das Bild in 8.2.2. auf das Du mich hingewiesen hast.
Einen Read-Impuls gibt es nur, wenn IIC-Kommunikation stattfindet. Einen 
anderen Weg dazu kann ich im Datenblatt nicht erkennen.
Und die Kommunikation findet nur statt, wenn ein Takt an SCL anliegt. 
Siehe 8.4 Device Functional Modes, Bild 17.

Ich will einräumen, dass mein Einwand: "wenn ein Takt anliegt", den 
mittleren Teil der Kausalkette ausliess. Aber das ist eine notwendige 
Bedingung.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

@Theor: Der Interrupt hängt nur an dem Gatter rechts unten im Bild.
Der Interrupt wird auch ohne Takt ausgelöst.

Der Takt und der Read-Impuls setzt das D-Flipflop auf den aktuellen 
PIN-Zustand, damit der nächste Wechsel (wieder zurück) auch erkannt 
wird.

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Theor schrieb:
> Peter D. schrieb:
>> Theor schrieb:

Au verflixt. Da habe ich einen Denkfehler gemacht.

Es wird ein INT ausgelöst, sobald eine Änderung ggü. dem _zuletzt 
gelesenen_ Zustand eintritt.
Das lesen bewirkt nur das speichern des letzten Zustandes, nicht den 
Vergleich selbst.

von Joachim B. (jar)


Lesenswert?

Theor schrieb:
> Denn damit etwas gelesen wird, muss es einen Read-Impuls geben, Siehe
> genau das Bild in 8.2.2. auf das Du mich hingewiesen hast.
> Einen Read-Impuls gibt es nur, wenn IIC-Kommunikation stattfindet.

???

ich muss doch nicht den /IRQ Ausgang vom PCF8574(a) lesen, wenn ich den 
am /INT0 vom Atmel hänge!
Da dürfte der Atmel auch ganz fest schlafen!

Will ich natürlich den PCint nutzen muss ich eben schauen wie tief der 
Atmel schlafen darf, da waren in den sleep modi halt Unterschiede.

von Gerhard O. (gerhard_)


Lesenswert?

Da fällt mir noch vollständigkeitshalber ein, es gibt den NXP PCA9506. 
Der hat 40 IO Pins. Der 9506 hat keine internen Pullups. Einfach wäre 
der Einsatz schon und braucht keinen Pullup Strom.

https://www.nxp.com/documents/data_sheet/PCA9505_9506.pdf?

Ist aber 56-pin TSSOP.

Ich habe den mal früher verwendet. Wahrscheinlich aber hier doch 
Overkill.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> Der 9506 hat keine internen Pullups.
Bei den anderen Portexpandern schaltet man die Pullups per SW aus.

Das Gehäuse wäre kein Problem, wenn es für den 9506 solche fertig 
bestückten Module gäbe wie ebay 173557044644.

@Martin K.(quetzalcoatl1906): Hast Du Dich bewusst für I²C und gegen SPI 
entschieden?

https://www.reichelt.de/i-o-port-expander-16bit-mit-spi-schnittstelle-s-dil-28-mcp-23s17-e-sp-p90047.html

BTW: Den PCF8574 gibt es auch als Board, z.B. ebay 264030592099

von Joachim B. (jar)


Lesenswert?

Torsten C. schrieb:
> BTW: Den PCF8574 gibt es auch als Board, z.B. ebay 264030592099

der wäre eher ungünstig weil für LCD mit Hintergrundbeleuchtung und den 
Transistor dazu, besser für eine Tastenmatrix wäre dieser:

https://www.ebay.de/itm/1PCs-PCF8574-IO-Expansion-Board-I-O-Expander-I2C-Development-Module-8-Bit-TE255/232932082676?hash=item363bd583f4:g:TdYAAOSwr6RZnO2V:rk:2:pf:0

von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

Ein Aspekt wurde, falls ich es im Thread nicht übersehen habe, noch 
nicht wirklich diskutiert, nämlich der minimal angegebene Kontaktstrom. 
Ohne Last hapert es da bei vielen handelsüblichen Schaltern und könnte 
Anlass zu Zuverlässigkeitsproblemen geben. Man muss da auf "Dry 
Contacts" oder potentialfreier Kontakt achten. Für den angegebenen 
Schalter müsste man bei fehlenden Pullups die Option P, B, G, oder R 
bestellen.

Siehe hier z.B.
https://www.digikey.ca/product-detail/en/c-k/7101P3YZBE/CKN1018-ND/40979

Wenn die Schalter auch einigermassen billig sein sollten, dann kann die 
Wahl zur Qual werden. Oder mit dem minimal angegeben Strom arbeiten.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Gerhard O. schrieb:
> … nämlich der minimal angegebene Kontaktstrom

+1

Zumindest wenn da lebenswichtige medizinische Geräte dran hängen, sollte 
man auf den angegebenen minimalen Kontaktstrom achten.

Ich behaupte aber einfach mal: Selbst wenn der Kontakt-Widerstand 
100kOhm beträgt, funktioniert die Schalung trotzdem noch.

: Bearbeitet durch User
von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

normaler pc keybord controller sendet scanncode sowohl bei einschalten, 
solange eingeschaltetet und beim ausschalten.

Namaste

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Hallo Martin K. (quetzalcoatl1906),
verrätst Du uns noch was Du mit den Kippschaltern steuerst, wenn schon 
keine lebenswichtigen medizinischen Geräte?
Und machst Du uns am Ende vielleicht sogar noch ein Foto von der 
Rückseite der Frontplatte mit den 40 Kippschaltern?
VG Torsten, der das nett fände.

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.