ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
537064 Топик полностью
Adept (06.08.2014 00:39 - 01:08, просмотров: 338) ответил Apтём на Есть ли там грабли?
Всё, осилил, работает (в принципе просто) больше времени ушло на отладку записи в проекте (при разных ситуациях пропажи питания) Если кому интересно - код внутри Там есть макросы, но, в принципе всё понятно. Удручает одно: Ну почему, блядь не сделать всё прозрачно и понятно, одной двумя, ну десятком команд. ИМХО все эти телодвижения можно былоб упрятать в кремний, оставив программисту одну инструкцию записи в EEPROM. Уроды, блин. P.S. Охренеть какая развесистая тема получилась, пофлеймили изрядно, ну не без пользы, конечно :)) ;------------------------------------------------------------------------------------------------- ;Обновление (сравнение/запись)блока данных заданой длины из RAM в EEPROM для контроллера XMEGA ;NVM контроллер д.б. сконфигурирован так, чтобы можно было использовать команды ld/st (MAPPED EEPROM) ;Используемые регистры: ; X - Адрес начала размещения блока данных в RAM ; Z - Адрес начала размещения записываемых данных в EEPROM ; TMP - Длина считываемого блока (до 256 байт) 1..256 ; TMP2 - рабочий регистр ;05/VIII.14 WriteEEPROM_ZX: push TMP ;Сохраним длину блока данных (передаваемую данной П/П через TMP) ; Mapping_EEPROM ;Переназначение EEPROM в область ОЗУ (для возможности использования команд ld/st) ;-------------- запись (обновление) блока данных из RAM в EEPROM Updating: ;Проверка не занят ли NVM контроллер какой операцией (например записью предыдущего байта) Wait_forNVM_BUSY ;проверка готовности к записи (окончания предыдущей операции, - например записи предыдущего байта) ;------------------------ ld TMP,X ;читаем из RAM очередной байтик данных в TMP ld TMP2,Z ;читаем байт из EEPROM cp TMP,TMP2 ; сравниваем их. breq WR_CheckEND ; Если они одинаковые, то пропускаем запись и идём на проверку , иначе будем писать. ;--- ЗАПИСЬ (вариант для Mapped-EEPROM) --- st Z,TMP ;копируем байт данных (TMP) в NVM буфер данных EEPROM (вариант для Maped-EEPROM) ; sts NVM_ADDR0,ZL ;копируем адрес в NVM буфер адреса EEPROM (байты 0,1,2) sts NVM_ADDR1,ZH clr TMP2 sts NVM_ADDR2,TMP2 S_LDI NVM_CMD,NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc ;запишем команду ситрания-записи ; lds TMP,NVM_CTRLA ;установим флажок CMDEX, активизирующий команду записи (не меняя остальных бит) sbr TMP,NVM_CMDEX_bm Write_Locked_Register_by_REG NVM_CTRLA,TMP ;Активизируем команду записи через механизм работы с защищёнными регистрами WR_CheckEND: adiw X,1 ;инкрементируем индексные (адресные) регистры (выше это делать нельзя, т.к. Z используется для записи) adiw Z,1 pop TMP ;посмотрим на счётчик считанных байт subi TMP,1 ; уменьшим его push TMP ; и сохраним brcc Updating ;Если ещё не весь блок считали, то продолжаем pop TMP ; иначе подчищаем стек (команда push была в начале П/П) и уходим. ; Unmapping_EEPROM ;Отмена переназначения EEPROM в область ОЗУ (для запрета возможности использования команд ld/st) ; Wait_forNVM_BUSY ;Ожидаем окончания записи последнего байта ret ;------------------------------------------------------------------------------------------------- ;Макрос проверки занятости и ожидания окончания операций NVM контроллера ;используемые регистры: ; TMP ;Синтаксис: ; Wait_forNVM_BUSY .macro Wait_forNVM_BUSY call Verify_NVM_BUSY .endmacro Verify_NVM_BUSY: lds TMP,NVM_STATUS ;-- проверка на BUSY и FBUSY sbrc TMP,NVM_NVMBUSY_bp ;Если NVM контроллер не занят, то перескакиваем на проверку занятости при работе с флешем rjmp Verify_NVM_BUSY ; иначе ждём, пока NVM-контроллер освободится. sbrc TMP,NVM_FBUSY_bp ;Если NVM контроллер уже ничем не занят, то уходим, rjmp Verify_NVM_BUSY ; иначе ждём, пока NVM-контроллер освободится. ret ;---------------------------------------------------------------------------- ;Разблокировка (на 4 такта) конфигурационных регистров системы ;и запись в них байта данных ;Синтаксис: Write_Locked_Register_by_REG Register,REG ; Где Register,REG - регистр для записи, и регистр с даными для записи - соответственно ;Никакие регистры, кроме TMP, - не портятся ;05/VIII.14 .macro Write_Locked_Register_by_REG push @1 ldi TMP,CCP_IOREG_gc;Временно снимаем защиту с критически важных коннфигурационных out CPU_CCP,TMP ; регистров (защита через 4 такта автоматически восстановится). pop TMP ;Вспомним, данные, которые хотели записать. sts @0,TMP ;Пишем данные из REG в защищённый регистр .endmacro ;-------------------------------------------------------------------------------------------------
...делать нужно так, как нужно. А как ненужно - делать не нужно (С) Винни-Пух :)