вот код для тестирования регистров. несколько экспериментов показали, что разные регистры по-разному реагируют на снятие питания. в моих экспериментах, например,
r10 спустя 10 секунд обесточки получал значение при старте 0x08, и сохранял нулевое значение при паузах питания менее 8-10 секунд стабильно. регистр
r6 же терял нолик уже спустя 3 секунды обесточки, и принимал значение 1.
эффект налицо, но, видимо, для стабильности определения надо брать несколько регистров и анализировать их состояние...
Код
// регистр для эксперимента
#define REG "r10"
volatile __attribute__((section(".noinit"))) uint8_t mem;
__attribute__((section(".init0"), naked)) void get_r10(void){
register uint8_t tmp asm(REG);
mem = tmp;
}
int main(void){
printf_P(PSTR("\n" REG "=%u"),mem);
asm volatile ("ldi r16,0 \n mov " REG ",r16");
while(1);
}
P.S. как всегда, мега32 и STK500
вот еще результаты:
r0 - стабильно 18 (при очень котортких перерывах питания значение 16, нулевого не добился)
r1 - стабильно всегда 34, не добился иного
r2 - 0 всегда
r3 - помнит 0 до 1 секунды, при больших интервалах принимает значение 4 или 6
r15 - стабильно 1, изредка 3, нуля не добился
r20 - стабильно 22, нуля не добился
r25 - стабильно 0 при любых перерывах питания
r30 - стабильно 16, нуля не добился
вот, такие пироги...

еще результаты, с другим экземпляром меги32... неутешительные: повторяемости по регистрам нет никакой, все регистры имеют иное значение и сохранность данных практически не обеспечивают, т.е. записанный 0 практически мгновенно превращается в какое-то ненулевое значение... хотя при долгих перерывах есть тенденция добавления еще одного битика к "дефолтным"...
порадовал лишь r3 - как и в предыдущей меге четко видна разница между до-секундным перерывом питания и сверх-трехсекундным. в промежуточных интервалах точно не выверял...
первая мега использовалась не больше нескольких часов, перепрошивалась раз 50 (до начала экспериментов), а вторая - юзалась долго, перепрошивалась несколько сотен раз... может, износилась?