Forum: Mikrocontroller und Digitale Elektronik Grundlegende Fragen eines Newbie - irq - tasten und schalten


von Mark H. (madmaxxx)


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

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.

von Hans K. (Gast)


Lesenswert?

>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

von Mark H. (madmaxxx)


Lesenswert?

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

von NopNop (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.