30 Taster einlesen mit i2c oder shiftRegister?

Hallo zusammen,
ich möchte ca. 30 Taster einlesen und bin mir nicht sicher welche Methode nun besser ist. Das ganze soll später mal eine Haussteuerung werden. Mein gedanke ist nun das ganze auf zu teilen, auf mehrere ATmegas. z.B Licht ein Mega, Rolladen ein Mega usw.
Ich möchte mir eine Platine erstellen mit 30 LEDs und 30 Tastern( später sollen das Lichtschalter(Taster) werden) um damit das Programm schreiben und testen zu können.
Meine Frage ist nun, ist es besser mit schieberegistern das ganze zu machen ( shiftIN und shiftOUT) oder doch lieber mit i/o expander(i2c). Da es sich um Taster handelt ist eine ständige Abfrage nötig( alle 50ms?) und auch gleichzeitig das setzen der Ausgänge. Es sollen je 4 Register verwendet werden und die zustände jedes mal in einer Vari. gespeichert werden und dann gleich gesetzt werden. Es wird nur AN oder AUS geschaltet! kein Dimmen!

MfG Marco

Ich hoffe mal, mit Mega ist hier ein Atmega < 2560 gemeint. Ansonsten wird das Atomrakten auf Spatzen schießen :smiley:

Ob nun I2C oder SPI ist eigentlich egal, wenn du keine besonderen Anforderungen hast. Der Atmega hat im vergleich zu den Attinys doch beides verfügbar.
Gab letztens irgendwo einen IC, der einem das Debouncen bereits erledigte. Den würde ich mir mal ansehen.

sschultewolter:
Gab letztens irgendwo einen IC, der einem das Debouncen bereits erledigte. Den würde ich mir mal ansehen.

Hallo,

dafür werden jedoch 3,3V Ub benötigt. Nur zur Info. Und warum soll ein Mega2560 Overkill sein? Was wissen wir was er alles noch einprogrammieren möchte. So eine Haussteuerung kann mit der Zeit sehr umfangreich werden. Mein Projekt ist schon bei 39kB Flash. Ein Uno wäre schon lange zu klein. Dabei habe ich den Code schon wieder abgespeckt. Zudem ein Mega2560 sehr viel Freiräume läßt.

Allein schon weil er von mehreren spricht!

39kB ist schon viel. Vermutlich viele Serielle Ausgaben dabei?

Hallo,

okay, wenn es mehrere µC werden sollen, dann wäre das Geldverschwendung. :wink:

Ja, es sind noch viele serielle Ausgaben dabei. Fast alle mit (F( ... )) . Einige können davon ganz am Ende noch raus bzw. kommentiere ich aus. Nur unter 30kB werde ich nicht mehr kommen. Ein paar Kleinigkeiten kommen noch dazu. Man wird nie fertig. Irgendwas fällt einem immer noch ein. :slight_smile:

Hallo zusammen,

ich wollte eigentlich einen Atmega8 für jede Platine verwenden. Als Zentrale kommt ein Mega2560.
So soll eine Platine mit 6 Registern (3x Licht out; 3x Schalter in) das ganze Licht steuern und nichts weiter( Komunikation mit dem Mega2560)
Damit möchte ich jede Aufgabe einzeln auf einer Platine. So kann ich nach und nach weiter Aufbauen.
Was ist nun besser oder einfacher zu programmieren "shiftregister" oder i/o expander i2c?
Wenn ich alle 50ms die Eingänge abfrage, muß ich dann noch entprellen?

MfG Marco

Hallo,

Du möchtest viele "Atmega8 Bauteine" im Haus verteilen. Jeder Baustein bekommt 6 digitale Aufgaben? 3x Licht out und 3x Schalter in sind 6 Bit. Ein Register bzw. Port hat überlicherweise 8 Bit. Ein Atmega8 benötigt dafür keine Porterweiterung. Wofür dann die "shiftregister" oder i/o expander? Hast Du irgendwas verwechselt?

Wegen Deinen 50ms Abfragezeit. Ich glaube da irrst Du ein wenig im dunkeln. Du mußt Deine Taster entprellen. Das ist unabhängig Deiner Abfragezeit. Beim entprellen wird eine Zustandsänderung überwacht. Das machst Du am einfachsten mit der Bounce2 Library. GitHub - thomasfredericks/Bounce2: Debouncing library for Arduino and Wiring
Und den Durchlauf der loop machst Du eben so schnell es geht. Sodass nur die "Entprellzeit" die große Geige spielt. Ohne zusätzliche Verzögerung. Also anders gesagt. Die Entprellzeit stellst Du meinetwegen zwischen 30 und 50ms ein. Je nach Qualität der Taster auch anders + Reserve, denn die Kontakte "altern" auch. Die loop muß permanent durchlaufen. Kein einziges delay. In der Bounce2 Library sind paar schöne Beispiele drin, solltet Du mal anschauen und durchprobieren.

Nur wie möchtest Du die vielen Atmega8's am zentralen Mega2560 verbinden. Haste Dir darüber schon Gedanken gemacht?

hi,

warum nicht das entprellen durch die art der abfrage erledigen?
wenn er alle 50 millis die taster abfragt und zweimal hintereinander das gleiche ergebnis bekommt, ist das entprellen erledigt.daß er dazu delays verwenden will, seh' ich nirgends in dem, was er geschrieben hat.

die kommunikation würd' mich auch interessieren, bastel da selbst grad an einer ähnlichen sache.

achtung, die atmega8 sind nicht ganz gleich wie die atmega328. shiftPWM zum dimmen der lampen geht da zb nicht.

gruß stefan

beginner34:
Hallo zusammen,
Es wird nur AN oder AUS geschaltet! kein Dimmen!

MfG Marco

Atmega8 hab ich auch "im ganzen Haus" verteilt.
Schau hier.

Hallo,

er fragte ob er die Tasten entprellen muß. Muß er.

Ich hatte ihn so verstanden das er nur aller 50ms die Taster einmal abfragt. Das wäre aber keine Entprellung.
Das mit dem, er soll keine delays verwenden habe ich vorbeugend erwähnt. Ich weis ja nicht wie er das mit den aller 50ms wirklich meint.

Wenn er aller 50ms die Taster abfragt und mit dem vorherigen Zustand vergleich, ist das jedoch auch keine Entprellung. In dem Moment der Abfrage kann das Zufall sein. War es nachprellen oder eine Signalstörung. Entprellung bedeutet, ich drücke den Taster, das wird erkannt und erst ab jetzt, wegen erkannter Zustandsänderung warte ich die eingestellte Entprellzeit ab und vergleiche nochmal ob das Signal immer noch gleich ist oder nicht. Wenn gleich, dann ist der Taster wirklich gedrückt wurden. Wenn nicht, war es blinder Alarm. Man muß die Taste immer solange drücken wie die eingestellte Entprellzeit. Bis 100ms empfinde ich noch als angenehm. Kommt natürlich auch auf den Taster drauf an wie lange er prellt.

Mal auf Seite 3 nachgeschlagen.....

Hi,
ich meinte auf 1 Platine ist 1 mega8( oder höher) und 8 Register (4 für in und 4 für out). Dieser macht nur Register einlesen und entsprechend die Ausgänge setzten. Und er soll, wenn sich etwas geändert hat, die Änderung an den Mega senden und dieser gibt es dann grafisch irgendwie aus(ist der letzte Punkt bei meiner Planung).

Die ganzen Platinen werden später in einem alten PC Gehäuse platz finden ( ähnlich einem CD Ständer) und neben dem Schaltschrank stehen. Jeder Lichtschalter bekommt einen eigenen Pin am Register( Matrix, ist nicht möglich)

Im Haus sollen ca. 25 Lichtschalter verteilt sein, diese werden mit 12V versorgt. Jede Lampe(220V) bekommt ein eigene Leitung und Stromstoßrelais (12V / 220V ). So kann ich die Anlage auch ohne Platine betreiben. ganz normal.
Ich bin mir nicht ganz sicher, was nun besser ist: Die taster werden mit optokopler an das Register angschlossen, wenn ich jetzt mit shiftIN auslese, dann kann ich i2c für die kommunikation der Platinen verwenden. Oder ich verwende i/o expander und nehme dann serial für die Platinen. Was lässt sich nun besser schreiben?

Entprellen: da komme ich gerade nicht mit, wenn ich alle 100ms lese und den Wert speicher und vergleiche, dann sollte doch das prellen erledigt sein?? Muss die Schaltung ein ganz normaler PullDown Widerstand sein? zwischen Taster und Optokopler?

Delay: kommt bei mir nicht vor! :wink:

MfG Marco

Entprellen: da komme ich gerade nicht mit, wenn ich alle 100ms lese und den Wert speicher und vergleiche, dann sollte doch das prellen erledigt sein?? Muss die Schaltung ein ganz normaler PullDown Widerstand sein? zwischen Taster und Optokopler?

Das klappt so nicht zuverlässig. Was ist, wenn ein Taster innerhalb der 100ms gedrückt und wieder losgelassen wurde? Von wo kommt die 12V Steuerspannung? Wenn dass das gleiche NT ist, was auch die Atmegas versorgt, kannste die Optokoppler weglassen und einen Spannungsteiler einsetzen.

Für Stromstoßrelais brauchst du aber Lichttaster :wink:

Hi,
12V kommt von einem Trafo für Hutschiene und versorgt die Relais. (extra)
Ja, es sind ganz normale Lichtschalter(taster).

MfG Marco

Hallo,

wegen dem entprellen. Ich weis nicht wie ich das am besten erklären soll ohne Zeichnung.

Vergiss am besten Deine "aller 100ms Tasterabfrage." Die loop muß ständig ohne Pause durchlaufen um die Bounce2 Funktionen abzuarbeiten. Beim entprellen wird auf eine Zustandsänderung an einem Eingang gewartet und eine Mindestzeit (die Entprellzeit) gewartet bis er sich nicht mehr ändert. Bzw. es wird gewartet ob der Zustand gleich bleibt oder doch wieder anders ist, nach der Wartezeit. Die Kontakte vom Taster haben sich beruhigt und schwingen nicht mehr nach, nach deren Betätigung.
Jetzt weist Du, okay der Taster wurde einmal gedrückt.
Wenn Du den Taster ohne Entprellung drückst, bekommt der µC vielleicht 66x H/L Pegel Wechsel registriert. Du möchtest aber einmal drücken und er soll das als einmal verstehen.

Das Prinzip entspricht dann in etwa was ich plane.

MCU steuer einen HC595 und HC165 an. Mit dem HC595 möchte ich mit Hilfe eines Darlingtonarrays Eltakos ansteuern. Die Setzbedingungen ergeben sich aus der Software bzw. Anweisung vom Master. Die HC165 sollen ledilgich erfassen, ob Ausgänge geschaltet oder ungeschaltet sind, da auch weiterhin alles nötige über Taster geschaltet werden soll.

hi,

also warum das mit dieser art, zu entprellen, nicht funktionieren soll, verstehe ich auch nicht.

sagen wir mal, ein taster prellt höchstens 30 millisekunden nach.

wenn er alle 50 ms abfragt, und bei zwei polls nacheinender den gleichen zustand bekommt, dann ist das entprellt.
der einzige unterschied zur anderen methode ist, daß er im ungünstigsten fall 49 ms bis zum ersten erkennen der zustandserkennung braucht. ab dann ist es das gleiche. er wartet 50 ms und schaut dann noch einmal nach.

und ob es zwei signalstörungen im abstand von 50ms sind, bekommt man weder mit der einen noch mit der anderen methode mit.

etwas anderes wäre es, zu warten, bis der taster seinen zustand sagen wir mal 30ms lang nicht mehr ändert, und vielleicht arbeitet die bounce ja nach diesem prinzip. das ist aber nicht das, was Ihr hier beschreibt:

Entprellung bedeutet, ich drücke den Taster, das wird erkannt und erst ab jetzt, wegen erkannter Zustandsänderung warte ich die eingestellte Entprellzeit ab und vergleiche nochmal ob das Signal immer noch gleich ist oder nicht.

es wird gewartet ob der Zustand gleich bleibt oder doch wieder anders ist, nach der Wartezeit

nachteil, wie gesagt, es kann sein, daß man den taster länger drücken muß (2x entprellzeit).

gruß stefan

Hallo,

nein, man muß den Taster nur mindestens so lange drücken wie 1x Entprellzeit.
Macht mal. Vielleicht reden wir auch nur aneinander vorbei ...

Entprellen und Signalstörung hat doch nichts miteinander zu tun, oder ?

Wenn ich keine Störungen habe, ist jeder Signalwechsel Teil einer -prellenden- Taster-Betätigung.
Dann spare ich mir das zwei mal einlesen, und frage nur alle x ( 5 .. 30 ) msec einmal:
Änderung erkannt: Änderung bearbeiten; sonst eben nicht.
Oder nach jeder erkannten Änderung frage ich x msec lang den ( die ) Taster nicht mehr ab, oder gönne mir gar ein kleines delay, fertig entprellt.

Wenn ich Störungen habe, habe ich sowieso Probleme, die mir ein noch so hochkompliziertes Debouncing nur zum Teil wegfiltern könnte. Wenn, z.B. während längerem Tastendrücken, zeitweise Aussetzer erkannt würden, ist der Taster verdreckt, die Feder ausgeleiert oder sonstwas in der Art. Diese Störungen können genausogut länger als eine vernünftige Debounce-Zeit sein und nur durch bessere Taster abgefangen werden.