1) pointer точно не используется в прерывании. i объявлена в начале main(), да и не на i подозрения т.к. сегодня отловил, что та же проблема, но реже, возникает если вырубать прерывания только на кусок с циклом for. Т.е. портится указатель даже на строке pointer=get_adc_data();
2) нет, размер service_msg не превышаю.
Привожу код get_adc_data():
CODE
unsigned int* get_adc_data(void)
{
unsigned char i;
unsigned int adc_data=0;
unsigned int analog_vals_arr[6]={0,0,0,0,0,0};
// ADC Clock frequency: 130,156 kHz
ADCSRA=0x86;// ADC enable; ADC int.disable; prescaler=64
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1B=0x03;// clk/64
do{
for (i=0; i<6; i++)
{
ADMUX&=0b11110000;
ADMUX|=i;
ADCSRA|=0x40;
while(!(ADCSRA & (1<<ADIF)));
ADCSRA|=(1<<ADIF);
adc_data=ADCW;
check(adc_data, i);
};
// check timer1 overflow flag
if (TIFR &= (1<<TOV1))
{
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
TIFR |= (1<<TOV1);
timer1(analog_vals_arr);
break;
};
}
while(1);
ADCSRA clrb(ADEN);//stop ADC
return (analog_vals_arr);
}
функция timer1 получает указатель analog_vals_arr и заполняет массив необходимыми значениями
Причина редактирования: Уменьшение видимого размера цитаты исходника.