online 1
gast (50)

/ Forum / Anwendungen(Java,C++...)

Anwendungen(Java,C++...)Anwendungen(Java,C++...)

Fragevon JackDauert vom 20.10.2019, 11:59 Options

Probleme beim Programmieren in C

Hallo :-)

Ich bin Neuling und versuche einen AVR-Controller zu programmieren.

Nun ist es so, dass ich einen Schalter (keinen Taster!) an einen Port des AVR geschaltet habe und es logischerweiße 2 Schaltzustände gibt "an" und "aus".

Problem:
Es soll einmalig etwas getan werden, wenn sich der Schalt-Status ändert und nicht als Endlosschleife.


while(1) {           
   
if ( !(PINC & (1<<PINC0)) ) {

[b]mache 1x das uns das[/b]

}


Da ein Schalter im Gegensatz zu einem Taster seinen Zustand beibehält, würde diese Hauptschleife dafür sorgen, dass am laufenden Band die gewünschte Aktion durchgeführt wird.

Gibt es irgendeinen Trick bzw. eine Routine, wie ich bei einem dauerhaften Zustand nur einmal bei einer Zustandsänderung etwas ausführen lassen kann und nicht kontinuierlich?

Danke!!!


Antwort schreiben

Antwort 1 von Jaja vom 20.10.2019, 12:03 Options

müsstest halt noch ne variable (Byte) definieren und wenn die Funktion ausgeführt wird den Wert dort setzen- anschließend kannst du testen, ob die Funktion schon ausgeführt wurde...

Antwort 2 von JackDauert vom 20.10.2019, 12:30 Options

So einfach, dass ich nicht selber drauf gekommen bin. Danke für den Tip.


while(1) {             // Hauptschleife
   
if ( !(PINC & (1<<PINC0)) ) {
*led aufleuchten lassen*

if (statuson == 0) { // Prüfen, ob schon was getan worden ist
[b]führe das und das aus[/b] ; // Wenn nicht, machen!
statuson = 1
statusoff = 0
}
}

else {
*led ausschalten*

if (statusoff == 0) { // Prüfen, ob schon was getan worden ist
[b]führe das und das aus[/b] ; // Wenn nicht, machen!
statuson = 0
statusoff = 1
} 
}
return 0;
}


Also...es sollen beim An- und Ausschalten zwei unterschiedliche Aktionen ausgeführt werden. Für das Anschalten habe ich die Variable statuson gewählt und für das Ausschalten die Variable statusoff. 0 bedeutet, es wurde noch nichts getan, 1 bedeutet, es wurde schon etwas getan...

Habe ich im Code einen Denkfehler drin vom Syntax her oder geht es in die richtige Richtung?

Antwort 3 von Jaja vom 20.10.2019, 12:46 Options

1. deine kommentare sin inkorrekt. /* kommentar */

2. eine variable würde reichen:

Status=x; x=0 (led off) x=1 (led on)

Antwort 4 von JackDauert vom 20.10.2019, 13:01 Options

Oh, ok....dann ändere ich die Kommentare schnell, damit sie richtig sind.

Ich habe einen kleinen Fehler in meiner Problembeschreibung gemacht. Die LEDs haben nichts mit dem Befehl zutun, den ich ausführen möchte und stehen nur als Platzhalter im Code (damit ich hier im Forum für keine Verwirrung mit unnötigen Programmteilen sorge).


while(1) { // Hauptschleife

if ( !(PINC & (1<<PINC0)) ) {

if (statuson == 0) { /* Prüfen, ob schon was getan worden ist */
führe das und das aus ; /* Wenn nicht, machen! */
statuson = 1
statusoff = 0
}
}

else {

if (statusoff == 0) { /* Prüfen, ob schon was getan worden ist */
führe das und das aus ; /* Wenn nicht, machen! */
statuson = 0
statusoff = 1
}
}
return 0;
}


Gibt es vom Syntax oder von der Programmierung her etwas zu bemängeln? Ich kann den Code leider noch nicht testen, da die Hardware momentan von einem Freund auf eine Platine gebracht wird und wollte die Zwischenzeit für die Programmierung nutzen.

Antwort 5 von Jaja vom 20.10.2019, 13:07 Options

1.diese kommentare waren schon richtig, nur die mit * nicht ;)

2. also hast du 2 unterschiedliche sachen, die du abfragst, nicht nur einen schalter?
Ansonsten würde dennoch 1 variable reichen.

Antwort 6 von JackDauert vom 20.10.2019, 13:13 Options

Zu 1: Huch....okay :-)

Zu 2: Ich frage nur einen Schalter ab. Wenn sich der Status von Aus nach An ändert, soll über die UART-Schnittstelle die Nachricht "Ich bin jetzt an" gesendet werden (nicht wörtlich nehmen, die Übertragung findet per MIDI statt). Wenn sich der Status von An nach Aus ändert, soll gesendet werden "Ich bin jetzt aus." - da in der MIDI-Signalkette noch weitere Geräte hängen, möchte ich kein Dauer-Status senden, sondern einmal bei einer Schaltänderung genügt...

Antwort 7 von Jaja vom 20.10.2019, 14:04 Options

if ( PINC & (1<<PINC0) ) /* nehme an false? -> Schalter geschlossen*/
  { 


  if (status == 0)  /* es wurde noch nichts gemacht */
      {
       führe das und das aus ;
       status = 1;
      }

  else   /* impliziert status == 1 , d.h. es wurde schon ausgeführt */
      {
      führe das und das aus ; 
      }
  }
else /* Schalter ist offen */
  {
  blah blah;
  }


kannst dann noch deine "Hauptschleife" drumrumbasteln...

Ähnliche Themen

MMO(RP)G programmieren
tobi_master2000  22.06.2007 - 229 Hits - 3 Antworten

Stimmgerät programmieren...
credo  15.07.2007 - 45 Hits - 2 Antworten

Spiele Programmieren
simon_365  30.01.2008 - 254 Hits - 5 Antworten

Programmieren lernen!
Bodomchild  13.05.2009 - 295 Hits - 8 Antworten

Compiler programmieren in Delphi
tobsa  10.05.2008 - 115 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026