ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
17 мая
80184
Sovengener (01.02.2007 19:08, просмотров: 66606)
ADC в ATtiny13 - не просыпается после sleep (ADC Noise Reduction). Мужики, допоможыть! Пытаюсь работать с АЦП 13-й тиньки. Код такой:
void run_ADC(void)
{
 	set_sleep_mode(SLEEP_MODE_ADC);
 	sleep_enable();
	ADCSRA |= (1<<ADIE);
	ADCSRA |= (1<<ADSC);
	sei();
 	sleep_mode();
}

ISR(ADC_vect)
{
	extern int zadergka;

	cli();
	zadergka = ADCW;
	ADCSRA &= ~_BV(ADIE);		/* disable ADC interrupt */
	
}

...
int main (void)
{

	ADMUX = (0<<REFS0)|(0<<ADLAR)|(0<<MUX1)|(1<<MUX0);
	ADCSRA = (1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(0<<ADIF)| \
	(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(1<<ADPS0);
...
	run_ADC();
}

Компилятор - последний WinAVR.

ISR(ADC_vect)
{
	extern int zadergka;

	cli();
	zadergka = ADCW;
	ADCSRA &= ~_BV(ADIE);		/* disable ADC interrupt */
	
}

преобразуется во вполне приличное:

 113:main.c        **** void run_ADC(void)
 114:main.c        **** {
 301               	.LM37:
 302               	/* prologue: frame size=0 */
 303               	/* prologue end (size=0) */
 115:main.c        **** 	
 116:main.c        **** 	set_sleep_mode(SLEEP_MODE_ADC);
 305               	.LM38:
 306 00ae 85B7      		in r24,85-0x20
 307 00b0 877E      		andi r24,lo8(-25)
 308 00b2 8860      		ori r24,lo8(8)
 309 00b4 85BF      		out 85-0x20,r24
 117:main.c        **** 	sleep_enable();
 311               	.LM39:
 312 00b6 85B7      		in r24,85-0x20
 313 00b8 8062      		ori r24,lo8(32)
 314 00ba 85BF      		out 85-0x20,r24
 118:main.c        **** 	ADCSRA |= (1<<ADIE);
 316               	.LM40:
 317 00bc 339A      		sbi 38-0x20,3
 119:main.c        **** 	ADCSRA |= (1<<ADSC);
 319               	.LM41:
 320 00be 369A      		sbi 38-0x20,6
 120:main.c        **** 	sei();
 322               	.LM42:
 323               	/* #APP */
 324 00c0 7894      		sei
 121:main.c        **** 	sleep_mode();
 326               	.LM43:
 327               	/* #NOAPP */
 328 00c2 85B7      		in r24,85-0x20
 329 00c4 8062      		ori r24,lo8(32)
 330 00c6 85BF      		out 85-0x20,r24
 331               	/* #APP */
 332 00c8 8895      		sleep
 333               		
 334               	/* #NOAPP */
 335 00ca 85B7      		in r24,85-0x20
 336 00cc 8F7D      		andi r24,lo8(-33)
 337 00ce 85BF      		out 85-0x20,r24
 338               	/* epilogue: frame size=0 */
 339 00d0 0895      		ret
 340               	/* epilogue end (size=1) */
 341               	/* function run_ADC size 22 (21) */
Проблема вот в чем: если я вызываю функцию run_ADC(), то контроллер более ни на что не реагирует. Попробовал следующий код:
void run_ADC(void)
{

	ADCSRA |= (1<<ADIE);
	ADCSRA |= (1<<ADSC);
	sei();

	while (bit_is_set(ADCSRA, ADSC));
}
Тут всё нормально - прерывание ADC срабатывает, уровень измеряет. Т.о. ИМХО проблема в том, что контроллер не возваращается из слипа. Но почему - ума не приложу! Народ, плз, помогите побороть проблему! ADC Noise Reduction не критичен, но очень желателен. Заранее благодарен!