Forum: Mikrocontroller und Digitale Elektronik DOG-M163 und Taster auf Platine mittels I2C / TWI


von Tino K. (blumengiesser)


Angehängte Dateien:

Lesenswert?

Ich habe ein DOG-M163 und vier Taster auf eine selbst erstellte Platine 
gebracht und steuere das Display wie im Datenblatt beschrieben an. 
Funktioniert prima. Nur sind echt viele Kabel für das Display und die 
Taster notwendig. In Summe 10+2 Stück! (GND, VCC, 4xTaster, 4xDisplay, 
EN_Backlight und EN_Display, letztere Zwei kann man natürlich immer auf 
VCC legen und sich sparen). Nun hatte ich gedacht der Platine einen µC 
zu verpassen und über I2C / TWI zu betreiben. Das zu bauen bekomme ich 
bestimmt hin, was ich mich frage ist, wie das mit den Tastern gehen 
soll. Dann muss die Platine ja beim Tastendruck proaktiv dem "Haupt-µC" 
bescheid geben, wenn eine Taste gedrückt wurde gibt es ja noch den 
Unterschied zwischen lange und kurz. Wennn der Controller dann die ganze 
Zeit sendet ist das wohl nicht so gut. Würde man dass dann mit einer 
zusätzlichen Leitung machen, die dann sagt jetzt wird gerade eine Taste 
gedrückt, bitte Abfrage starten welche und wie lange? Wer weiß Rat...!?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Tino Kühn schrieb:
> Zeit sendet ist das wohl nicht so gut. Würde man dass dann mit einer
> zusätzlichen Leitung machen, die dann sagt jetzt wird gerade eine Taste
> gedrückt, bitte Abfrage starten welche und wie lange? Wer weiß Rat...!?

 Wie willst du 4 Taster mit einer Leitung abfragen ?
 4 Taster = 4 Leitungen, mit weniger gehts nicht,  4 Taster multiplexen
 sparrt auch keine Leitung.
 Jeder der 4 Taster schaltet nach Masse, Pullup drauf, PCINT nehmen.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

um GND und VCC kommst eh nciht herum. Display könntest über i2c 
ansprechen (mach ich immer so), macht 4 leitungen.

taster könntest du "analogmultiplexen", d.h. über einen Spannungsteiler 
mit "geschaltenen" Widerständen das teilerverhältnis ändern, und mit 
einer Leitung an den ADC. Das funktioniert erstaunlich gut, mit etwas 
gehiernschmalz kriegt man sogar gleichzeitiges Drücken mehrerer tasten 
mit.

Das wären dann 5 leitungen...

von Tino K. (blumengiesser)


Lesenswert?

Michael Reinelt schrieb:
> um GND und VCC kommst eh nciht herum. Display könntest über i2c
> ansprechen (mach ich immer so), macht 4 leitungen.
>
> taster könntest du "analogmultiplexen", d.h. über einen Spannungsteiler
> mit "geschaltenen" Widerständen das teilerverhältnis ändern, und mit
> einer Leitung an den ADC. Das funktioniert erstaunlich gut, mit etwas
> gehiernschmalz kriegt man sogar gleichzeitiges Drücken mehrerer tasten
> mit.
>
> Das wären dann 5 leitungen...

Wie gesagt, ich möchte so wenig Leitungen wir möglich, sprich das ganze 
Tasterabfragen über den dann auf der Display-/Tasterplatine enthaltenen 
µC machen. Was übrig bleibt wird dann natürlich VCC, GND und SDA, SCL 
sein. Was ich mich ja frage ist, wie das mit dem Tastendruck 
fuktionieren soll. Sprich was macht mein µC in diesem Falle. Sendet er 
oder wartet er bis er gefragt wird ob was gedrückt wurde? Man könnte wie 
gesagt eine Stuerleitung nehmen, über die signalisiert wird das gerade 
Tasten gedrückt wird/wurden... Aber ist das die richtige Lösung?

von Karl H. (kbuchegg)


Lesenswert?

Tino Kühn schrieb:

> soll. Dann muss die Platine ja beim Tastendruck proaktiv dem "Haupt-µC"
> bescheid geben, wenn eine Taste gedrückt wurde

Eines der wesentlichen Prinzipien bei I2C (oder TWI, wie es bei Atmel 
heisst) besteht darin, das es einen Master gibt, der immer und zu allen 
Zeiten das Sagen hat.
D.h. deine Platine gibt nicht (zumindest nicht bei I2C) Bescheid, dass 
eine Taste gedrückt wurde, sondern der Master befragt die Platine, ob es 
einen Tastendruck gegeben hat.

Die Platine hat natürlich die Möglichkeit über eine zusätzliche Leitung 
(die nicht Teil vom I2C ist) auf sich aufmerksam zu machen. Und das wird 
auch oft so gemacht. Beim Master landet diese Leitung entweder auf einem 
Eingangspin oder sie kann zb einen Interrupt auslösen. Aber egal wie, 
die I2C Kommunikation wird vom Master aus angeleiert.

> gibt es ja noch den
> Unterschied zwischen lange und kurz.

Ein weiteres Merkmal von typischen I2C Szenarien ist es, dass sich der 
Master den Client als eine Sammlung von Registern vorstellt. D.h. der 
Master tut einfach so, als ob der Client adressierbare Speicherzellen 
(die Register) hätte, in denen er alles was ihn interessiert vorfindet.
In deinem Fall, mit 4 Tastern würde es sich zb anbieten, ein 8 Bit 
Register zur Verfügung zu stellen, welches der Master auslesen kann und 
in dem 2 Bits für jede Taste reserviert sind. Das eine Bit sagt aus, ob 
die Taste gedrückt wurde, das andere Bit sagt aus, ob es sich um einen 
kurzen oder einen langen Tastendruck gehandelt hat. (Wobei natürlich das 
Problem entsteht, dass jeder lange Tastendruck irgendwann mal als kurzer 
Tastendruck begonnen hat. Aber das Problem hast du bei derartigen Sachen 
immer und es ist auch unabhängig von I2C).

> Wennn der Controller dann die ganze
> Zeit sendet ist das wohl nicht so gut.

Der Controller kann nicht die ganze Zeit senden. Das geht prinzipiell 
schon mal gar nicht. Er ist nicht Master und kann daher den Bus nicht 
für sich in Anspruch nehmen. Die Gewalt über den Bus liegt beim Master 
und er ist es auch, der den Takt generiert, der den Bus letztendlich 
antreibt.

> Würde man dass dann mit einer
> zusätzlichen Leitung machen, die dann sagt jetzt wird gerade eine Taste
> gedrückt, bitte Abfrage starten welche und wie lange? Wer weiß Rat...!?

Im Prinzip ist das ein mögliches Szenario. Ich würde das etwas 
allgemeiner formulieren, und die Taste aussen vor lassen. 'Am Client ist 
etwas passiert, was möglicherweise eine Aktion vom Master erfordert'. 
'Eine Taste wurde gedrückt (oder losgelassen), fällt dann automatisch 
mit hinein.

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Karl Heinz schrieb:
> D.h. deine Platine gibt nicht (zumindest nicht bei I2C) Bescheid, dass
> eine Taste gedrückt wurde, sondern der Master befragt die Platine, ob es
> einen Tastendruck gegeben hat.

 So wie ich das verstanden habe, ist auf der Platine nur sein Display,
 welches er mit Mikrocontroller verbinden will und zwar so, dass er
 weniger Leitungen braucht ?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:

>> gibt es ja noch den
>> Unterschied zwischen lange und kurz.
>
> Ein weiteres Merkmal von typischen I2C Szenarien ist es, dass sich der
> Master den Client als eine Sammlung von Registern vorstellt.
> ....


Sieh dir einfach mal ein paar I2C Chips an, wie die das machen. Dann 
wird das Prinzip schnell klar.

Ich hab mal willkürlich einfach einen ADC-Wandler ausgewählt
http://www.analog.com/static/imported-files/data_sheets/AD7992.pdf
(ab Seite 17 im PDF)

Aus logischer Sicht stellt der IC einfach einen Satz Register bereit, in 
die der Master schreiben kann oder aus denen er Lesen kann. Je nach 
Register sind da unterschiedliche Dinge in den Register wie zb 
Konfigurationsdaten oder auch die Ergebnisse der Wandlungen, die der IC 
zuletzt vorgenommen hat.
Wie diese Werte dann letzten Endes zustande kommen, bzw. wie 
geschriebenes innerhalb des IC weiter verwendet wird, ist nicht das 
Problem des Masters. Für ihn besteht der ADC-Wandler lediglich aus einem 
Satz Register in die er Werte schreibt bzw. von wo er sich Werte abholt.

: Bearbeitet durch User
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Es geht natürlich so wie von Karl Heinz beschrieben. Aber - nur wegen 
vier Tastern einen eigenen uC? Wenn du Erweiterungen planst, kann das 
sinnvoll sein. Wenn nicht - eine Leitung mehr, analog-multiplexen wie 
oben beschrieben. macht die Sache signifikant einfacher.

Anderersets - wenn schon eigener uC, dann könntest gleich Display 
enable/disable damit abdecken, und sogar Backlight-Helligkeit per PWM 
steuern.

von Karl H. (kbuchegg)


Lesenswert?

Michael Reinelt schrieb:
> Es geht natürlich so wie von Karl Heinz beschrieben.

Die Idee, da I2C einzusetzen, ist ja von ihm gekommen.

Man könnte da ja auch zb eine UART nehmen, das ganze als Serielle 
Verbindung ansehen und damit so etwas wie ein 'Terminal für Arme' bauen.

Möglichkeiten gibt es viele.

> Aber - nur wegen
> vier Tastern einen eigenen uC? Wenn du Erweiterungen planst, kann das
> sinnvoll sein. Wenn nicht - eine Leitung mehr, analog-multiplexen wie
> oben beschrieben. macht die Sache signifikant einfacher.

Auch ein Weg.

> Anderersets - wenn schon eigener uC, dann könntest gleich Display
> enable/disable damit abdecken, und sogar Backlight-Helligkeit per PWM
> steuern.

Eben. Ab einer gewissen Komplexität kann es sich lohnen, der Peripherie 
eine gewisse Eigenintelligenz zu verpassen. Kann, muss aber nicht.
Die Entscheidung liegt bei ihm.

von Tino K. (blumengiesser)


Lesenswert?

Also die Platine wie auf dem Bild ist natürlich nur der Träger und das 
mit der Ansteuerung und den Kabeln ist fix. Ich wollte eine neue machen 
(v0.2), damit es nicht so kompliziert mit den ganzen Kabeln ist. Wenn 
ich das lese was Karl Heiz geschrieben hat, so war ich schon auf dem 
richtigen Weg. Das der Slave natürlich nicht einfach so senden darf war 
mir erst beim durchlesen wieder bewußt. Natürlich werden alle Befehle, 
wie dimmen, on/off und Tastenabfragen zentral über einen µC gemacht.

Vielen Dank für die Unterstützung!

von c-hater (Gast)


Lesenswert?

Tino Kühn schrieb:

> Dann muss die Platine ja beim Tastendruck proaktiv dem "Haupt-µC"
> bescheid geben

Das Problem besteht also im Kern in der starren Rollenverteilung 
Master<->Slave.

Ich würde deswegen gleich mal die I2C-Idee beerdigen und auf UART 
setzen.

Spart die Taktleitung und macht sie als Leitung für die zweite 
Datenrichtung verfügbar, womit jeder seinen Dreck loswerden kann, wann 
immer er anfällt. Ohne jeden Programmieraufwand ist jeder Partner so 
gleichzeitig Master und Slave.

von Tino K. (blumengiesser)


Lesenswert?

c-hater schrieb:
> Tino Kühn schrieb:
>
>> Dann muss die Platine ja beim Tastendruck proaktiv dem "Haupt-µC"
>> bescheid geben
>
> Das Problem besteht also im Kern in der starren Rollenverteilung
> Master<->Slave.
>
> Ich würde deswegen gleich mal die I2C-Idee beerdigen und auf UART
> setzen.
>
> Spart die Taktleitung und macht sie als Leitung für die zweite
> Datenrichtung verfügbar, womit jeder seinen Dreck loswerden kann, wann
> immer er anfällt. Ohne jeden Programmieraufwand ist jeder Partner so
> gleichzeitig Master und Slave.

Klingt logisch. Wenn ich mir die ganzen Produkte bei Adafruit und Co. 
anschaue dann gibs dort aber immer nur I2C und nicht UART. Woran 
liegt's?

von c-hater (Gast)


Lesenswert?

Tino Kühn schrieb:

> Klingt logisch. Wenn ich mir die ganzen Produkte bei Adafruit und Co.
> anschaue dann gibs dort aber immer nur I2C und nicht UART. Woran
> liegt's?

Doofe Frage.

Die haben wohl mehrheitlich keine Taster. Genau das hat dich ja wohl 
animiert, welche dranstricken zu wollen...

von Tino K. (blumengiesser)


Lesenswert?

So, ich erstelle gerade die Platine und auch die Software für den 
Controller. Ich fange einfacher an, sprich mit Befehlen die per RX/TX 
versendet werden. Was mich zunächst interessiert, wie würde ich meinen 
Befehl beginnen? Sprich was sende ich an das Display damit es weiß das 
es gemeint ist? Und wie trenne ich dann zwischen Daten und Befehlen?

von Crazy Harry (crazy_h)


Lesenswert?

Du könntest gleich das Display an einen PCA9555 hängen 
(I2C-16Bit-I/O-Port-Expander) und hast gleich noch ein paar Pins für 
Tasten übrig.

von Tino K. (blumengiesser)


Lesenswert?

So, die Platine mit Atmega8 drauf ist da und funktioniert auch schon. 
Nun soll die Software zum Leben erweckt werden. Sprich die Logik damit 
auf RX und TX reagiert wird. Das Display soll ja unterschiedlich 
reagieren, entweder Text darstellen oder Befehle abarbeiten. Ich habe 
ein altes serielles Display und da beginnen die Befehle mit '27&' danach 
ein Buchstabe für den Befehl und dann evtl. noch ein Wert. Text wurde so 
geschickt. Frage: Ist das zweckmäßig oder ist das eher doof. Hat jemand 
eine gute bessere Idee? Danke für Tips und Hinweise...

von Tino K. (blumengiesser)


Lesenswert?

Tino Kühn schrieb:
> So, die Platine mit Atmega8 drauf ist da und funktioniert auch schon.
> Nun soll die Software zum Leben erweckt werden. Sprich die Logik damit
> auf RX und TX reagiert wird. Das Display soll ja unterschiedlich
> reagieren, entweder Text darstellen oder Befehle abarbeiten. Ich habe
> ein altes serielles Display und da beginnen die Befehle mit '27&' danach
> ein Buchstabe für den Befehl und dann evtl. noch ein Wert. Text wurde so
> geschickt. Frage: Ist das zweckmäßig oder ist das eher doof. Hat jemand
> eine gute bessere Idee? Danke für Tips und Hinweise...

Soory, das 27  ist der Escape Carakter und das & (UND)  ist ein ASCII 
Zeichen

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.