Eeprom

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

Здравствуйте, сделал счётчик импульсов с отображением на семимегментных индикаторах, все заработало и прекрасно считало, но как только попытались сделать сохранение параметров, все сломалось, индикаторы моргают, где то нашёл что нужно не писать в 0 ячейке, писали в других, не помогло питал от usb думал беда в питание, замена источника питания на лабораторный блок не помогла:(
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Проблема в 147-ой строке кода.
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Для начала, код в студию.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

Здравствуйте, сделал в атмел студио 7 счётчик с памятью, и выводом информации через сдвиговые регистры, все работает и считает но когда добавил в код работу с памятью началась ерунда, проверка в протеусе показывает что он считает но странные значения выводит непонятные, в железе все вообще отказывается работать, как горят все сегменты так и горят и не какой реакции, надеюсь на себя но на вас очень рассчитываю даже незнаю в какую сторону смотреть.
Вложения
prog.txt
Текст программы
(2.72 КБ) 193 скачивания
Screenshot_1.png
Схема в протеусе
(95.03 КБ) 393 скачивания
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Yarikkasl, сохранять значения в EEPROM надо только, если они не больше девяти. Потому что на следующем цикле сами же оттуда считаете значения за пределами индекса массива
Реклама
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

ПростоНуб, дак я и так делал и выносил запись в самый конец цикла, все не работает, в протеусе я считаю так там вместо сотен какая то ерунда показывается,
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

И какого .... КОТЯТ в учебных проектах тянет сходу на столь ЖИРНЫЕ МК???
:?
Это же ВСЕГО-ТО УЧЕБКА...
:dont_know:
При таком примере ни проверить на практике ни желания изучать начинку для
корректного ответа нету...
:sleep:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Yarikkasl, вот так:

Код: Выделить всё

...
      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.S. Но EEPROM такую мастурбацию долго не выдержит - сдохнет. У него все же ограниченное количество записей, хоть и большое.

P.P.S. Докопировался. В нижнем блоке исправил k1 на k2
Последний раз редактировалось ПростоНуб Пт май 24, 2019 09:16:06, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

В ЕЕПРОМку пишем только в случае различия данных за определенный период.
Обычно для контрольных счетчиков используется какая-нибудь схемка энергонезависимого ОЗУ...
DS1307 к примеру... или дежурный источник питания к самому МК подключенный...
:roll:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

BOB51, просто потому что нужно сделать этот счётчик для военки, а у нее есть полный аналог 1887ве7т, поискал я в интернетах и пришел к выводу что это отличный вариант, атмега 128 распространенная есть примеры и уроки.

Добавлено after 2 minutes 29 seconds:
ПростоНуб, почему не выдержит? Ведь там функция update она я так понимаю сравнивает и если значение изменилось то перезапишет, и мне много не нужно лишь до 999 правда считать будет долго
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Можно не долбить одни и те же ячейки, а сделать кольцевой буфер. 4к EEPROM хватит надолго. Можно задействовать свободную FLASH. Но это на любителя. Можно вообще выбросить регистры и подключить индикаторы через резисторы напрямую к лапам контроллера.
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

ПростоНуб, akl, а вот и не работает нехрена. Самое грустное что я делал этот. Счётчик который в протеусе просто отлично работал а вот в жизни отказался, а этот в железе заработал хоть и частично, так что получилось и тут нехрена и там нехрена

Добавлено after 5 minutes 32 seconds:
akl, зачем убирать регистры, с ними все отлично работает. Показывает. Единственное что вот. Когда я работаю с памятью все умирает.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

всегда говорил и могу повторить не стесняясь: все проблемы от написания кода тяп-ляп. у вас в кучу смешан и счет, и резервирование данных в EEPROM, и вывод на индикатор, и опрос внешних сигналов... и понять, что повлияло на результат практически невозможно.

приведите код к состоянию, когда каждое функциональное действие - отдельная функция, а в main только увязка их между собой - гарантирую, что проблема исчезнет или вы мгновенно поймете, в чем именно она заключается и исправите её.
даю наводку:
1. вывод на регистры (индикаторы) - отдельная функция, вызываемая в main только в одном месте единожды
2. сохранение показаний в EEPROM - отдельная функция, вызываемая в main только в одном месте единожды
3. счет событий я бы тоже сделал отдельной функцией, вызываемой из одного места... но не обязательно, ибо так могут быть проблемы со скоростью счета - решать вам
4. если кнопки чем-то управляют, то опрос их состояния тоже отдельная функция.

гарантирую вам, что следование моим советам быстро поможет вам решить проблему и результат будет хорош как по красоте кода, так и по его функционалу.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Yarikkasl, если бы я еще знал, что и как должно работать. Как сделать так, чтобы не вываливаться за индекс массива я указал. Реакция на кнопки в Вашем коде непредсказуема, так как никаких попыток устранить их дребезг не пердпринимается. Почему данные обновляются на индикаторе не тогда, когда они изменяются, а только при нажатии кнопки на PA2 (или PA2 и PA3) - мне тоже не понятно. Для чего нужны переменные sr1 и sr2 - загадка. Так как физически нажать одновременно две кнопки невозможно (одна из них всегда нажмется первой), то при нажатии на две кнопки всегда будет отрабатывать последний if, а предыдущий - только если за 0.2 секунды не успели кнопки отпустить.
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Насчет "полного аналога 1887ве7т" - я б так утверждать не рискнул...
Даташиты надо ДЕТАЛЬНО изучить...
8)
Ну и саму задачу...
Для самокалибрующегося счетчика выданных аппаратом (копировалкой) листочков
текущего клиента с функцией сортировки по форматам и "вложенного клиента"(внезапно спешащего)
да суммарного накопителя результата для хозяина аппарата хватило и DS1307 + AT89C2051.
Там только за батарейкой раз в году проследить требовалось.
:tea:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

BOB51, в даташите благо он на родном, есть раздел в котором сказанное чем они отличаются, но к моей задаче это не имеет отношения.проблемы питания тут нет, хоть 1 кВт, другое дело что я не совсем програмист
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Питание - вопрос актуален если требуется независимая от контролируемого устройства работа с сохранением результата оперативного подсчета.
А ЕЕПРОМ или вариант записи в ПЗУ в отдельную область в режиме самопрограммирования необходимо лишь для итоговых результатов за более крупный интервал времени работы.
В принципе скорость записи в ОЗУ значительно выше, чем в ЕЕПРОМ или в ПЗУ.
Это не программиста решение, а схемотехника.
8)
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

ПростоНуб, A0 используется для подачи импульсов число которых учитывается, А1 используется в качестве признака, она все время замкнута в процессе счёта либо нет, А2 используется как признак подключения индикаторов, А3 просто кнопка которую нажимает пользователь что бы увидеть другое значение, я изначально сделал в формате pina=*0b00001110 но мне посоветовали не смотреть на другие пины и использовать только те которые используются ведь может быть признак на A1 и подключен индикатор. Что касается констант с отрицательными значениями их назначение я не особо понимаю, но на счёт они не влияют, я вообще особо не понимаю почему оно не работает как нужно

Добавлено after 2 minutes 6 seconds:
ARV, понимать бы ещё что вы мне посоветовали, примерно я понимаю, но вот детально нет, в принципе я понял что мне советуете, а вот как реализовать не особо

Добавлено after 2 minutes 31 second:
BOB51, нет питание не независимо, работать будет так. 1. Подали питание, через какое то время не менее 10 минут будут импульсы длинные около минуты и не чаще раза в,5 минут, когда счёт прекратиться не менее чем через час подача питания прекращается
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Yarikkasl писал(а):я понял что мне советуете, а вот как реализовать не особо
есть несколько вариантов решения этой проблемы:
1. вы изучаете язык Си и пытаетесь следовать моим советам под контролем форумчан, думаю, помощь в ваших попытках будет оказана весьма оперативно
2. вы размещаете в разделе "Работа" предложение сделать код за вас, разумеется, перед этим вы составляете подробное описание задачи (делаете ТЗ). предполагаю, что на задачу подобной сложности не потребуется более 3000 рублей.
есть и другие варианты той или иной степени приемлемости, но их поиск я оставляю вам :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Чт май 23, 2019 07:59:45
Откуда: Екатеринбург

Сообщение Yarikkasl »

ARV, я ещё напишу
Ответить

Вернуться в «AVR»