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

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

1 3

Необходимо написать прогу на Си для пика
На выходе контроллера мигает светодиодики (определенное кол-во раз)
И что бы это кол-во раз (сколько раз уже моргул) запоминалось в епроме пика.
После отключения, включение пика, считывалось оставшиеся кол-во раз и продолжал мыргать.
Кое-что набросал, но счет всегда начинается по новой.
Может кто гляне и толкнет в нужном направлении

233175.c

 

На сколько я помню write_eeprom(0x0A,i); может писать в еепром только 8-разрядные числа.

#include <16f877.h>

#FUSES RC,NOLVP,WDT,PUT,NOCPD,NOPROTECT,NOWRT
#use delay (clock=4000000)

int32 i=0; // задаем начальное значение I

void main()
{
write_eeprom(0x0A,i);-------------------------------------}}}}} Это тут зачем?
set_tris_d(0x00); //PORTD на вывод
i = read_eeprom (0x0A);
while (i=25)// цикл
{
output_d(0x00); //светодиоды не горят
delay_ms(300);// задержка на секунду
output_d(0xff);//горят все светодиоды порта д, меняя значения от 0 до ff
//меняем горящие светодиоды
delay_ms(300);
i++; // увеличиваем значение
write_eeprom(0x0A,i);
}

}

 

write_eeprom(0x0A,i);-------------------------------------}}}}} Это тут зачем?

Здесь я пытаюсь записать начальные условия что бы прога читала данные из епром при запуске.
Но чувствую что при перезапуске прога начинает читать условие отсюда же.
Как этого избежать?

 

Во первых надо писать 32 разрядное число в еепром побайтово. Вручную резать, поштучно писать. Ну или я не знаю как. Я делал вручную. Именовал байты и поштучно писал в еепром.

Dad: десь я пытаюсь записать начальные условия что бы прога читала данные из епром при запуске.
Это же запись. А читает она i = read_eeprom (0x0A); Так что ту строчку просто удалить. Проверить для начала работу проги на 8 разрядном числе, а потом лопатить дальше.

 


#include <16f877.h>

#FUSES RC,NOLVP,WDT,PUT,NOCPD,NOPROTECT,NOWRT
#use delay (clock=4000000)

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

void main()
{
i = read_eeprom (0x0A);
set_tris_d(0x00); //PORTD на вывод
While (1)
{
while (i=25)// цикл
{
output_d(0x00); //светодиоды не горят
delay_ms(300);// задержка на секунду
output_d(0xff);//горят все светодиоды порта д, меняя значения от 0 до ff
//меняем горящие светодиоды
delay_ms(300);
i++; // увеличиваем значение
write_eeprom(0x0A,i);
}
}
}

 

Vlad, у меня получилось вот как.
int8 i; // задаем начальное значение I
void main()
{
set_tris_d(0x00); //PORTD на вывод
i = read_eeprom (0x00);
if(i>25) // здесь проверяю что бы значение из епром при начальном запуске было корректным
write_eeprom(0x00,0); // записываю нулевое значени
while (i=25) // цикл
{
output_d(0x00); //светодиоды не горят
delay_ms(300);// задержка на секунду
output_d(0xff);//горят все светодиоды порта д, меняя значения от 0 до ff
//меняем горящие светодиоды
delay_ms(300);
i++; // увеличиваем значение
write_eeprom(0x00,i);
}
}
Вроде все работает, но опять появляется косяк. Если счет дошел до 25, и после этого перезапустить пик, Он опять начинает считать с нуля по новой.
А надо чтоб вообще не включался. А если счет не дошел до 25 и перезапустить его то он досчитывает остаток до 25 как положенно.

 

Dad: while (i=25) // цикл
Не уверен, что именно будет "правдой" для условия while, но компилятор тут присваивает i значение 25. Переменная портится.

А задачка весёлая...
Ведь изначально в еепроме хранятся не нули, а 255 во всех ачейках.

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

Есть простой вариант - прогу ща сделаю, но для её работы надо вручную обнулить значение еепром, программатором.

 

Digital: или просто форум не отобразил?
В письмах так же было. Хотя может в письма ошибка попала с форума. Главный обещал починить.
Предварительно обнулить еепром, тогда будет работать


#include <16f877.h>

#FUSES RC,NOLVP,NOWDT,PUT,NOCPD,NOPROTECT,NOWRT
#use delay (clock=4000000)

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

void main()
{
i = read_eeprom (0x00);
output_d(0x00); //светодиоды не горят
set_tris_d(0x00); //PORTD на вывод

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

 

ОК. Я просто подумал, что Dad ваш вариант копипастом с форума вставил и соотв-но ошибся.

Vladikas: Ведь изначально в еепроме хранятся не нули, а 255 во всех ачейках.
А если вычитать 255 принудительно или... это танцы с бубном? В новых PIC в EEPROM тоже не нули?

 

Ща из пиккита считал инфу, FF везде...А я с ним ничего не делал, по крайней мере с еепромом.
Можно и вычитать. Но у топикстартера это только начало, он хочет в еепром писать 32 разрядное число. Походу это какой-то счётчик наработки для устройства.