www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gaswarnanlage Tiefgarage


Autor: Co Corres (coco_sabo)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Co Corres schrieb:
> Vielen Dank für hilfreiche Ansätze.

Was willst du speziell? Was hast du bereits?

Autor: Co Corres (coco_sabo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frag mal deinen Lehrer!

Autor: Jochen S. (jochen_s)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mahner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Co Corres (coco_sabo)
Datum:

Bewertung
0 lesenswert
nicht 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)
  }
}

Autor: pcb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PORTC = 0b00000001

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

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
A B C D | T
0 0 0 0   0
0 0 0 1   0
0 0 1 0   0
0 0 1 1   1
0 1 0 0   0
0 1 0 1   1
0 1 1 0   1
0 1 1 1   1
1 0 0 0   0
1 0 0 1   1
1 0 1 0   1
1 0 1 1   1
1 1 0 0   1
1 1 0 1   1
1 1 1 0   1 
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:
uint8_t T[] = { 
/*0 0 0 0*/ 0,
/*0 0 0 1*/ 0,
/*0 0 1 0*/ 0,
/*0 0 1 1*/ 1,
/*0 1 0 0*/ 0,
/*0 1 0 1*/ 1,
/*0 1 1 0*/ 1,
/*0 1 1 1*/ 1,
/*1 0 0 0*/ 0,
/*1 0 0 1*/ 1,
/*1 0 1 0*/ 1,
/*1 0 1 1*/ 1,
/*1 1 0 0*/ 1,
/*1 1 0 1*/ 1,
/*1 1 1 0*/ 1, 
/*1 1 1 1*/ 1,
};

InPort |= 0x0F;  /* aus maskieren von nicht gebrauchten Bits*/
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.

Autor: Co Corres (coco_sabo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke!werde es so auch mal versuchen.

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
uint8_t T[] = { 
/*0 0 0 0*/ 0b00000001,
/*0 0 0 1*/ 0b00000001,
/*0 0 1 0*/ 0b00000001,
/*0 0 1 1*/ 0b11111111,
/*0 1 0 0*/ 0b00000001,
/*0 1 0 1*/ 0b11111111,
/*0 1 1 0*/ 0b11111111,
/*0 1 1 1*/ 0b11111111,
/*1 0 0 0*/ 0b00000001,
/*1 0 0 1*/ 0b11111111,
/*1 0 1 0*/ 0b11111111,
/*1 0 1 1*/ 0b11111111,
/*1 1 0 0*/ 0b11111111,
/*1 1 0 1*/ 0b11111111,
/*1 1 1 0*/ 0b11111111,
/*1 1 1 1*/ 0b11111111,

InPort |= 0x0F;
PORTC = T[InputPort];


Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: coco_sabo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.