Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс. e-mail:jobsmp@pochta.ru |
Пытаюсь работать с АЦП 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) Проблема вот в чем: если я вызываю функцию run_ADC(), то контроллер более ни на что не реагирует. void run_ADC(void) ADCSRA |= (1 у.с ADIE); while (bit_is_set(ADCSRA, ADSC)); Тут всё нормально - прерывание ADC срабатывает, уровень измеряет. Народ, плз, помогите побороть проблему! ADC Noise Reduction не критичен, но очень желателен. Заранее благодарен!
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<
317 00bc 339A sbi 38-0x20,3
119:main.c **** ADCSRA |= (1<
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) */
Попробовал следующий код:
{
ADCSRA |= (1 у.с ADSC);
sei();
}
Т.о. ИМХО проблема в том, что контроллер не возваращается из слипа. Но почему - ума не приложу!
Ответы