Столкнулся с такой проблемой: при перезаписи данных в EEPROM в памяти ATMega168p периодически записывается не требуемое значение, а ХЗ-что... В EEPROM хранятся две уставки скорости шагового двигателя. По сути - это значения OCR1A, которые определяют коэффициент деления Timer1. Значения 16-разрядные. Изменять эти значения требуется для калибровки (не часто). Иногда новые данные записываются корректно, но чаще пишется какая-то белиберда, объяснить которую не могу уже несколько недель. Бывает ситуация, когда одно значение пишется в EEPROM корректно, а второе не правильно. Нередко при изменении одной уставки слетают обе. Программный косяк практически исключен, т.к. при отладке программы в AB подобные ситуации не наблюдались ни разу. При этом чтение из EEPROM всегда (и в симуляторе и на железе) выполняется корректно.
Параметры железа: ардуинка-мини на ATMega168p (16 МГц, 5 вольт), кварц перепаян на 18,432 МГц (требуется по условиям задачи), напряжение на ноге RAW - 7,2 вольта, напряжение на ноге VCC -5,08 вольта. Перед записью числа в EEPROM останавливаю все процессы, генерирующие прерывания (два таймера и ADC). Программный код функции записи числа в EEPROM - стандартный макрос Громова, зашитый в AB, ничего от себя не добавляю. Там тоже есть строки, запрещающие генерацию аппаратных прерываний. Внешних прерываний на устройство не приходит. Других причин, мешающих перезаписи данных EEPROM, вроде бы нет... Пробовал писать данные в другие адреса памяти, это ничего не меняет. Но при программировании камня на компе, данные в EEPROM всегда записываются корректно. Предполагаю, что проблема в самом камне, но второго такого нет в наличии. Может быть, кто-то уже сталкивался с таким багом, или с его описанием? Куда копать? Возможно ли, что проблема связана с увеличенной частотой кварца? Хотя по даташиту камень должен работать на частотах до 20 МГц.
P.S. Появилась мысль: мо-быть перед записью новых значений обнулять ячейки памяти (писать туда FFFF)?
|