Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

ADC в ATtiny13 - не просыпается после sleep (ADC Noise Reduction).

Отправлено Sovengener 01 февраля 2007 г. 19:23


Мужики, допоможыть!

Пытаюсь работать с АЦП 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< 316 .LM40:
317 00bc 339A sbi 38-0x20,3
119:main.c **** ADCSRA |= (1< 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 не критичен, но очень желателен.

Заранее благодарен!


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
при вычитании трёх из шести получится:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru