Hallo Zusammen, ich habe mich nun einige Tage in das Thema eingelesen und benötige noch einige Tips bzw. Erfahrungen. Ich bebsichtige eine Haussteuerung auf dem C-Control Pro mit I2C-Bus. Ca. 30 Eingänge von Tastern, ca. 8 Bewegungsmelder, 12 Temparatursensoren, 4 Luftfeuchtemesser und Schalten von ca. 40-50 Komponenten. Ansteuerung eines Displays, Einlesen Kartenleser und Übergabe von Statusinformationen auf den rs232 Port. Taster: Wenn ich einen I/O Port bzw. einen I/O eines PCF8574 lese dann muss der Prozessor ja exakt in dem Moment in dem ein Taster gedrückt wird, diesen Port abfragen. Um diesen Zeitraum etwas zu verlängern ist da ein R C Glied als Vorschaltung sinnvoll? Oder halten das die Bausteine bis zur Abholung bereit. Programmlauf: Ich denke ich frage alle Ports/Fühler in einer Schleife ab. Der Mikrocontroller kann 18000 Operationen pro Sekunde Abfragen. Das Sollte ja reichen um innerhalb einer Sekunde auch viele Eingänge abzufragen. Ist das die gängige Vorgehensweise? IRQ: Wenn ich einen Interrupteingang benutze, dann wird der aktuelle Ablauf gestoppt und der Prozessor macht die Iterruptroutiene durch und im Anschluß wird das Programm wieder fortgesetzt. Wenn ich nun 2-3 wichtige Ereignisse z.B. von einem Kartenleser, IO, Sensor habe, kann ich dann mit Dioden mehrere IRQ von I2C Portbausteinen auf einen IRQ meines Prozessors legen? Ja ich weiss, dass ich dann nicht weiss wer den interrupt geschickt hat. Ist ja nicht problematisch dann die drei Sachen nacheinander abzufragen. Prellen von Tasten bzw zu schnelle CPU. Wie geht Ihr da vor. Es kann ja sein, dass jemand ein Licht "Eintastet" ich schlate das Licht ein und ich bin so schnell, dass ich wieder an der Abfrage des gleichen Ports bin und nun wieder eine 1 erkenne und das Licht wieder ausschalte. Wie mache ich das. Immer eine Pause von 1 Skunde nach jedem Schaltvorgang? Ich weiss die Fragen scheinen etwas kurrios für einen Experten. Hatte leider in der Elektronikausbildung nichts mit Controllern gebaut. Danke vorab! Und weiter so - hier stecken echt Schätze in den Dokumenten und Artikeln. Mark
Tasten fragt man mit einem Timer zB alle 10ms ab und entprellt so auch. Dh eine neuer Zustand wird erst akzeptiert, wenn der neue zustand mindestens zwei Zyklen lang anliegt. Am Einfachsten arbeitet man mit einer Zustandsmaschine, in Code.
>Ich bebsichtige eine Haussteuerung auf dem C-Control Pro mit I2C-Bus. In meinen Augen schon mal völlig ungeeignet, wenn es anscheinend trotzdem schon Leute gegeben hat die sowas gemacht haben: http://www.mikrocontroller.net/articles/I2C_als_Hausbus In solchen Sachen würde ich eher auf CAN oder RS485 setzen. Durch die differenzielle Übertragung bei weitem nicht so störanfällig. Zusätzlich noch CSMA-CR bei CAN. Grüße Hans
Hallo, danke Dir für den Hinweis. Habe diesen Bericht schon gelesen. Ich werde evtl. einen CAN Bus einbauen. Im C-Control Pro ist halt schon ein I2C eingebaut. Aber es gibt eine CAN-BUS Bibliothek für den C-Control Pro. Dann muss man auch irgendwie einen CAN Schnittstelle ansprechen können, bzw. mit dem geeigneten Portbaustein aufbauen können. Den I2C ist für 90% meiner Funktionen ausreichend, da die Module in unmittelbarer nähe meine Steuereinheit sind. Meine Taster und Bewegunsmelder wie auch die Tempfühler kann ich per Draht heranführen. Ich habe mich auch vom Hausbus verabschiedet. Ich habe keine Aktoren für den Hausbus eingeplant. Und falls doch, gibts ne Schaltung, die diesen KNX anspricht. Licht hat bei mir Niederspannung. Ist schon wichtig, dass keine Fehler passieren. Bei I2C gibts halt bereits so viele Module und Portbausteine. Ich scanne mal nach dem Can Bus. Danke ich werde weiter berichten, wie es mir geht. Der C-Control sollte aber geeignet sein eine Haussteuerung zu realisieren? Gruss
Mark H. schrieb: > Der C-Control sollte aber geeignet sein eine Haussteuerung zu realisieren? So wie ich das sehe steckt da ja sowieso nur ein ATMEGA32 bzw. 128 dahinter. Da kann man schon einiges machen. Wobei es den ATMEGA128 für um die 9 Euro gibt. Da dann noch nen MCP2515 dran für 1,50 Euro und man kann einen CAN-Bus aufbauen. Oder gleich nen AT90CAN für 8 Euro und nen CAN-Tranciever alla MCP2551 oder PCA82C250 für nen Euro. Wie gesagt, I2C ist für mich immernoch eine Lösung wenn die Strecke nur 1-2m betragen. Für größere Entfernungen würde ich was anderes nehmen wie CAN oder RS485. In letzter Zeit hab ich auch mal mit dem TMS320F28016 geliebäugelt. Der hat deutlich mehr Bums was die Geschwindigkeit angeht, 2 CAN-Schnittstellen, DMA, usw....und kostet nur 7 Euro. Was ich damit sagen wollte: Wenn Du Dich in der Materie etwas auskennst und Dir die Bauteile selbst zusammensuchst bzw. Platinen selber machst, kommst Du da deutlich günstiger davon.
Mark H. schrieb: > Taster: Wenn ich einen I/O Port bzw. einen I/O eines PCF8574 lese dann > muss der Prozessor ja exakt in dem Moment in dem ein Taster gedrückt > wird, diesen Port abfragen. Prinzipiell schon richtig. Aber der Vergleich hinkt. Das ist in etwa so, wie wenn du sagst, du hast ein Problem damit, eine Schnecke beim Betreten eines Salatblattes zu beobachten, weil du ja exakt in dem Moment hinsehen musst. Aus Sicht deines µC ist alles was du als Mensch machst, in extremer Zeitlupe. So schnell kannst du eine Taste gar nicht drücken und loslassen, dass das dein µC (richtig programmiert) nicht viele tausend male mitkriegt. > Prellen von Tasten bzw zu schnelle CPU. Wie geht Ihr da vor. Es kann ja > sein, dass jemand ein Licht "Eintastet" ich schlate das Licht ein und > ich bin so schnell, dass ich wieder an der Abfrage des gleichen Ports > bin und nun wieder eine 1 erkenne und das Licht wieder ausschalte. Wie > mache ich das. Immer eine Pause von 1 Skunde nach jedem Schaltvorgang? Nein. Du willst keinesfalls Pausen haben. Wenn das ein Schalttaster ist (also jeweils ein Tastendruck einen SChaltvorgang auslöst bzw. rückgängig macht), dan akzeptierst du den nur dann, wenn die Taste zwischendurch auch wieder losgelassen wurde. AM einfachsten geht das, indem du erst mal feststellst, dass sich an diesem Tastereingang etwas verändert hat. Dazu merkst du dir einfach den Zustand und vergleichst den neu eingelesenen Wert mit diesem gemerkten Zustand. Nur dann wenn sie nicht gleich sind, hat sich an diesem Eingang etwas getan. Entweder ist die Taste gedrückt worden oder die ist losgelassen worden. Welches von beiden kannst du am aktuellen Zustand feststellen: Ist der 1, dann ist die Taste gedrückt worden; ist der 0, dann losgelassen. Losgelassen interessiert dich nicht, das ignorierst du. Und im Falle von gedrückt: dann schaltest du was auch immer du zu schalten hast Pseudocode unsigned char alterZustand; unsigned char neuerZustand; .... while( 1 ) { // die obligate Hauptschleife neuerZustand = Tastenzustand_feststellen; if( neuerZustand != alterZustand ) { // hat sich was verändert? // ja, hat es // gedrückt oder losgelassen? if( neuerZustand == Taster_auf_ein ) { // also gedrückt: mach was schalte Licht um } alterZustand = neuerZustand; } .... }
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.