Свежие обсуждения
Микроконтроллеры

Использование внутренего eeprom пика

1 3

Парни спасибо.
Дествительно необходимо устройсто которое работет на отказ как написал. Digital. Число 25 было выбрано для отладки. Усторойтво должно заткнутся примерно после 500000.
Про ограниченность епром тоже знаю. Поэтому щас работаю над тем что-бы запись была не каждый цикл.
Тут хочу спросить совета как лучше организовать. Можно организовать ограничения на кол-во включения, но ограничиваться числом 255 не хочется, и в тоже время не охота связываться с большим объемом памяти (по тому как пока не знаю как). Можно организовать по переполнению таймера, но тут тоже не получиться что-бы устройство отработало 500000 циклов (заткнется раньше). По контролю питания, придется немного усложнить схему, то же не самый хороший вариант. (уже сделана печатка)
Вариант с использованием большего объема наверное лучший, но как его организовать не знаю.
Пните в нужном направлении...

 

500000 чего? Минут?

 

Dad: Усторойтво должно заткнутся примерно после 500000.
"Примерно 500 тыс". это всё-таки абстрактно как-то. После ~500 тыс. включений/выключений, морганий индикатором или чего-то ещё? Так конечно реальное значение для eeprom, т.к. ячеек достаточно много. Но есть ещё один момент, в eeprom может иногда записаться совсем не то что записывали. Надо проверочно считывать после записи, иначе можно и промахнуться с жёстким условием проверки.

 

Dad: Про ограниченность епром тоже знаю.

там не просто ограничение на запись, а на колличество изменения состояния ячейки - т.е. в вашем случае младший бит будет максимально "изнашиваться", а старший будет "нагружен" в 256 раз меньше, а самый старший в 500000 раз - целесообразно пересмотреть алгоритм счёта/записи и предусмотреть алгоритм замены "изношенных" байт(ячеек).

 

Dad: Можно организовать ограничения на кол-во включения, но ограничиваться числом 255 не хочется, и в тоже время не охота связываться с большим объемом памяти (по тому как пока не знаю как).
Блин, ну это намного проще, не надо будет насиловать EEPROM, достаточно при запуске прочитать значение, добавить единицу и записать обратно в EEPROM. И почему Вы решили, что будет ограничение 255? Используйте несколько ячеек для 16-ти или 32-битного значения. Писать и читать в любом случае придется байтами, потом их "склеивать".

Для примера чтение 16-ти битного значения:
Ячейка 0x00 = старший байт
Ячейка 0x01 = младший байт
Результат (16-bit) = (старший байт * 256) + младший байт

С записью, думаю, сами разберетесь - все придется делать БАЙТАМИ, об этом вам писали на первой странице.

 

Ага вот этото подходит

jusupoff: Для примера чтение 16-ти битного значения:
Ячейка 0x00 = старший байт
Ячейка 0x01 = младший байт
Результат (16-bit) = (старший байт * 256) + младший байт
С записью, думаю, сами разберетесь - все придется делать БАЙТАМИ, об этом вам писали на первой странице.

Попробую разобраться сам.

 

Парни, опять застрял.
Проблема в том, что если изначально прописать строку
i=0;, то все работает. (т.е изначально обнулить ячейку епром)
Но тогда не получается реализовать функцию, что устройство работает до определенного условия.
Потому, что при каждом перезапуске епром обнуляется.
Решил организовать обнуление епром через прирывание при первом запуске (сам при первом запуске обнулю епром, 887 пик позволяет реализовать прирываение при изменении сигнала на B4).
Прогу написал, но что-то не работает.
Гляньте что у меня не так с прерыванием.
Или мож какие другие решения предложите.
Нужно реализовать работу устройства до определенного кол-ва включений. (Сейчас на момент отладки это 4)
Спасибо

235611.c

 

Для начала
#FUSES RC,NOLVP,WDT,PUT,NOCPD,NOPROTECT,NOWRT

Не забывайте обнулять вачдог тогда уж. Или делайте NOWDT


#include <16f877.h>
#FUSES RC,NOLVP,NOWDT,PUT,NOCPD,NOPROTECT,NOWRT
#use delay (clock=4000000)

int8 i; // задаем начальное значение I

#int_RB // Прерывание по изменению потра B4
void RB_isr(void)
{
write_eeprom(0x0A,0);
disable_interrupts(INT_RB);//запретить прерывания по изменению RB
}

void main()
{
enable_interrupts(INT_RB); // Разрешение прерывания
clear_interrupt(INT_RB);//на всякий пожарный сбросить бит срабатывания прерывания
enable_interrupts(GLOBAL);

i = read_eeprom (0x0A);
i++;
write_eeprom(0x0A,i);
if (i<4){видимо тут потерялось действие по условию};

while (1)// цикл
{
output_d(0x00); //светодиоды не горят
delay_ms(300);// задержка на секунду
output_d(0xff);//горят все светодиоды порта д, меняя значения от 0 до ff
//меняем горящие светодиоды
delay_ms(300);
}
}

/pre>

 

И проще тогда уж принять за начало 255 во всех ячейках и работать от этого.
Алгоритм такой.

Взять первую ячйку
Сравнить с 0
Если больше, то минус 1
Если равно 0, то адрес ячейки плюс 1
Сравнить с 0
и тд...

 
1 3