Werteübergabe gescheitert

Ich bin nicht so der C Profi und scheitere an einer simplen Sache. Vieleicht sehe ich den Wald vor lauter Bäume nicht und brauche mal wieder einen Denkanstoß.

Folgendes Programm( Auszug):

[size=10pt]/*  Leonardo  10/2014
    
    IRQ 0 Pin 3
    IRQ 1 Pin 2
    IRQ 2 Pin 0
    IRQ 3 Pin 1
    IRQ 4 Pin 7
    
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

....

// Drehdecoder Variablen
const int pin1_1 = 7; 	// Taste 1 --> Start Auswahlmenue
const int pin1_2 = 8; 	//Drehdecoder 7  Weiß (clk)
const int pin1_3 = 9;	//Drehdecoder 8  Grün (DT)

const int pin2_1 = 10;     // Taste 2 --> Eingabeende
const int pin2_2 = 11;     //Drehdecoder 2  Weiß
const int pin2_3 = 12;	//Drehdecoder 2  Grün

volatile uint8_t counter_1;  // Decoderwert 1 PWM 1 8Bit Integer 0....255  uint8_t
volatile uint8_t counter_2;  // Decoderwert 2 PWM 2
volatile uint8_t counter_3;  // Decoderwert 3 PWM 3

boolean goingUp = false;
boolean goingDown = false;

unsigned char encoder_A; // TIME_MENUE_D (int pin_A, int pin_B, int laenge)
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

// ende Drehdecoder

....

// Timer Menue
boolean automatik = false;  // Automatische Temperatursteuerung
boolean menue = false; 		 /* Menue eröffnen bei true */
boolean menue_2 = false;       /* Auswahlmenuepunkt aktiviert  */
volatile uint8_t menue_2_c = 0; 		 /* Hilfsvariable Auswahlmenue 0-5 --> 0 2 4 6 8 */

void setup()
{
  counter_1 = 50;
  counter_2 = 50;
  counter_3 = 50;

/* Setup encoder pins as inputs */
    pinMode(pin1_1, INPUT); // Pin 7 Taste 1 
    pinMode(pin1_2, INPUT); // Pin 8
    pinMode(pin1_3, INPUT); // Pin 9  
    
    pinMode(pin2_1, INPUT); // Pin 10 Taste 2
    pinMode(pin2_2, INPUT); // Pin 11 
    pinMode(pin2_3, INPUT); // Pin 12   

  
}

void loop()
{
	
	if (menue == false) 
  	{
  		TIMER_MENUE(1,5);
  	}
	
	if (menue == true)
		{
			do
			{
				// menue_2 = true;	// Auswahlmenuepunkt aktiviert
				TIME_MENUE_D (pin1_2, pin1_3, 5);
						
				TIMER_MENUE (2,5);
				
				COUNTER_MENU(menue_2_c,0,8);  // liefert nur 0 und 1 --> menue_2_c =0
				
			}
			while(menue_2 == false);

			
		}	
}


/**********************************************************
*                                                         *
********* Unterprogramme **********************************
*                                                         *
**********************************************************/

/* Timer_Menue *******************************************/
void TIMER_MENUE (int menue_z, int laenge)
{
	time_menue = millis();
	
	if(time_menue >= (loop_time + laenge))
		{
      // 5ms since last check of encoder = 200Hz 
       
      taste1 = digitalRead(pin1_1); // Read Taste 1 Encoder 1
      
      if((!taste1) && (taste1_1))
      {	
      	// Menue einschalten   
        if (menue_z == 1)	
        	{ 
        		menue = true;
        		MENUE_START(); //Menuebild aufbauen
        	}  
        	
        // *****************
        if (menue_z == 2) 
        	{	menue_2 = true;}	
      }      
      taste1_1 = taste1; 
      loop_time = time_menue;  // Updates loopTime
    }
	
}

/* Timer_Decoder  ****************************************/
void TIME_MENUE_D (int pin_A, int pin_B, int laenge)
{
  time_menue_d = millis();
  if(time_menue_d >= (loop_time_d + laenge))
  	{
    // 5ms since last check of encoder = 200Hz  
    encoder_A = digitalRead(pin_A);    // Read encoder pins
    encoder_B = digitalRead(pin_B);   
    if((!encoder_A) && (encoder_A_prev))
    	{
        // A has gone from high to low 
        if(encoder_B) 
      	{
          // B is high so clockwise
          // increase the counter
          goingUp = true;               
      	}   
        else 
      	{
          // B is low so counter-clockwise      
          // decrease the counter
          goingDown = true; 
      	}   

    	}   
    encoder_A_prev = encoder_A;     // Store value of A for next time    
    
      
   
    loop_time_d = time_menue_d;  // Updates loopTime
  }	
}

/* MENUE_START *******************************************/
void MENUE_START()
{
  lcd.clear();
	MENUE_ZEILE(0,6,5,275,0);
	lcd.setCursor(0,1);
	lcd.print("--------------------");
	MENUE_ZEILE(2,1,16,170,0); // 170 " [Pwm 1 Radiator " 
	MENUE_ZEILE(3,1,16,191,0); // 191 " [Pwm 2 Radiator "
	menue_2_c = 0;
	lcd.setCursor(0,2);
	lcd.print("*");
}

// ?*?*?***?***********************************************
void COUNTER_MENU (uint8_t counter, int Start_c, int End_c)
{
	while(goingUp==true) // CW motion in the rotary encoder
  {
  goingUp=false; // zurücksetzen
  
  if (counter < End_c) counter ++;
  
  Serial.println(counter); // liefert 0 und 1--> müsste aber werte von 0-8 zurückgeben
  }
  
  while(goingDown==true) // CCW motion in rotary encoder
  {
  goingDown=false; // zurücksetzen
  
  if (counter > Start_c) counter --;
  
  Serial.println(counter); // liefert 0 und 1--> müsste aber werte von 0-8 zurückgeben
  }
}
*************************************************************


// Das hier funktioniert richtig
/*
void COUNTER_MENU ()
{
	while(goingUp==true) // CW motion in the rotary encoder
  {
  goingUp=false; // zurücksetzen
  
  if (menue_2_c < 8) menue_2_c ++;
  
  Serial.println(menue_2_c);
  }
  
  while(goingDown==true) // CCW motion in rotary encoder
  {
  goingDown=false; // zurücksetzen
  
  if (menue_2_c > 0) menue_2_c --;
  
  Serial.println(menue_2_c);
  }
}
*/[/size]

Nun die Frage; Wie bekomme ich einen richtigen Rückgabewert
?? menue_2_c = void COUNTER_MENU (menue_2_c, 0,9)
oder wie bekomme ich für menue_2_c in Void COUNTER_MENU() richtige Werte.

void COUNTER_MENU() soll mit unterschiedlichen Parametern und counter-Zuweisungen benutzt werden

Was mach ich Falsch??

Versuchst du da ein Menü aufzubauen? Hier gibts schon eins: http://forum.arduino.cc/index.php?topic=73816.0

Garnicht. Deine "void COUNTER_MENU(xyz) { …} kann nichts zurückgeben, denn sie liefert keinen Rückgabe wert (-> void).

void COUNTER_MENU (uint8_t counter, int Start_c, int End_c)
{
	while(goingUp==true) // CW motion in the rotary encoder
	{
		goingUp=false; // zurücksetzen
		
		if (counter < End_c) counter ++;
		
		Serial.println(counter); // liefert 0 und 1--> müsste aber werte von 0-8 zurückgeben
	}
	
	while(goingDown==true) // CCW motion in rotary encoder
	{
		goingDown=false; // zurücksetzen
		
		if (counter > Start_c) counter --;
		
		Serial.println(counter); // liefert 0 und 1--> müsste aber werte von 0-8 zurückgeben
	}
}
int func(uint8_t a, uint8_t b)
{
if(a > b) return 0;
else if(b > a) return 1;
else return 2;
}

Das 0 oder 1 bei dir ausgegeben wird, ist logisch. Du übergibst mit jedem Funktionsaufruf den Wert von menue_2_c und der ist 0.

http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm#mj1d0c139ec6125f198a762880b480283f

skorpi08: Versuchst du da ein Menü aufzubauen? Hier gibts schon eins: http://forum.arduino.cc/index.php?topic=73816.0

ja möcht ich. nur ich möchte es lernen, und selbst ist der Programmierer. Den Post habe ich schon gelesen, schöne arbeit.

sschultewolter:
Garnicht. Deine "void COUNTER_MENU(xyz) { …} kann nichts zurückgeben, denn sie liefert keinen Rückgabe wert (-> void).

void COUNTER_MENU (uint8_t counter, int Start_c, int End_c)

{
while(goingUp==true) // CW motion in the rotary encoder
{
goingUp=false; // zurücksetzen

	if (counter < End_c) counter ++;
	
	Serial.println(counter); // liefert 0 und 1--> müsste aber werte von 0-8 zurückgeben
}

while(goingDown==true) // CCW motion in rotary encoder
{
	goingDown=false; // zurücksetzen
	
	if (counter > Start_c) counter --;
	
	Serial.println(counter); // liefert 0 und 1--> müsste aber werte von 0-8 zurückgeben
}

}






int func(uint8_t a, uint8_t b)
{
if(a > b) return 0;
else if(b > a) return 1;
else return 2;
}




Das 0 oder 1 bei dir ausgegeben wird, ist logisch. Du übergibst mit jedem Funktionsaufruf den Wert von menue_2_c und der ist 0.


http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm#mj1d0c139ec6125f198a762880b480283f

Danke für den Denkanstoß und den schnellen Antworten

Wollte erst noch einiges mehr schreiben, aber es wäre vielleicht sinnvoller zuerst einmal noch weiter in die C Basics einzusteigen.

Es ist alles ein wenig confus.

Was mir aber aufgefallen ist: Du willst anscheinend die Variable “menue_2_c” in der Funktion “COUNTER_MENU” ändern.
Das geht nur, wenn du die Variablen nicht als Wert, sondern als pointer oder Referenz übergibst.

Das geht am einfachsten so: Statt “void COUNTER_MENU (uint8_t counter, int Start_c, int End_c){”
schreibst du “void COUNTER_MENU (uint8_t **&**counter, int Start_c, int End_c){”

Dann wird beim Aufruf nicht der Wert der Variablen an die Funktion übergeben, sonder eine Referenz auf die Variable und Wertzuweisungen innerhalb der Funktion haben Auswirkung auf die externe Variable.

Ich finde, hier wird das ganz gut erklärt: http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm

guntherb: Es ist alles ein wenig confus.

Was mir aber aufgefallen ist: Du willst anscheinend die Variable "menue_2_c" in der Funktion "COUNTER_MENU" ändern. Das geht nur, wenn du die Variablen nicht als Wert, sondern als pointer oder Referenz übergibst.

Das geht am einfachsten so: Statt "void COUNTER_MENU (uint8_t counter, int Start_c, int End_c){" schreibst du "void COUNTER_MENU (uint8_t &counter, int Start_c, int End_c){"

Dann wird beim Aufruf nicht der Wert der Variablen an die Funktion übergeben, sonder eine Referenz auf die Variable und Wertzuweisungen innerhalb der Funktion haben Auswirkung auf die externe Variable.

Ich finde, hier wird das ganz gut erklärt: http://openbook.galileocomputing.de/c_von_a_bis_z/012_c_zeiger_006.htm

Danke für den Hinweis, das ist es was ich wollte. Hab mir mal das Buch gezogen. Werde den Rat folgen und weiter lesen.