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
Co Corres schrieb: > Vielen Dank für hilfreiche Ansätze. Was willst du speziell? Was hast du bereits?
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.
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
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
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.
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) } }
> PORTC = 0b00000001
ich wüsste nicht, dass es in C geht (Binäre schreibweise)..
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).
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.
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]; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.