Hallo,
ich melde mich wieder einmal mit einer kleinen Frage:
ich habe nun folgendes Code-Stück für einen mega2560
1 | ISR(ADC_vect)
|
2 | {
|
3 | //saves the channel that is currently to read
|
4 | static uint8_t adcCounter=0;
|
5 | //an ADC-value is arrived, so we can save it in the array
|
6 | adc[adcCounter]=ADCH;
|
7 | //increase the channel or set it to zero if all channels are read
|
8 | if(adcCounter<15) ++adcCounter;
|
9 | else adcCounter = 0;
|
10 | //so we can start the next meassure
|
11 | ADMUX=(adcCounter & 0x7)|(1<<ADLAR);
|
12 | ADCSRB = (ADCSRB & ~(1<<MUX5)) | (adcCounter & (1<<MUX5));
|
13 | ADCSRA|=(1<<ADIF)|(1<<ADSC);
|
14 | }//ISR ADC_vect
|
Wenn mein Kollege nicht völlig verkokst war, als er es gecodet hat,
sollte es nach dem ersten auslesen des ADCs immer wieder alle Kanäle
nacheinander auslesen.
Soweit, so gut, und hoffentlich noch fehlerfrei ;)
Nur kam mir vorhin die Idee, dass die ISR vielleicht zu schnell
hintereinander aufgerufen wird und dabei andere Programmteile behindert.
Es gibt nämlich nebenbei noch 5 SRF05-Ultraschallsensoren auszulesen,
und alle werte und die von 4 Lichtsensoren auszuwerten und zu reagieren,
sowie die PWM für 4 Motoren zu generieren.
Im Data-Sheet steht etwas von 13us-260us. Welcher wert ist eher
realistisch?
Was sagen die Profis dazu?
Und funktioniert das "Konzept" überhaupt.
Takt ist übrigens 16MHz. Der ADC-Prescaler ist 16
Wer noch Fragen hat, nur zu, ich hab sowieso was vergessen ;)
mfG
N.G.