Forum: Mikrocontroller und Digitale Elektronik OOP Modelierung I2C Bus


von Michael Thielmann (Gast)


Lesenswert?

Hallo zusammen,
ich hoffe ich bin im richtigen Unterforum gelandet.

Ich bin gerade dabei eine Lichtsteuerung mit dem Raspberry Pi 
aufzubauen.
Hardwaremäßig sind dabei 30 Stromstoßrelais an vier MCP23017 
Portexpandern angeschlossen. Pro Portexpander sind es jeweils 8 
Schaltausgänge und 8 Rückmeldekontakte.

Nun stellt sich mir die Frage, wie ich das Ganze sinnvoll in Objekte 
verpacke, da ich nicht weiß, wie ich mit em I2-Bus umgehen soll.

Angenommen ich habe eine Klasse Lampe mit den Attributen Adresse und 
Status, sowie den Methoden an und aus. Lese ich dann in der Klasse Lampe 
den entsprechenden MCP via dem I2C-Bus aus und verwerfe die restlichen 
sieben Bits (Der MCP liefert ja den Wert für einen kompletten Port 
zurück). Oder gibt es eine Klasse I2C-Bus die alles händelt und dann die 
Daten über eine Methode an die Klasse Lampe ausliefert?

Ich hoffe ihr könnt mir helfen

Vielen Dank
Michael

: Verschoben durch User
von Georg A. (georga)


Lesenswert?

> Nun stellt sich mir die Frage, wie ich das Ganze sinnvoll in Objekte
> verpacke, da ich nicht weiß, wie ich mit em I2-Bus umgehen soll.

Und du glaubst, mit Objekten wird es dann einfacher, wenn du nicht 
verstehst, wie die I2C-Kommunikation mit den Einzeldevices geht?

In der Zeit, in der du das Posting getippt hast, hätte ich die zwei 
objektfreien Funktionen zum Ansteuern bzw. Auslesen schon längst 
geschrieben. Sind wenn's hochkommt, mit I2C-Init so 15-20 Zeilen.

Ganz im Ernst: Machs erst mal ganz altmodisch prozedural hingehackt. 
Dann kannst du dir immer noch überlegen, ob und wie du da am 
sinnvollsten ein paar Klassen drumrumbaust.

von Pandur S. (jetztnicht)


Lesenswert?

Objekte und Klassen sind gut zur Abstraktion, Einkapselung, 
Mehrfach-instanzierung.

Hier ist die Funktionalitaet aber nur ein paar Byte lesen odr schreiben. 
Mehrfach instanzierung geht, den jede Instanz hier ist eine Resource, 
die nicht geteilt werden kann.

Wie schon gesagt, verstehe worums bei I2C geht uns lass die Objekte 
sein.

von Ulrich F. (Gast)


Lesenswert?

Egal ob OOP, oder klassisch Prozedural....
Am Ende wird da eine Ablaufsteuerung bei rum kommen.
Ein Endlicher Automat. (oder ein kleines Nest solcher Automaten)

Mein Tipp:
Orientiere dich an dem, wie es die SPS Leute machen.
1. Eingangsbild lesen
2. Verarbeitung
3. Ausgangsbild schreiben

von Robin R. (Gast)


Lesenswert?

Also ich würde mir eine Klasse für den I2C-Bus-Zugriff schreiben,
welche das gesamte I2C-Zeugs kapselt. Dann am besten eine zweite
Klasse für den Portexpander und das setzen der Kontakte / einlesen
der Rückmeldekontakte. Diese Klasse bekommt dann eine Referenz
auf eine I2C-Instanz zur Kommunikation.

Basierend auf diesen beiden Klassen kannst du dann bspw. direkt
in main() bzw. auf verschiedene Funktionen aufgeteilte Anwendungslogik
schreiben.

Erzeuge deine Objekt-Instanzen am besten statisch beim Programmstart
und nicht "immer wieder".

Das wichtige bei OOP ist nicht unbedingt die reale Welt 1:1 nach
zu modellieren. Sondern die Struktur/Architektur des Systems
an sich möglichst gekapselt, modular und wiederverwendbar zu verpacken.

Letztendlich ist es auch die Frage aus welcher Richtung man die
Anwendung strukturiert und aufbaut. Top-Down oder Bottom-Up.
Ich tendiere eher zu Bottom-Up-Entwicklung, insbesondere wenn sich
die Ansteuerung anderer Systemkomponenten gut kapseln lässt.
Ab einem bestimmten Punkt Schwenk ich dann meist um, und setze
das aktuell anstehende Problem aus den erzeugten "Bausteinen"
zusammen.

von Tim S. (tim_seidel) Benutzerseite


Lesenswert?

Wie Robin schon schreibt.
Baue dir eine einfache I2C Klasse, die die Hardware ansteuerung macht. 
Überlege dir, ob du eventuell hier schon auf ein Interface setzen 
willst, weil später mal Software-I2C hinzukommt.

Gebe dieser Klasse nicht allzuviel Intelligenz.
Für I2C sollten in den allermeisten Fällen Initialize, Read, Write und 
WriteRestartRead ausreichen.

Zudem würde ich mir überlegen, was der Portexpander mit den anderen GPIO 
Pins gemeinsam hat, die du evtl. auch nutzen wirst für die LEDs oder 
andere Peripherie.

von Michael Thielmann (Gast)


Lesenswert?

Vielen Dank für die Antworten (kam durch neuen Job erst jetzt zum 
Antworten).
Ich freue mich immer, wenn erstmal los gemeckert wird.

Ich habe nach der Modelierung des I2C-Busses gefragt und bekomme dann 
Antworten, wie lerne erstmal wie du den I2C-Bus ansteuerst. Dies ist mir 
durchaus bewusst, prozedural ist es auch funktionsfähig.
Deshalb die explizite Frage nach der Modelierung!

@Robin R. und Tim Seidel, das helft mir schon weiter

Vielen Dank
Michael

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.