Ich möchte folgendes realisieren: wenn Eingangspin-PC0 high ==> Licht leuchtet PD0 low(low aktiv) wenn Eingangspin-PC0 high und PC1-Taster gedrückt wurde ==> PDO (high)aus sofort stop so könnte es aussehen i=1; if (PINC & (1<<PC0)&&i)// also wenn an diesem PIN DauerHIGH&&Flagg gesetzt { i=0; (PORTD &= ~(1<<PINC0))// dann schalte die LAMPE ein(lowAktiv) } // wenn PC1 gedrückt wurde if (PINC &(1<<PC1)) i=1;//Flagg setzen WIE VEREINE ICH NUN DIESE SIGNALE VIELEN DANK DEN KREATIEVEN
Kenia schrieb: > Ich möchte folgendes realisieren: > > wenn Eingangspin-PC0 high ==> Licht leuchtet PD0 low(low aktiv) > wenn Eingangspin-PC0 high und PC1-Taster gedrückt wurde ==> PDO > (high)aus sofort stop Mit anderen Worten. Das Licht leuchtet nur dann, wenn gilt PCO ist high UND PC1 ist high in allen anderen Fällen ist das Licht aus. (Ich geh mal davon aus, das Taster gedrückt ein Low-Signal bedeutet) Wozu du da ein Flag brauchst sehe ich da überhaupt noch nicht. > WIE VEREINE ICH NUN DIESE SIGNALE > > VIELEN DANK DEN KREATIEVEN Na komm. So schwer ist das nicht. Da muss man ein bischen mit den logischen Operationen umgehen können. Und das musst du so und so irgendwann mal lernen. Also warum nicht hier und jetzt? Allerdings: In diesem Kauderwelsch
1 | i=1; |
2 | if (PINC & (1<<PC0)&&i)// also wenn an diesem PIN DauerHIGH&&Flagg |
3 | gesetzt |
4 | { |
5 | i=0; |
6 | (PORTD &= ~(1<<PINC0))// dann schalte die LAMPE ein(lowAktiv) |
7 | } // wenn PC1 gedrückt wurde |
8 | if (PINC &(1<<PC1)) |
9 | i=1;//Flagg setzen |
würde ich auch den Überblick verlieren. Es hat schon seinen Grund, warum die mit dem grauslichsten und unübersichtlichsten Code sehr oft die mit den nicht funktionierenden Programmen sind.
OK nun etwas genauer: Der PIN-PC0 ist als Eingang definiert, wenn dieser beschaltet wird leuchtet das Licht am Ausgangsport-PD0 Wenn nun an anderer Stelle ein Taster, also auch wieder ein Eingangspin-PC1 ganz kurz gedrückt wird, geht das Licht aus.
Kenia schrieb: > OK nun etwas genauer: > > Der PIN-PC0 ist als Eingang definiert, wenn dieser beschaltet wird > leuchtet das Licht am Ausgangsport-PD0 > Wenn nun an anderer Stelle ein Taster, also auch wieder ein > Eingangspin-PC1 ganz kurz gedrückt wird, geht das Licht aus. Ja. ok. In dem Fall wäre ein Flag keine so schlechte Idee. Aber nenn es nicht i. Gib ihm einen ordentlichen Namen, der seine Funktion wiederspiegelt. Zb irgendwas mit NotstopActive oder so. Denn dann liest sich das alles gleich viel einfacher. PS: Wie wird diese Sperre eigentlich wieder aufgehoben? Darüber solltest du dir mal Gedanken machen. Dann fällt dir vielleicht auf, wo in deinem Original Code ein Problem existiert.
hier noch weitere Ideen als Nachtrag: #define Eingang1 (PINC & (1<<PC0)) #define Eingang2 !(PINC & (1<<PC1)) #define Ausgang (PORTD |= (1<<PD0)) #define AUS (PORTD &= ~(1<<PD0)) int main(void) { // 2 EINGÄNGE DDRC &= ~(1 << PC0);//als Eingang geschaltet bleibt dann an Einschalter DDRC &= ~(1 << PC1);// ist im Prinzip ein __/|__Öffner in Reihe zu PC0 //PULLI PINC |= (1 << PC0); PINC |= (1 << PC1); // Ausgang PORTD |= (1<<PD0); while(1) { if(Eingang1&&Eingang2) Ausgang; else AUS; } }
> PS: Wie wird diese Sperre eigentlich wieder aufgehoben? > Darüber solltest du dir mal Gedanken machen. Dann fällt dir vielleicht > auf, wo in deinem Original Code ein Problem existiert. Diese Sperre wird von einem anderen angedachten Schalter an einem anderen Pin aufgehoben Schalter 1 wird stromlos
Ja. Schön. Jetzt hast du aber die Regeln ein wenig verändert. Du hast einen Art Notstop eingeführt, nach dessen Betätigung der Haupttaster an PC0 keine Funktion mehr haben soll Also
1 | int main() |
2 | {
|
3 | int NotstopActivated; |
4 | |
5 | ...
|
dieser Notstop ist natürlich am Anfang abgeschaltet (0 ist aus, 1 ist ein) Also
1 | int main() |
2 | {
|
3 | int NotstopActivated; |
4 | |
5 | |
6 | ...
|
7 | |
8 | NotstopActivated = 0; |
9 | |
10 | ...
|
11 | |
12 | while(1) |
13 | {
|
14 | ....
|
Damit kommen wir zur Logik: Wenn darf bzw. soll das Licht brennen. Es darf nur dann brennen wenn der Eingang1 (PC0) betätigt wird UND der Notstop noch nicht betätigt wurde. Ob der Notstop betätigt wurde sagt und die Variable NotstopActivated. Solange die 0 ist, ist alles in Ordnung. Also
1 | int main() |
2 | {
|
3 | int NotstopActivated; |
4 | |
5 | |
6 | ...
|
7 | |
8 | NotstopActivated = 0; |
9 | |
10 | ...
|
11 | |
12 | while(1) |
13 | {
|
14 | if( Eingang1 && NotstopActivated == 0 ) |
15 | Ausgang; |
16 | else
|
17 | AUS; |
Was wissen wir noch über die Logik. Na, sobald der PC1 betätigt wird, soll das als Notstop gelten und alle Aktivität am Pin eingestellt werden. Dazu reicht es, das Flag entsprechend zu stellen, denn darin wird ja festgehalten ob der Notstop betätigt wurde
1 | int main() |
2 | {
|
3 | int NotstopActivated; |
4 | |
5 | |
6 | ...
|
7 | |
8 | NotstopActivated = 0; |
9 | |
10 | ...
|
11 | |
12 | while(1) |
13 | {
|
14 | if( Eingang1 && NotstopActivated == 0 ) |
15 | Ausgang; |
16 | else
|
17 | AUS; |
18 | |
19 | if( Eingang2 ) |
20 | NotstopActivated = 1; |
21 | }
|
22 | }
|
Kenia schrieb: > Diese Sperre wird von einem anderen angedachten Schalter an einem > anderen Pin aufgehoben Schalter 1 wird stromlos Den darfst du jetzt selber ins Programm einbauen.
> //PULLI > PINC |= (1 << PC0); > PINC |= (1 << PC1); PORTC. Die Pullups werden über PORTC eingeschaltet
Gefühlt würde ich elektrisch sagen: Ein Schließer C0 und ein Öffner C1. Trotzdem tun mir die Augen weh. // Ausgang PORTD |= (1<<PD0); ... schaltet den Pull Up ein besser DDRD |= (1<<PD0); Wenn den Rest der Compiler frisst, geht's.
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.