... 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);
}
......
}
Lesezeichen