... neue Fragestellung:

Wenn ich den A/D-Wandler nach Wertespeichern im Interrupt wieder starte, bleibt keine Zeit mehr für RS232 und ähnliches ?

Da der Messknecht im RS485-Slave-Modus nicht bestimmen kann, wann er abgefragt wird - und er binnen 100 ms Antworten muß - und ich gleichzeitig auch noch zwei Schrittmotoren ansteuere .. sollte ich für die A/D-Messung wohl einen zweiten Controller hernehmen ? Oder eben seltener messen ?

Grübel ? .. liege ich da richtig ?

Hier meine Codes:
Code:
int main(void)
{
   avr_init(); // incl LCD_Init() und LCD_Clear() !
   AD_Messung_AN();
   for(;;)
   {
      if(UART_rx_loop())
         UART_DATA_Auswertung();

      MesswertVerarbeitung(); // wenn flagloopjob gesetzt

      MesswertAusgabe(); // eben wenn fällig
      DATA_Verarbeitung();
   }
   return(0);
}

static void avr_init(void)
{
...
ADCSRA	= (1 << ADEN); // A/D-Wandlung ein
}

//-------------------------------------------------------
void AD_Messung_AN()
{
	ADMUX	= 0; // AREF ext, left Adj.,NoGain
	// nicht permanente Messung aber mit Interrupt
	ADCSRA	= (1 << ADEN) | (1 << ADSC) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // 1 << ADIF) | (
}

//-------------------------------------------------------
SIGNAL(SIG_ADC)
{
	switch(ADMUX)
	{
		case 0x0 :
		{
			UmessVor		= ADC;	// UmessVor = ADCL; UmessVor += (ADCH << 8); // LSB/MSB
			ADMUX			= 0x1;	// (1 << AD_U_VOR);
		}
		break;
		case 0x1 :
		{
			UmessRueck		= ADC;	// UmessRueck = ADCL; UmessRueck += (ADCH << 8); // LSB/MSB
			ADMUX			= 0x2;	// (1 << AD_U_RUECK);
		}
		break;
		case 0x2 :
		{
			UmessPosition	= ADC;	// UmessPosition = ADCL; UmessPosition += (ADCH << 8); // LSB/MSB
			ADMUX			= 0x4; // (1 << AD_U_RUECK);
		}
		break;
		case 0x4 :
		{
			UmessTemperatur = ADC;	// UmessTemperatur = ADCL; UmessTemperatur += (ADCH << 8); // LSB/MSB
			ADMUX			= 0x0; // (1 << AD_U_RUECK);
		}
		break;
	}
	
	ADCSRA |= (1 << ADSC); // neue Messung starten
}

-------------------------------------------------------
void MesswertAusgabe(void)
{
	if(old_UmessVor != UmessVor)
	{
		old_UmessVor = UmessVor;
		sprintf(bufi, "%04x", UmessVor);
		LCD_WritePosString(2, 2, bufi, 0);
	}

      ......
}