Forum: Mikrocontroller und Digitale Elektronik Befehl nur einmal senden


von xray1981 (Gast)


Lesenswert?

Hallo !
ich habe folgendes, kleines Problem. Und zwar komme ich anscheinend 
nicht auf die richtige Lösung, meinem Atmega zu sagen, dass er eine 
Funktion (menue()) nur einmal öffnen, die LED aber dauerhaft leuchten 
soll.
1
int menue_oeffnen=0;        // Flag für menü
2
while (true)               // Mainloop-Begin
3
  {
4
    
5
    erkennung();        // Gegenstand erkannt  = grüne LED ein und Auswahl öffnen 
6
7
    if(gegenstand_erkannt==1)
8
    {      
9
      PORTB=(1<<PB4);        // LED grün ein  
10
            if(menue_oeffnen==0) // wenn Flag nicht gesetzt ist....
11
              {menue();          // menü öffnen...
12
               menue_oeffnen=1;} // und flag setzen
13
    }
14
    
15
16
  else  
17
    {
18
      PORTB=(!(1<<PB4));      // LED grün aus
19
      menue_oeffnen=0;        // Flag löschen
20
    }

Ich habe es jetzt mit einem Flag (menue_oeffnen) versucht, aber jetzt 
wird die Funktion erst gar nicht ausgeführt, nur die LED funktioniert. 
Was mache ich falsch ?

von Electronics'nStuff (Gast)


Lesenswert?

xray1981 schrieb:
> PORTB=(!(1<<PB4));      // LED grün aus

Geht so nicht (siehe Bitmanipulation).

xray1981 schrieb:
> if(gegenstand_erkannt==1)

Ist das eine globale Variable?

xray1981 schrieb:
> erkennung();

Was passiert da?

xray1981 schrieb:
> menue();

Was passiert da?

Ich lehne mich jetzt einfach mal aus dem Fenster (da kein Mensch weiss, 
was dein Programm macht, da wohl der grösste Teil fehlt) und behaupte, 
dass menue_oeffnen immer wieder zurückgesetzt wird.

Aber eben, poste dein ganzes Programm, damit kann niemand etwas 
anfangen.

von xray1981 (Gast)


Lesenswert?

Hi !
Das mit der LED funzt, läuft ja schon länger. Die einzige Ergänzung ist 
die Funktion "Menue". gegenstand_erkannt ist eine globale Variable, 
diese wird gesetzt, sobald durch die funktion "Erkennung" ein bestimmter 
adc wert erkannt wird. wie gesagt, das funzt auch alles soweit

von lrlr (Gast)


Lesenswert?

{menue();          // menü öffnen...
               menue_oeffnen=1;} // und flag setzen


ich würde  als 1. mal die 2 zeilen vertauschen

von xray1981 (Gast)


Lesenswert?

Danke, hat aber nichts geändert. Im Prinzip bräuchte ich ja "nur", wie 
ich das von Siemens Step7 her kenne, eine Funktion um eine 
Signaländerung nur bei steigender Flanke zu erhalten

von Brater (Gast)


Lesenswert?

xray1981 schrieb:
> Danke, hat aber nichts geändert. Im Prinzip bräuchte ich ja "nur", wie
> ich das von Siemens Step7 her kenne, eine Funktion um eine
> Signaländerung nur bei steigender Flanke zu erhalten

Das ist machbar. Einfach den alten Zustand in einer Variable speichern 
und dann im nächsten Zyklus schauen, ob sich alter und neuer Zustand 
unterscheiden bzw. ob alt==false und aktuell== true.


bool old = false;
while(true)
{
bool new = auslesen();
if(!old && new)
{
//state-wechsel
}

//...


old = new;
}

So ungefähr... Wenn du das mehrfach machen willst, müsstest du Objekte 
bauen mit old als member.

von xray1981 (Gast)


Lesenswert?

Danke - Das war der Knackpunkt !!!

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.