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
Es gibt portextender die auch ein Interrupt Signal ausgeben wenn irgendeine Taste gedrückt wird mit dem man den uC dann aufwecken kann
74HC165N, Schieberegister, Parallel zu seriell 5 Stück davon Martin K. schrieb: > ...und energieeffizientesten... ...heißt in uA bzw. mA?
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
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
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
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
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.
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.
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
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.
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.
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).
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
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.
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.
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.
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.
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?
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.
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?
Du kannst einfach 5 Stück PCF8574/A nehmen, im Standby brauchen die ~2,5µA. Die haben einen Interruptausgang bei Änderung.
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!
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.
Die kleinen atmega haben doch nur zwei interrupts während deepsleep?
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.
Zu beachten ist beim PCF8574/A, daß der Pullup bis zu 300µA betragen kann. Bei 40 Schaltern geschlossen, sind das max 12mA.
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
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
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
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.
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
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.
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.
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.
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.
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
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
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
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.
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
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.
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.
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
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
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
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.
@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
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.
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.
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
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
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
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
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
normaler pc keybord controller sendet scanncode sowohl bei einschalten, solange eingeschaltetet und beim ausschalten. Namaste
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.