Hi,
//Wenn die erste Auswertung von Tastenabfrage() 1 ergibt, und die zweite 10, //dann wertet es dein Programm so aus, als würde zweimal die 10 //rauskommen.

ich habe vercuht nur die Fälle auseinander zu halten, wenn es nicht mit 1,10,33 geht kann ich dafür Zeichen nehmen, oder 1,2,3.


hier sind die Codes.
Danke

ADKanallesen
Code:
#include <avr/io.h>
#include "Initialisierung.h"
#include <util/delay.h>
#include <avr/interrupt.h>


  //variablen
  uint16_t  U_analog;
  uint16_t  Tastenwert;
  uint16_t  Stromwert;
  extern uint8_t Prozessflag;

  //Funktion zur A/D-Wandlung
  uint16_t ADkanalLesen() {

  uint8_t i; 
  uint16_t ergebnis = 0;//A/D-Wert
  unsigned char Durchlaeufe =4;




	for (i=0; i<Durchlaeufe; i++) 
	{ 
	   ADCSRA |= (1<<ADSC); //Startet eine A/D-Wandlung (Single Conversion)

while (ADCSRA & (1<<ADSC)) 
{ 
; // auf Abschluss der Konvertierung warten
}
  ergebnis += ADCW; // Wandlungsergebnisse werden aufaddieren 

}
 
  ADCSRA &= ~(1<<ADEN); //A/D-Wandler wird deaktiviert

  ergebnis /= Durchlaeufe; // Summe durch 4 teilen (Mittelwert) 

  U_analog = (ergebnis*u_ref)/1024;

 return U_analog; //Analogwert
}
Intteruptroutine

Code:
#include <avr/io.h>
#include "Initialisierung.h"
#include <util/delay.h>
#include <avr/interrupt.h>


extern uint8_t Prozessflag;
//Globale Variable
uint8_t Zustand;
uint8_t Anreiz;
uint16_t Zaehler=0;
extern uint16_t Tastenwert;
extern uint16_t Stromwert;

// InterruptVectoren
	ISR( TIM0_OVF_vect ){ // Interruptroutine bei Timeroverflow
 		TCNT0 = TCNT0init; //Counter zurück auf Startwert 58 gesetzt
 		ADCSRA |= (1<<ADEN) |  (1<<ADPS2) | (1<<ADPS0)| (1<<ADIE); //AD-Wandler aktiviert(ADEN), Prescaler auf 32(ADSPSO,ADPS2) 
		    							   //Interrupt enable aktiv
		ADMUX |= (0<<REFS1) | (0<<REFS0); // Vcc als  Referenzspannung die getrennt von AREF ist 
   		                                  // Kanal waehlen und Vcc als Referenzspannung
   if(Zaehler%2){//bei 50ms und in einem 100ms Zeitabstand eine ADWandlung ausführen und ein ADInterrupt auszulösen
  	ADMUX|=PINTASTEN; // Kanal auswählen(PIn wo die Tasten angehängt sind)
		ADCSRA |= (1<<ADSC) ;  //Startet eine A/D-Wandlung (Single Conversion)
		 	}
						Zaehler++;
							}

	ISR( ADC_vect){
		if(Zaehler%2){
			Tastenwert=ADkanalLesen();//Tastenwert nimmt den Wert von der ADWandlung an (analogwert)
      			Prozessflag|= Tasten;//Prozessflag wird auf Tasten gesetzt (fragt die tasten ab bei der Funktion Tastenabfrage)
      				}
					}

initialisierung.h

Code:
#include <avr/io.h>
#include <stdint.h>

/Prozessflags


#define Benutzeroberflaeche (1<<0)
#define Tasten              (1<<1)
#define Rechnen             (1<<2)

// Tasten //


#define KeineTaste       1
#define TasteEins        1
#define TasteZwei        2
#define TasteDrei        3
in initialisierung sind andere Funktionen deklariert die ich da nicht zugefügt habe