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