pokk, я включился в тему поздно и могу кой-чего не знать, поэтому если скажу что-то уже сказанное - прошу извинить.
после просмотра вашего кода у меня появилось нескольковопросов:
Спойлер
Код: Выделить всё
////=============ADC_initialization==========
//ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
////====================
interrupt [ADC_INT] void adc_isr(void){
unsigned int temp_adc=0;
#asm("sei")
switch(adc_main){
case I1_MAIN:{
adc_main=I2_MAIN; // Переход на измерения следующего канала
#asm("cli") // запрещаем прерывание
temp_adc=ADCW;
#asm("sei")
ADC_BUF->test_int[4]=temp_adc; //записали в буфер(данный буфер выдаётся в UART по запросу)
if(temp_adc<1000){ // нормальное значение АЦП 0x3FF
DEBUGER("I1=",0,temp_adc,var2); // выдаётся в терминал если есть не соответствие
}
ADMUX_TEMP=2; //I1 переключаемся на канал I1 через итерацию с задержкой в 200 тактов
temp_adc=0;
break;
}
case I2_MAIN:{
#asm("cli")
temp_adc=ADCW;
#asm("sei")
// Нормально значение АПЦ около 647
if(temp_adc>700){DEBUGER("ADCW_HIGEST=",0,temp_adc,var2);}
if(temp_adc<600){DEBUGER("ADC_INT_ADCW=",0,temp_adc,var2);
LED_GREEN_DOWN();
}
ADC_BUF->test_int[1]=temp_adc;
adc_main=I1_MAIN;
ADMUX_TEMP=3; //I2
break;
}
default:{
adc_main=I1_MAIN;
DEBUGER("adc_main=error",0,0,MESEGER);
break;
}
}
#include <nop2.c> //200 тактов
#asm("cli") // запрещаем прерывание
ADMUX=ADMUX_TEMP;
#asm("sei")
}
1. вы представляете, для чего вы делаете запрет и последующее разрешение прерываний в обработчике прерывния?
2. вы представляете себе последствия таких действий?
3. это на самом деле необходимо для вашего алгоритма?
4. DEBUGER - это функция? вы представляете себе последствия вызова функций из обработчика прерываний?
я так думаю, что 300-500 ваших тактов на обработчик - исключительно следствие того, что вы смутно представляете себе ответы на эти вопросы. могу дать несколько советов общего характера:
1. никогда не запрещайте прерывания в обработчике прерываний - это лишнее.
2. без крайней необходимости и четкого понимания этой необходимости никогда не разрешайте прерывания внутри обработчика прерываний. в некоторых случаях последствия будут катастрофическими.
3. всеми силами избегайте обращения к функциям из обработчика прерываний. в крайнем случае используйте только статические функции из этого же программного модуля.
4. никогда не используйте библиотечные функции ввода-вывода в обработчиках прерываний (типа printf)
5. всеми силами стремитесь не ипользовать в обработчике прерываний различных программных задержек.
будете соблюдать эти правила - проблем у вас будет существенно меньше.
ну и вообще, ваш код весьма "грязный" - подумайте над его упрощением. как правило, лаконичный код проще понимать и отлаживать, да и чаще всего он меньше проблем вызывает...