Eeprom
Здравствуйте, сделал счётчик импульсов с отображением на семимегментных индикаторах, все заработало и прекрасно считало, но как только попытались сделать сохранение параметров, все сломалось, индикаторы моргают, где то нашёл что нужно не писать в 0 ячейке, писали в других, не помогло питал от usb думал беда в питание, замена источника питания на лабораторный блок не помогла:(
- Реклама
Проблема в 147-ой строке кода.
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Для начала, код в студию.
Здравствуйте, сделал в атмел студио 7 счётчик с памятью, и выводом информации через сдвиговые регистры, все работает и считает но когда добавил в код работу с памятью началась ерунда, проверка в протеусе показывает что он считает но странные значения выводит непонятные, в железе все вообще отказывается работать, как горят все сегменты так и горят и не какой реакции, надеюсь на себя но на вас очень рассчитываю даже незнаю в какую сторону смотреть.
- Вложения
-
- prog.txt
- Текст программы
- (2.72 КБ) 193 скачивания
-
- Screenshot_1.png
- Схема в протеусе
- (95.03 КБ) 393 скачивания
Yarikkasl, сохранять значения в EEPROM надо только, если они не больше девяти. Потому что на следующем цикле сами же оттуда считаете значения за пределами индекса массива
- Реклама
ПростоНуб, дак я и так делал и выносил запись в самый конец цикла, все не работает, в протеусе я считаю так там вместо сотен какая то ерунда показывается,
И какого .... КОТЯТ в учебных проектах тянет сходу на столь ЖИРНЫЕ МК???
Это же ВСЕГО-ТО УЧЕБКА...
При таком примере ни проверить на практике ни желания изучать начинку для
корректного ответа нету...

Это же ВСЕГО-ТО УЧЕБКА...
При таком примере ни проверить на практике ни желания изучать начинку для
корректного ответа нету...
Yarikkasl, вот так:
P.S. Но EEPROM такую мастурбацию долго не выдержит - сдохнет. У него все же ограниченное количество записей, хоть и большое.
P.P.S. Докопировался. В нижнем блоке исправил k1 на k2
Код: Выделить всё
...
if (!(PINA & (1<<PINA0)) && (PINA & (1<<PINA1)))
{
_delay_ms(200);
if (!(PINA & (1<<PINA0)))
{
i1++;
if (i1 > 9)
{
i1 = 0;
j1++;
// eeprom_update_byte (&memory[1], j1);
if (j1 > 9)
{
j1 = 0;
// k1++;
if (++k1 > 9) k1=0; // <--
eeprom_update_byte (&memory[2], k1);
}
eeprom_update_byte (&memory[1], j1); // <--
}
eeprom_update_byte (&memory[0], i1); // <---
}
while (!(PINA & (1<<PINA0)));
}
if (!(PINA & ((1<<PINA1) | (1<<PINA0))))
{
_delay_ms(200);
if (!(PINA & (1<<PINA0)))
{
i2++;
// eeprom_update_byte (&memory[3], i2);
if (i2 > 9)
{
i2 = 0;
j2++;
// eeprom_update_byte (&memory[4], j2);
if (j2 > 9)
{
j2 = 0;
// k2++;
if (++k2 > 9) k2=0; // <--
eeprom_update_byte (&memory[5], k2);
}
eeprom_update_byte (&memory[4], j2); // <--
}
eeprom_update_byte (&memory[3], i2); // <--
}
while (!(PINA & (1<<PINA0)));
}
...
P.P.S. Докопировался. В нижнем блоке исправил k1 на k2
Последний раз редактировалось ПростоНуб Пт май 24, 2019 09:16:06, всего редактировалось 2 раза.
В ЕЕПРОМку пишем только в случае различия данных за определенный период.
Обычно для контрольных счетчиков используется какая-нибудь схемка энергонезависимого ОЗУ...
DS1307 к примеру... или дежурный источник питания к самому МК подключенный...

Обычно для контрольных счетчиков используется какая-нибудь схемка энергонезависимого ОЗУ...
DS1307 к примеру... или дежурный источник питания к самому МК подключенный...
BOB51, просто потому что нужно сделать этот счётчик для военки, а у нее есть полный аналог 1887ве7т, поискал я в интернетах и пришел к выводу что это отличный вариант, атмега 128 распространенная есть примеры и уроки.
Добавлено after 2 minutes 29 seconds:
ПростоНуб, почему не выдержит? Ведь там функция update она я так понимаю сравнивает и если значение изменилось то перезапишет, и мне много не нужно лишь до 999 правда считать будет долго
Добавлено after 2 minutes 29 seconds:
ПростоНуб, почему не выдержит? Ведь там функция update она я так понимаю сравнивает и если значение изменилось то перезапишет, и мне много не нужно лишь до 999 правда считать будет долго
Можно не долбить одни и те же ячейки, а сделать кольцевой буфер. 4к EEPROM хватит надолго. Можно задействовать свободную FLASH. Но это на любителя. Можно вообще выбросить регистры и подключить индикаторы через резисторы напрямую к лапам контроллера.
ПростоНуб, akl, а вот и не работает нехрена. Самое грустное что я делал этот. Счётчик который в протеусе просто отлично работал а вот в жизни отказался, а этот в железе заработал хоть и частично, так что получилось и тут нехрена и там нехрена
Добавлено after 5 minutes 32 seconds:
akl, зачем убирать регистры, с ними все отлично работает. Показывает. Единственное что вот. Когда я работаю с памятью все умирает.
Добавлено after 5 minutes 32 seconds:
akl, зачем убирать регистры, с ними все отлично работает. Показывает. Единственное что вот. Когда я работаю с памятью все умирает.
всегда говорил и могу повторить не стесняясь: все проблемы от написания кода тяп-ляп. у вас в кучу смешан и счет, и резервирование данных в EEPROM, и вывод на индикатор, и опрос внешних сигналов... и понять, что повлияло на результат практически невозможно.
приведите код к состоянию, когда каждое функциональное действие - отдельная функция, а в main только увязка их между собой - гарантирую, что проблема исчезнет или вы мгновенно поймете, в чем именно она заключается и исправите её.
даю наводку:
1. вывод на регистры (индикаторы) - отдельная функция, вызываемая в main только в одном месте единожды
2. сохранение показаний в EEPROM - отдельная функция, вызываемая в main только в одном месте единожды
3. счет событий я бы тоже сделал отдельной функцией, вызываемой из одного места... но не обязательно, ибо так могут быть проблемы со скоростью счета - решать вам
4. если кнопки чем-то управляют, то опрос их состояния тоже отдельная функция.
гарантирую вам, что следование моим советам быстро поможет вам решить проблему и результат будет хорош как по красоте кода, так и по его функционалу.
приведите код к состоянию, когда каждое функциональное действие - отдельная функция, а в main только увязка их между собой - гарантирую, что проблема исчезнет или вы мгновенно поймете, в чем именно она заключается и исправите её.
даю наводку:
1. вывод на регистры (индикаторы) - отдельная функция, вызываемая в main только в одном месте единожды
2. сохранение показаний в EEPROM - отдельная функция, вызываемая в main только в одном месте единожды
3. счет событий я бы тоже сделал отдельной функцией, вызываемой из одного места... но не обязательно, ибо так могут быть проблемы со скоростью счета - решать вам
4. если кнопки чем-то управляют, то опрос их состояния тоже отдельная функция.
гарантирую вам, что следование моим советам быстро поможет вам решить проблему и результат будет хорош как по красоте кода, так и по его функционалу.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Yarikkasl, если бы я еще знал, что и как должно работать. Как сделать так, чтобы не вываливаться за индекс массива я указал. Реакция на кнопки в Вашем коде непредсказуема, так как никаких попыток устранить их дребезг не пердпринимается. Почему данные обновляются на индикаторе не тогда, когда они изменяются, а только при нажатии кнопки на PA2 (или PA2 и PA3) - мне тоже не понятно. Для чего нужны переменные sr1 и sr2 - загадка. Так как физически нажать одновременно две кнопки невозможно (одна из них всегда нажмется первой), то при нажатии на две кнопки всегда будет отрабатывать последний if, а предыдущий - только если за 0.2 секунды не успели кнопки отпустить.
Насчет "полного аналога 1887ве7т" - я б так утверждать не рискнул...
Даташиты надо ДЕТАЛЬНО изучить...
Ну и саму задачу...
Для самокалибрующегося счетчика выданных аппаратом (копировалкой) листочков
текущего клиента с функцией сортировки по форматам и "вложенного клиента"(внезапно спешащего)
да суммарного накопителя результата для хозяина аппарата хватило и DS1307 + AT89C2051.
Там только за батарейкой раз в году проследить требовалось.

Даташиты надо ДЕТАЛЬНО изучить...
Ну и саму задачу...
Для самокалибрующегося счетчика выданных аппаратом (копировалкой) листочков
текущего клиента с функцией сортировки по форматам и "вложенного клиента"(внезапно спешащего)
да суммарного накопителя результата для хозяина аппарата хватило и DS1307 + AT89C2051.
Там только за батарейкой раз в году проследить требовалось.
BOB51, в даташите благо он на родном, есть раздел в котором сказанное чем они отличаются, но к моей задаче это не имеет отношения.проблемы питания тут нет, хоть 1 кВт, другое дело что я не совсем програмист
Питание - вопрос актуален если требуется независимая от контролируемого устройства работа с сохранением результата оперативного подсчета.
А ЕЕПРОМ или вариант записи в ПЗУ в отдельную область в режиме самопрограммирования необходимо лишь для итоговых результатов за более крупный интервал времени работы.
В принципе скорость записи в ОЗУ значительно выше, чем в ЕЕПРОМ или в ПЗУ.
Это не программиста решение, а схемотехника.

А ЕЕПРОМ или вариант записи в ПЗУ в отдельную область в режиме самопрограммирования необходимо лишь для итоговых результатов за более крупный интервал времени работы.
В принципе скорость записи в ОЗУ значительно выше, чем в ЕЕПРОМ или в ПЗУ.
Это не программиста решение, а схемотехника.
ПростоНуб, A0 используется для подачи импульсов число которых учитывается, А1 используется в качестве признака, она все время замкнута в процессе счёта либо нет, А2 используется как признак подключения индикаторов, А3 просто кнопка которую нажимает пользователь что бы увидеть другое значение, я изначально сделал в формате pina=*0b00001110 но мне посоветовали не смотреть на другие пины и использовать только те которые используются ведь может быть признак на A1 и подключен индикатор. Что касается констант с отрицательными значениями их назначение я не особо понимаю, но на счёт они не влияют, я вообще особо не понимаю почему оно не работает как нужно
Добавлено after 2 minutes 6 seconds:
ARV, понимать бы ещё что вы мне посоветовали, примерно я понимаю, но вот детально нет, в принципе я понял что мне советуете, а вот как реализовать не особо
Добавлено after 2 minutes 31 second:
BOB51, нет питание не независимо, работать будет так. 1. Подали питание, через какое то время не менее 10 минут будут импульсы длинные около минуты и не чаще раза в,5 минут, когда счёт прекратиться не менее чем через час подача питания прекращается
Добавлено after 2 minutes 6 seconds:
ARV, понимать бы ещё что вы мне посоветовали, примерно я понимаю, но вот детально нет, в принципе я понял что мне советуете, а вот как реализовать не особо
Добавлено after 2 minutes 31 second:
BOB51, нет питание не независимо, работать будет так. 1. Подали питание, через какое то время не менее 10 минут будут импульсы длинные около минуты и не чаще раза в,5 минут, когда счёт прекратиться не менее чем через час подача питания прекращается
есть несколько вариантов решения этой проблемы:Yarikkasl писал(а):я понял что мне советуете, а вот как реализовать не особо
1. вы изучаете язык Си и пытаетесь следовать моим советам под контролем форумчан, думаю, помощь в ваших попытках будет оказана весьма оперативно
2. вы размещаете в разделе "Работа" предложение сделать код за вас, разумеется, перед этим вы составляете подробное описание задачи (делаете ТЗ). предполагаю, что на задачу подобной сложности не потребуется более 3000 рублей.
есть и другие варианты той или иной степени приемлемости, но их поиск я оставляю вам
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


