Forum: Mikrocontroller und Digitale Elektronik Gaswarnanlage Tiefgarage


von Co C. (coco_sabo)


Lesenswert?

Hallo! Haben eine kurze frage an die Profis zur Umsetzung der folgenden 
Problemstellung.

In einem Parkhaus werden 4 Gaswarnsensoren abgefragt.Bei Ansprechen von 
mindestens 2 Sensoren (logisch 1)wird eine Ampel geschaltet.. Vielen 
Dank für hilfreiche Ansätze.

: Verschoben durch Moderator
von Floh (Gast)


Lesenswert?

Co Corres schrieb:
> Vielen Dank für hilfreiche Ansätze.

Was willst du speziell? Was hast du bereits?

von Co C. (coco_sabo)


Lesenswert?

hatte bereits die idee irgendeine variable durch Schalten der 
entsprechenden Eingänge um jeweils 1 zu erhöhen und dann diesen wert 
durch >= bedingungen abzufragen. Dadurch würde dann die Ampel auf rot 
umschalten wenn eine gewisse anzahl von bits gesetzt ist. Beim Schalten 
eines bits wird jedoch die additionsschleife dauerhaft ausgeführt und es 
kommt zu einem "speicherüberlaf" da immer wieder 1 addiert wird solange 
der Eingang "Sensor" ansteht.

von Klaus (Gast)


Lesenswert?

Frag mal deinen Lehrer!

von Jochen S. (jochen_s)


Lesenswert?

while(1)
{
Anzahl=0;
if Eingang1==1 Anzahl++;
if Eingang2==2 Anzahl++;
if Eingang3==1 Anzahl++;
if Eingang4==1 Anzahl++;

if Anzahl >= 2 Ampel=1;
if Anzahl <2 Ampel=0;
}

Für Sytaxfehler übernehme ich keine Haftung

von Mahner (Gast)


Lesenswert?

Co Corres schrieb:
> Hallo! Haben eine kurze frage an die Profis zur Umsetzung der folgenden
> Problemstellung.
>
> In einem Parkhaus werden 4 Gaswarnsensoren abgefragt.Bei Ansprechen von
> mindestens 2 Sensoren (logisch 1)wird eine Ampel geschaltet.. Vielen
> Dank für hilfreiche Ansätze.

Angesehen von auf einem Mikrocontroller mit entsprechender Software 
basierenden Lösungen, mit gängigen Bauteilen bspw. so:

 6x 2-Input-NAND-Gatter
 1x 6-Input-NAND-Gatter (oder 8-Input-NAND, 2x Input auf PullUp)

Auf die Eingänge der sechs 2er-NANDs werden sämtliche alarmrelevanten 
2er-Kombinationen der Active-Hi-Sensorleitungen 1 bis 4 gelegt (1/2, 
1/3, 1/4, 2/3, 2/4, 3/4), die Ausgänge der 2er-NANDs werden mit den 
sechs Eingängen des 6(8)er-NANDs verbunden, dessen Ausgang das "2 aus 
4"-Alarmkriterium mit "High" signalisiert.

SCNR:

Wessen sprachliche Fähigkeiten aber offensichtlich nicht einmal 
ansatzweise genügen, einen simplen Fragesatz korrekt zu formulieren, 
sollte vielleicht zu unserer aller Sicherheit daran gehindert werden, an 
Einrichtungen herumzufricklen, von deren fehlerfreier Funktion 
Menschenleben abhängen können...

MfG

von U.R. Schmitt (Gast)


Lesenswert?

Co Corres schrieb:
> In einem Parkhaus werden 4 Gaswarnsensoren abgefragt.Bei Ansprechen von
> mindestens 2 Sensoren (logisch 1)wird eine Ampel geschaltet.. Vielen
> Dank für hilfreiche Ansätze.

Ja und? Welche der 2000000000 Möglichen Lösungen hättest Du gerne?
Mir würde ine Widerstandsnetzwerk, ein OP, Transistor und Relais am 
besten gefallen.
Ne Schützsteuerung wäre auch nicht uninteressant.
Oder vieleicht mit nem µC? Was für einen? Nen 6502, oder vieleicht ein 
Z80?
Programmierst Du in LISP, oder ADA?
Ach so, es soll mit Logikgattern gelöst werden.

Wenn dir schon jemand deine Hausaufgaben machen soll. dann gib ihm 
wenigstens die Chanche das zu tun indem Du zumindest sagst WAS du hast 
und mit WELCHEN MITTELN du das lösen willst.

Und wenn Dir jemand deine Hausaufgaben gemacht hat, dag bitte auch 
Danke.

von Co C. (coco_sabo)


Lesenswert?

Es handelt sich lediglich um eine Übungsaufgabe, ich entschuldige die 
fehlenden sprachlichen Fähigkeiten und die nicht ganz ausformulierte 
Problemstellung;)

Vielen dank für die schnellen Reaktionen.

Hier die Lösung:



#include <avr/io.h>   // Ein-Ausgabedatei
#include <util/delay.h>



int Anzahl;




int main()    // Hauptfunktion
{

DDRC=0b11111111;  //Datenrichtungsregister Ausgang
DDRA=0b00000000;  //Datenrichtungsregister Eingang


  while(1)
  {
  Anzahl=0;
  if  (!(PINA & (1<<PINA7)))  {Anzahl++;}
  if  (!(PINA & (1<<PINA6)))  {Anzahl++;}
  if  (!(PINA & (1<<PINA5)))  {Anzahl++;}
  if  (!(PINA & (1<<PINA4)))  {Anzahl++;}

    if (Anzahl >= 2)
    {
      PORTC = 0b11111111; //rot;
    }
    if (Anzahl <2)
    {
      PORTC = 0b00000001; //gruen
    }
    _delay_ms(100); // Zeit um Flackern des Ausgangs zu vermeiden (LED 
zu dunkel)
  }
}

von pcb (Gast)


Lesenswert?

> PORTC = 0b00000001

ich wüsste nicht, dass es in C geht (Binäre schreibweise)..

von Klaus (Gast)


Lesenswert?

pcb schrieb:
>> PORTC = 0b00000001
>
> ich wüsste nicht, dass es in C geht (Binäre schreibweise)..

Tja, dann hast du wohl gerade wieder was gelernt... (Es geht beim 
avr-gcc, auch wenn das eine Nicht-Standard-Erweiterung ist).

von Imon (Gast)


Lesenswert?

Co Corres schrieb:
> In einem Parkhaus werden 4 Gaswarnsensoren abgefragt.Bei Ansprechen von
> mindestens 2 Sensoren (logisch 1)wird eine Ampel geschaltet.. Vielen
> Dank für hilfreiche Ansätze.
>
 das ganze klingt ein Wenig nach Boolesche algebra, wäre eine schöne 
Aufgabe um Schülern das Thema näher zu bringen. Ich Schlage Also Vor das 
du dich denn Thema genau so näherst. Auch wenn die Lösung wahrscheinlich 
in kleinen µC Brennen wirst. btw. gibt es eigentlich denn GAL16v8 noch ?

Deine Sensoren habe ich A,B,C,D gennannt und dann einfach einer 
Wahrheitstafel Ausgestellt. den Ausgang habe ich T gennannt
1
A B C D | T
2
0 0 0 0   0
3
0 0 0 1   0
4
0 0 1 0   0
5
0 0 1 1   1
6
0 1 0 0   0
7
0 1 0 1   1
8
0 1 1 0   1
9
0 1 1 1   1
10
1 0 0 0   0
11
1 0 0 1   1
12
1 0 1 0   1
13
1 0 1 1   1
14
1 1 0 0   1
15
1 1 0 1   1
16
1 1 1 0   1 
17
1 1 1 1   1

Wenn ich das nun Mittels KV Diagramm Eindampfe komme ich auf die Lösung

T = A&C | A&B | C&D | A&D | D&B | B&C

ob du das nun mit mittels Mikrocontroller umsetzt, oder jeweils 2 UND- 
(74xx08 ) und 2 ODER- (74xx32) Gatter nimmst das überlasse ich dir.
Eine Möglichkeit wäre es die Oben genannte Wahrheitstaffel als Tabelle 
zu nutzen, Wenn die Eingang der Sensoren auf denn 4 Niederwertigsten 
Bits  eines Ports liegen müsste das ziemlich einfach zu realisieren 
sein.

zum Beispiel:
1
uint8_t T[] = { 
2
/*0 0 0 0*/ 0,
3
/*0 0 0 1*/ 0,
4
/*0 0 1 0*/ 0,
5
/*0 0 1 1*/ 1,
6
/*0 1 0 0*/ 0,
7
/*0 1 0 1*/ 1,
8
/*0 1 1 0*/ 1,
9
/*0 1 1 1*/ 1,
10
/*1 0 0 0*/ 0,
11
/*1 0 0 1*/ 1,
12
/*1 0 1 0*/ 1,
13
/*1 0 1 1*/ 1,
14
/*1 1 0 0*/ 1,
15
/*1 1 0 1*/ 1,
16
/*1 1 1 0*/ 1, 
17
/*1 1 1 1*/ 1,
18
};
19
20
InPort |= 0x0F;  /* aus maskieren von nicht gebrauchten Bits*/
21
alarm=T[InPort]; /* in alarm steht nun eine 1 wenn zwei Eingange 1 sind*/

Andere hat man dir auch schon genannt. in den anderen Beiträgen.

von Co C. (coco_sabo)


Lesenswert?

danke!werde es so auch mal versuchen.

von Imon (Gast)


Lesenswert?

Mir fällt gerade auf wenn du satt der 0 und 1 in die Tabelle gleich den 
wert von PORTC Schreibst sparst du eine If abfrage
1
uint8_t T[] = { 
2
/*0 0 0 0*/ 0b00000001,
3
/*0 0 0 1*/ 0b00000001,
4
/*0 0 1 0*/ 0b00000001,
5
/*0 0 1 1*/ 0b11111111,
6
/*0 1 0 0*/ 0b00000001,
7
/*0 1 0 1*/ 0b11111111,
8
/*0 1 1 0*/ 0b11111111,
9
/*0 1 1 1*/ 0b11111111,
10
/*1 0 0 0*/ 0b00000001,
11
/*1 0 0 1*/ 0b11111111,
12
/*1 0 1 0*/ 0b11111111,
13
/*1 0 1 1*/ 0b11111111,
14
/*1 1 0 0*/ 0b11111111,
15
/*1 1 0 1*/ 0b11111111,
16
/*1 1 1 0*/ 0b11111111,
17
/*1 1 1 1*/ 0b11111111,
18
19
InPort |= 0x0F;
20
PORTC = T[InputPort];

von U.R. Schmitt (Gast)


Lesenswert?

Co Corres schrieb:
> while(1)
>   {
>   Anzahl=0;
>   if  (!(PINA & (1<<PINA7)))  {Anzahl++;}
>   if  (!(PINA & (1<<PINA6)))  {Anzahl++;}
>   if  (!(PINA & (1<<PINA5)))  {Anzahl++;}
>   if  (!(PINA & (1<<PINA4)))  {Anzahl++;}
>
>     if (Anzahl >= 2)
>     {
>       PORTC = 0b11111111; //rot;
>     }
>     if (Anzahl <2)
>     {
>       PORTC = 0b00000001; //gruen
>     }
>     _delay_ms(100); // Zeit um Flackern des Ausgangs zu vermeiden (LED
> zu dunkel)
>   }

Das sollte aber auch funktionieren.
Du setzt Anzahl bei jedem Durchlauf auf 0 und die Variable wird erhöht 
wenn... Moment da steht !(PINA & (1<<PINA7)) Also wird Anzahl erhöht 
wenn PINA7 nicht ungleich 0 ist, ich dachte bei logisch 1 am Sensor soll 
das passieren?

Vorschlag zur Verbesserung:
statt
if (Anzahl >= 2)
{
  PORTC = 0b11111111; //rot;
}
if (Anzahl <2)
{
  PORTC = 0b00000001; //gruen
}

schreibst du
if (Anzahl >= 2)
{
  PORTC = 0b11111111; //rot;
}
else
{
  PORTC = 0b00000001; //gruen
}

Und warum setzt du bei rot alle Portpins? da leuchtet doch grün auch 
noch.

von coco_sabo (Gast)


Lesenswert?

Rot und grün sind nur zur Visualisierung so gewählt.Es ist keine echte 
Ampel angeschlossen. Der logische Zustand 1 der Sensoren wird 
ausgewertet . Die else Schleife ist in der tat besser.

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.