Кто силён в асме ? Помогите написать код,чтобы переменная или просто бит записывался каждый раз в следующую ячейку памяти EEPROM.А когда память заполнится что бы она стиралась и всё начиналось заново.
Я в асме вообще ничего не понимаю,а на си это не сделаешь!
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Код:
WriteToEEPROM: inc r16;адрес EEP++ ldi r18, 0x80;r18=EEPEND+1 cpse r16, r18;если адрес EEP = EEPEND+1 то очищаем адрес и переходим к записи rjmp write clr r16 write: sbic EECR, EEWE ;ждём готовности EEPROM rjmp write out EEARL, r16;EEARL(Регистр адреса EEPROM) = адрес EEP out EEDR, r17 ; EEDR(Регистр данных EEPROM) = r17 ldi tmp,(1<<EEMWE) ;Разрешаем запись бла, бла, бла... out EECR, tmp ldi tmp, (1<<EEWE)|(1<<EEMWE) out EECR, tmp ret
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
WriteToEEPROM: inc r16;адрес EEP++ ldi r18, 0x80;r18=EEPEND+1 cpse r16, r18;если адрес EEP = EEPEND+1 то очищаем адрес и переходим к записи rjmp write clr r16 write: sbic EECR, EEWE ;ждём готовности EEPROM rjmp write out EEARL, r16;EEARL(Регистр адреса EEPROM) = адрес EEP out EEDR, r17 ; EEDR(Регистр данных EEPROM) = r17 ldi tmp,(1<<EEMWE) ;Разрешаем запись бла, бла, бла... out EECR, tmp ldi tmp, (1<<EEWE)|(1<<EEMWE) out EECR, tmp ret
Спасибо за код!
В моём устройстве (противоугонка) при правильном наборе кода записывается переменная (в ЕЕПРОМ) и если произойдёт перезагрузка устройства то программа начинает работать с нужного места,а не начинает заново.
У важаемый Pooher подскажите как применить ваш код к моей программе на си?
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Цитата:
В моём устройстве (противоугонка) при правильном наборе кода записывается переменная (в ЕЕПРОМ) и если произойдёт перезагрузка устройства то программа начинает работать с нужного места,а не начинает заново.
Для таких целей код нужен другой...
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Как я понимаю, Ваша программа должна после Reset считывать ячейку EEPROM, и по её содержимому определять с каково места ей работать?
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Как я понимаю, Ваша программа должна после Reset считывать ячейку EEPROM, и по её содержимому определять с каково места ей работать?
Совершенно верно!
Я собрал противоугонное устройство в нём всё работало как и было задуманно, но появился подводный камень- из за помех бортовой сети автомобиля стали происходить перезагрузки.И как результат- машина глохнет и начинает сигналить. Попытка бороться с помехами не чего не дала .Последний шанс наладить устройство это записывать состояние устройства в энергонезависимую память системы, но я боюсь что циклов гарантированной перезаписи будет маловато.И вот по этому мне надо использоать весь объём ЕЕПРОМ.
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Тогда код подойдёт, с начала неправильно понял смысл задачи.
В начале (после ресет) можно такой код использовать.
Код:
ReadEEP: clr r16 ;очищаем адрес Read: out EEARL, r16 ;загружаем ldi r17, 1 out EECR, r17 in r17, EEDR ;читаем ldi r18, 0xFF cpse r17, r18 ;если что нибудь по этому адресу записано, переход rjmp Lable inc r16 ;если нет, адрес++, и снова читаем rjmp Read
Lable: ;код определения места, куда программа перейдёт, или выставить флаг можно ret
В Си я не силён, но по моему можно использовать ASM вставки.
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Lable: ;код определения места, куда программа перейдёт, или выставить флаг можно ret [/code]
А там можно вставить переменную "stat" что бы если там
0-иди туда-то;
1-иди туда-то;
или не переменную а просто бит
0-иди туда-то;
1-иди туда-то;
?????????????
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Код:
Lable: ldi tmp, xx cpse r17, xx ; прочитанное из EEPROM = xx ldi stat, 1 ; тогда пропускаем ldi tmp, yy cpse r17, yy прочитанное из EEPROM = yy ldi stat, 0 ; тогда пропускаем ret
т.е. если прочитанное из EEPROM = xx, то если = yy stat=0 если = yy, то stat=1 В главном цикле:
ReadEEP: clr r16 ;очищаем адрес Read: out EEARL, r16 ;загружаем ldi r17, 1 out EECR, r17 in r17, EEDR ;читаем ldi r18, 0xFF cpse r17, r18 ;если что нибудь по этому адресу записано, выход ret inc r16 ;если нет, адрес++, и снова читаем rjmp Read ret
main: rcall ReadEEP cpi r17, xx breq stat1 cpi r17, yy breq stat0 rjmp main
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Извините меня пожалуйста,но в этом коде я вообще ничего не могу понять!
Я разобрался как с помощью переменной из ЕЕПРОМ возвращаться в нужное место в программе . Я ни как не могу разобраться, как записывать в следующую ячейку ЕЕПРОМ.
У себя в программе я могу создать подпрограмму,для работы с ЕЕПРОМ. Мне нужно чтобы попав в эту подпрограмму (на АСМЕ) записывалась в следующую ячейку памяти переменная "stat" в которую я уже заранее (на Си) запишу значение 0 или 1 или 2 или 3.
Это возможно сделать? (извените за назойливость)
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Этим и занимается код из моего первого поста:
Код:
WriteToEEPROM: inc r16;адрес EEP++ ldi r18, 0x80;r18=EEPEND+1 cpse r16, r18;если адрес EEP = EEPEND+1 то очищаем адрес и переходим к записи rjmp write clr r16 write: sbic EECR, EEWE ;ждём готовности EEPROM rjmp write out EEARL, r16;EEARL(Регистр адреса EEPROM) = адрес EEP out EEDR, r17 ; EEDR(Регистр данных EEPROM) = r17 ldi tmp,(1<<EEMWE) ;Разрешаем запись бла, бла, бла... out EECR, tmp ldi tmp, (1<<EEWE)|(1<<EEMWE) out EECR, tmp ret
r16 - счётчик. Он инкрементируется перед каждым циклом записи.
ЗЫ: Неужели Вам мало "100,000 Write/Erase Cycles"
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Постановка на охрану-перезапись,
Снятие с охраны - перезапись,
Тревога - перезапись,
Режим VALET -перезапись.
Думаю что с такими запросами маловато будет!
А по поводу вашего кода ,как он узнает переменная "stat" какое число содержит? Где там её пририсовать?
(СПАСИБО!)
100000 циклов перезаписи всего
пусть 5 циклов на это:
1)Постановка на охрану-перезапись,
2)Снятие с охраны - перезапись,
3)Тревога - перезапись,
4)Режим VALET -перезапись.
5)Че нить еще, перезапись
пусть 10 раз в день(!!!) все это повторяется по циклу
тогда в день 50 раз перезапись.
100000/50=2000 дней
ИТОГ около 5 лет и 6 месяцев.... за это время ваша система устареет, либо раньше откажет что то менее надежное в системе (электролитические кондеры, например... )
Зарегистрирован: Вс янв 07, 2007 01:45:48 Сообщений: 491 Откуда: Российская Федерация, будь она неладна...
Рейтинг сообщения:0
Цитата:
А по поводу вашего кода ,как он узнает переменная "stat" какое число содержит? Где там её пририсовать?
Какой именно код? Для чтения, или для записи?
Цитата:
Постановка на охрану-перезапись, Снятие с охраны - перезапись, Тревога - перезапись, Режим VALET -перезапись. Думаю что с такими запросами маловато будет!
Я бы в таком случае для каждого действия использовал свою ячейку.
Цитата:
100000/50=2000 дней
ИТОГ около 5 лет и 6 месяцев.... за это время ваша система устареет, либо раньше откажет что то менее надежное в системе (электролитические кондеры, например... Confused )
Согласен. Хватить должно "за глаза".
_________________ Научить нельзя, можно научиться. Пифагор. Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения