DIDR0 та PRR

Трохи інший проект, трохи інший мікроконтролер (ATmega168PA, а не ATmega48PA), але знову мікроампери, як і у випадку зі світлодіодом. Тільки тепер головними героями є не світлодіод, який вирішив побути фотодіодом, а два регістри, які посперечатися, хто з них головніший.

Результат той же — завищене споживання. Навіть основна причина та ж сама — проміжна напруга на цифровому вході. На відміну від того світло-фото-діода вона там і повинна бути такою, бо це ще й вхід АЦП. Оскільки входи АЦП штатно повинні приймати «нецифрові» напруги, у мікроконтролері є регістр DIDR0 (Digital Input Disable Register), бітами у якому можна від’єднати від потрібної ніжки цифровий вхід і закоротити його на лінію GND. Звісно, я це знаю і, звісно, маску потрібних ніжок я у регістр записав.

«Але є одне але»
АЦП у цьому проекті потрібен періодично і ненадовго, тому він майже постійно вимкнений бітиком регістра PRR (Power Reduction Register), щоб додатково зекономити дещицю струму. При старті програми АЦП вимкнено. Відповідний фрагмент ініціалізації мікроконтролера виглядав наступним чином:

1
2
3
4
5
6
7
8
     // TIM1 та TIM2 потрібні завжди, інше буде дозволено при потребі
    xouti   ACSR, 1 << ACD
    xouti   PRR, ~((1<<PRTIM2) | (1<<PRTIM1))
     // Порти
    xouti   DIDR0, DIDR0_MASK
    xouti   PORTB, PORTB_PORT_MASK
    xouti   DDRB,  PORTB_DDR_MASK
    xouti   PORTC, PORTC_PORT_MASK

І от що з’ясувалося.
Якщо порядок запису у регістри PRR та DIDR0 такий, як показано вище, то цифрові входи не відключаються від ніжок. В результаті на вході заміру напруги живлення плати при збільшенні напруги струм плати спочатку росте з десь 250 мікроампер до 400, потім спадає до 300, бо напруга на вході АЦП минає середину живлення і наближається до безпечного рівня.
Якщо ж рядок 5 поставити перед рядком 3, то цифрові входи відключаються і залишаються відключеними і після вимикання живлення АЦП. Тобто при встановленні біта PRADC у регістрі PRR сам регістр DIDR0 продовжує працювати і керувати портами, але схеми запису в нього вирубаються начисто.

Мені і в голову не прийшло, що таке може бути — незважаючи на те, що опис регістра DIDR0 розміщено в кінці розділу опису АЦП. Все ж таки керує цей регістр ланцюгами цифрових входів портів, а не аналоговими входами.
Тепер знатиму…

[flagcounter image]