16+
Среда
21 февраля
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры AVR

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
Adept  (06.08.2014 00:39 - 06.08.2014 01:08) , в ответ на Есть ли там грабли? автор: 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
;-------------------------------------------------------------------------------------------------
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7526 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVIII