Programm läuft durch ohne zu stoppen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Logan
Beiträge: 3
Registriert: Mo Jun 29, 2020 9:18 am

Programm läuft durch ohne zu stoppen

Beitrag von Logan » Mo Jun 29, 2020 10:08 am

Guten Tag zusammen,

ich bin recht neu sowohl hier im Forum, als auch im Bereich der Programmierung tätig.
Daher bitte ich Sie eventuelle "dumme Fragen" zu entschuldigen. :D

Hier eine kleine Beschreibung zu meinem Projekt und dann zu meinem Problem:
Ich arbeite zur Zeit mit einem µC Board mit Tastern, Schaltern und LEDs.
Jetzt ist es so, dass ich mit einem Programm die Funktion der Taster, Schalter und LEDs testen möchte.
Dafür soll ein Bediener durch ein Programm geführt werden und dabei die Tasten drücken.
Dabei nutze ich eine schon vorhandene C-Datei mit einer Funktion die sich alle 1ms nochmal aufruft. (das ist Vorgabe)
In dieser Funktion habe ich mein Programm geschrieben. Es sind mehrere While-Schleifen hintereinander die ich benutze (siehe Code)
In jeder While-Schleife wird der Benutzer aufgefordert eine Aktion durchzuführen (Taster und Schalter betätigen).


Nun bin ich auf folgendes Problem gestoßen:

Das Programm läuft alle While-Schleifen einmal komplett von oben bis unten durch, ohne auf die Eingaben des Bedieners zu warten oder dort an dem Punkt das Programm zu stoppen.
Der Code funktioniert bei mir ohne Error Anzeigen.
Was muss ich tun, damit das Programm an den Abfragen der Schalter und Taster stoppt und auf die Eingabe des Bedieners wartet?

Hier bitte ich um eure Hilfe. Möglich ist es, dass ich den Wald vor lauter Bäumen nicht sehe. Aber ich freue mich um jede Hilfe die ich bekommen kann.
Danke schon mal im voraus!
Falls noch mehr Informationen benötigt werden einfach fragen.
Hier der Code:

Code: Alles auswählen


void test_platinen_task_rtos(){

bool testTask = 0;

uint32_t confirmfunction_taster1=0;
uint32_t confirmfunction_taster2=0;
uint32_t confirmfunction_schalter1=0;
uint32_t confirmfunction_schalter2=0;		

#define 	QUERYTASTER1	REGISTER_READ_BIT(0x400E1200, 0x003C, 16) 			// ist der Taster1 gedrückt
#define 	QUERYTASTER2	REGISTER_READ_BIT(0x400E1200, 0x003C, 17) 			// ist der Taster2 gedrückt
#define	QUERYSCHALTER1	REGISTER_READ_BIT(0x400E1200, 0x0000, 1)			// ist der Schalter 1 gedrückt
#define	QUERYSCHALTER2	REGISTER_READ_BIT(0x400E1200, 0x0000, 2)			// ist der Schalter 2 gedrückt

//*********************************** Taster Test ******************************************************



//*********************************** Taster T1 ********************************************************

printf("Beginn der Taster- und Schaltertests.");

static uint32_t confirmtimer_taster=0;

printf("Test Taster T1 beginnt.\n");
printf("Bitte drücken Sie innerhalb von 5 Sekunden Taster T1.\n");

while(testTask == 1){		
	
	confirmtimer_taster++;

	if (QUERYTASTER1 && confirmtimer_taster<=5000)										//wenn Taster T1 gedrückt wird (lese Pin Data Status Register aus)dann...
	{																			//Zeit in ms: 5000 ms = 5s
	
		printf("Test erfolgreich. Funktion Taster T1 bestätigt.\n");
		printf("Dieser Taster ist für kommende Tests der Bestätigungstaster.\n");					//Bestätigung, dass Taster Funktioniert hat
			
		confirmfunction_taster1=1;
		confirmtimer_taster=0;
		testTask=1;
		
	}
	else if(confirmtimer_taster>5000)													//Wenn Timer über 5sec dann...
	{
	
		printf("Test Taster T1 nicht bestanden. Taster T1 wurde nicht innerhalb in der vorgegebenen Zeit betätigt.\n");
		confirmtimer_taster=0;
		testTask=1;
	}
	
}


//*********************************** Taster T2 ********************************************************

printf("Test Taster T2 beginnt.\n");
printf("Bitte drücken Sie innerhalb von 5 Sekunden Taster T2.\n");

while(testTask == 1){
	
	confirmtimer_taster++;

	if (QUERYTASTER2 && confirmtimer_taster<=5000)										//wenn Taster T2 gedrückt wird (lese Pin Data Status Register aus)dann...
	{																					//Zeit in ms: 5000 ms = 5s
		
		printf("Test erfolgreich. Funktion Taster T2 bestätigt.\n");
		printf("Dieser Taster ist für kommende Tests der Ablehnungstaster.\n");			//Bestätigung, dass Taster Funktioniert hat
		
		confirmfunction_taster2=1;
		confirmtimer_taster=0;
		testTask=1;
		
	}
	else if(confirmtimer_taster>5000)													//Wenn Timer über 5sec dann...
	{
		
		printf("Test Taster 2 nicht bestanden. Taster T2 wurde nicht in der vorgegebenen Zeit betätigt.\n");
		confirmtimer_taster=0;
		testTask=1;
	}
	
}

//*********************************** Schalter S1 ********************************************************

printf("Test Schalter S1 beginnt.\n");
printf("Bitte bringen Sie den Schalter S1 in die Ausgangslage (Schalthebel nach rechts) und drücken Sie zum Bestätigen den Taster T1 zum Start, oder Taster T2 für den Abbruch des Tests.\n");

while(testTask == 1){
	
	//confirmtimer_taster++;

	if (QUERYSCHALTER1 && QUERYTASTER1)							
	{																					
		printf("Test 1/2 erfolgreich.\n");
		printf("Bitte den Schalthebel in die linke Position bringen und bestätigen Sie mit dem Taster T1 oder brechen mit Taster T2 ab.\n");
		
		if (!QUERYSCHALTER1 && QUERYTASTER1)					
		{
			printf("Test 2/2 erfolgreich. Funktion Schalter S1 bestätigt.\n");
			confirmfunction_schalter1=1;
		} 
		else if (QUERYTASTER2)
		{
			printf("Test abgebrochen. Funktion Schalter S1 nicht bestätigt\n");
			confirmfunction_schalter1=2;
		}
		
				
		//confirmfunction_schalter1=1;
		//confirmtimer_taster=0;
		testTask=1;
		
	}
	else if(QUERYTASTER2)														//Wenn Taster T2 dann....
																				
																			
	{
		
		printf("Test: Schalter S1 nicht bestanden.\n");
		//confirmtimer_taster=0;
		testTask=1;
	}
	
}

//*********************************** Schalter S2 ********************************************************

printf("Test Schalter S2 beginnt.\n");
printf("Bitte bringen Sie den Schalter S2 in die Ausgangslage (Schalthebel nach rechts) und drücken Sie zum Bestätigen den Taster T1 zum Start, oder Taster T2 für den Abbruch des Tests.\n");

while(testTask == 1){
	
	//confirmtimer_taster++;

	if (QUERYSCHALTER2 && QUERYTASTER1)							
	{
		printf("Test 1/2 erfolgreich.\n");
		printf("Bitte den Schalthebel in die linke Position bringen und bestätigen Sie mit dem Taster T1 oder brechen mit Taster T2 ab.\n");
		
		if (!QUERYSCHALTER2 && QUERYTASTER1)						
		{
			printf("Test 2/2 erfolgreich. Funktion Schalter S2 bestätigt.\n");
			confirmfunction_schalter1=1;
		}
		else if (QUERYTASTER2)
		{
			printf("Test abgebrochen. Funktion Schalter S2 nicht bestätigt\n");
			confirmfunction_schalter1=2;
		}
		
		
		//confirmfunction_schalter1=1;
		//confirmtimer_taster=0;
		testTask=1;
		
	}
	else if(QUERYTASTER2)							//Wenn Taster T2 dann.... 
																				
	{
		
		printf("Test: Schalter S2 nicht bestanden.\n");
		//confirmtimer_taster=0;
		testTask=1;
	}
	
}

}

Lieben Gruß Logan

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Programm läuft durch ohne zu stoppen

Beitrag von mfro » Mo Jun 29, 2020 10:57 am

(M)eine Vermutung (deinem Code ist nicht eindeutig zu entnehmen, ob das die Ursache ist):

Mechanische Schalter und Taster prellen (heisst, sie wechseln beim Schaltvorgang erst mal - meist mehrmals in sehr kurzen Zeitabständen - die Schaltstellung).

So ein µC ist üblicherweise schnell genug (oder wie man's nimmt: zu schnell), um dieses Prellen mitzukiregen. Wenn Du das in deinem Code nicht abfängst (d.h. abwartest, bis sich ein stabiler Zustand eingestellt hat, bevor Du eine Entscheidung triffst), bekommst Du Schaltzustände mit, die Du gar nicht haben willst.

Das wäre das Erste, was ich beheben würde (ob der Rest deines Codes so passt, habe ich mir gar nicht mehr angeschaut).
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Programm läuft durch ohne zu stoppen

Beitrag von nufan » Mo Jun 29, 2020 11:07 am

Hallo Logan! :)

Ich habe deinen Code mal etwas zusammengestutzt, damit man die Bedingung besser erkennen kann:

Code: Alles auswählen

void test_platinen_task_rtos(){
    bool testTask = 0;
    while(testTask == 1){
        if (QUERYTASTER1 && confirmtimer_taster<=5000)
        {
            testTask=1;
        }
        else if(confirmtimer_taster>5000)
        {
            testTask=1;
        }
    }
}
Die deiner Variable "testTask" zugewiesenen Werte passen nicht zu den formulierten Bedingung, du kommst nie in die Schleife hinein.

Logan
Beiträge: 3
Registriert: Mo Jun 29, 2020 9:18 am

Re: Programm läuft durch ohne zu stoppen

Beitrag von Logan » Di Jun 30, 2020 1:11 pm

Hallo mfro und nufan :)
erstmal vielen lieben Dank, dass Ihr mir geantwortet habt.

zu mfro:
Das Entprellen der Schalter und Taster ist ein sehr guter Tipp von dir danke sehr!
Das steht als nächstes an und ganz oben auf der Liste. :)

Das problem ist allerdings, dass ich noch keinen einzigen Schalter oder Taster betätigt habe und das Programm rast mir trotzdem durch die Tests und bleibt nicht bei den Abfragen (if-Abfragen) stehen. :)

zu nufan:
Die deiner Variable "testTask" zugewiesenen Werte passen nicht zu den formulierten Bedingung, du kommst nie in die Schleife hinein.
Oh kann es sein, dass ich die Whileschleife falsch benutze?
Die Whileschleife führt doch solange die Anweisung (in dem fall die if -Anweisung) aus bis die Bedingung erfüllt ist?
Oder habe ich da was missverstanden?

Meine Überlegung war folgende:
Führe die if-Anweisungen in der Whileschleife solange aus, bis ich den Taster drücke und erst dann springe in den nächsten Test.

Wäre hier eine do while schleife sinnvoller?

Lieben Gruß
Logan

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Programm läuft durch ohne zu stoppen

Beitrag von nufan » Di Jun 30, 2020 2:05 pm

Logan hat geschrieben:
Di Jun 30, 2020 1:11 pm
Die deiner Variable "testTask" zugewiesenen Werte passen nicht zu den formulierten Bedingung, du kommst nie in die Schleife hinein.
Oh kann es sein, dass ich die Whileschleife falsch benutze?
Die Whileschleife führt doch solange die Anweisung (in dem fall die if -Anweisung) aus bis die Bedingung erfüllt ist?
Oder habe ich da was missverstanden?
Der Schleifenkörper wird ausgeführt, solange die Bedingung erfüllt ist. Bei einer while-Schleife muss die Bedingung also vor der Schleife erfüllt sein, damit sie zumindest ein mal durchlaufen wird.

Du kannst dir auch mal die Beschreibung im Wiki ansehen:
https://www.proggen.org/doku.php?id=c:tutorial:loops

Antworten