Цитата(demiurg_spb @ May 13 2010, 17:22)

Логично...
Первое, что бросилось в глаза это my_ltoa...
Ну вот ни разу не логично.
Во первых не увидел принципиальных отличий между моей функцией и вашей (ну кроме терминального \n, который мне вообще не нужен) , и в чём же может быть ошибка именно моей функции?
Во вторых проблему библиотечные функции не решили.
В третьих страшное твориться при отсутвии volatile именно в volatile unsigned char i=my_ltoa(pin_events_count, &log_string[20]); (с библиотечной ultoa та же ситуация) (но вообще здесь всё более или менее понятно)
В четвертых volatil'ы в такие функции ставятся не от хорошей жизни, а как последняя мера, когда совсем уже ничего не понятно, и единственный вред который они могут принести-только снижение производительности и лишний объем занимаемой памяти.
И в пятых, но на самом деле во первых, из любого "букваря по Си" следует, что после tick_10=0; tick_10 будет НОЛЬ!
Цитата(SysRq @ May 13 2010, 20:02)

Запись лога происходит не через 10 секунд? Откуда вывод, что вместо 0 пишется 1? Не понятно...
Согласен, сказал неудачно
Запись лога ДОЛЖНА идти каждые 10 секунд, но из-за того что tick_10 не обнуляется лог стабильно ИДЕТ каждые 9 секунд.
При этом в самом начале переменная ноль и первый лог приходит как положено, через 10 секунд после запуска, т.е. получается последовательность времени записи: 10, 19, 28, 37 и т.д.
Если конструкция tick_10=0; меняется на tick_10=tick_10-10 всё становится нормально и получается последовательность времени записи:10, 20, 30, 40 и т.д.
принципиальным тут считаю именно способ обнуления переменных, используемый компилятором т.е. sts <адрес>, r1.
Сразу добавлю: Сейчас перепроверил предположение о испорченном r1 и оно оказалось верным.
Вынеся tick_10=0; перед функциями подготовки строки и её отправки всё заработало как и должно, сейчас буду искать кто же именно может менять значение регистра.