1887ВЕ4У

Модераторы: ea, Alis, pip, gurzzza, sya, _sva_

leonid
Сообщения: 4
Зарегистрирован: 13 апр 2023, 13:43
Предприятие: Завод

Re: 1887ВЕ4У

Сообщение leonid »

Добрый день. Есть проблема с записью в EEPROM, следующий код заполняет eerpom следующим образом, 09 09 09 09 ... 09 все 32 адреса памяти.

Код: Выделить всё

#asm
EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEWE
rjmp EEPROM_write
; Set up address (r18:r17) in address register
ldi r18,0
ldi r17,0
ldi r16,9
out EEARH, r18
out EEARL, r17
; Write data (r16) to Data Register
out EEDR,r16
; Write logical one to EEMWE
sbi EECR,EEMWE
; Start eeprom write by setting EEWE
sbi EECR,EEWE
#endasm
while(1);
Есть вариации ошибки, например данные могу быть ошибочно записаны по адресу+1. Это, как правило, происходит в конце eeprom. Что я делаю не так?
leonid
Сообщения: 4
Зарегистрирован: 13 апр 2023, 13:43
Предприятие: Завод

Re: 1887ВЕ4У

Сообщение leonid »

Добрый день. Кажется, нашел:
1. Использовал cvavr, atmelStudio+avrispmk2, atmega8535. Где-то на форуме была эта связка. Код для записи и считывании, код вывода на индикатор не приведен

Код: Выделить всё

unsigned int minuteADREEP2 = 165;
eeprom_write_byte(minuteADREEP2, 55);
delay_us(10);  
    for(z=0;z<10;z++)
    {
        masDebug[z*2] = eeprom_read_byte(z+minuteADREEP2);// EEPROMReadChar(z);//записываем через адрес
        delay_us(10);
    }
Результат ошибки подтвердился считанным файлом.

Код: Выделить всё

:1000A000	37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 E0
:1000B000		37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 D0
Такое ощущение, что запись идет какими-то страницами.
2. Ошибка формируется сразу после записи кристалла, если после программирования записать файл *.eep с 0-ми, то далее проблем не будет. Вот пример:

Код: Выделить всё

 :1000A000 00 00 00 00 00 37 00 00 00 00 00 00 00 00 00 00 19 
Если я не ошибаюсь, то это можно избежать сбросом кристалла в промежутке "после программирования кристалла - до записи в eeprom".
Могут быть еще какие-то подобные проблемы при использовании cvavr, atmelStudio+avrispmk2, atmega8535?

3. Изначально хотел использовать все 1кбайт-е пространство EEPROM, для этого использовал метод из вашей документации, на asm и С:

Код: Выделить всё

//#asm
//EEPROM_write:
//    ; Wait for completion of previous write
//    sbic EECR, EEWE
//    rjmp EEPROM_write
//    ; Set up address (r18: r17) in address register
//    mov 
//    out EEARH, r18
//    out EEARL, r17
//    ; Write data (r16) to Data Register
//    out EEDR, r16
//    ; Write logical one to EEMWE
//    sbi EECR, EEMWE
//    ; Start eeprom write by setting EEWE
//    sbi EECR, EEWE
//    ret
//#endasm

        while(EECR & (1 << EEWE)); /* Wait for completion of previous write */
        EEAR = uiAddress;/* Set up Address and Data Registers */        
        EEDR = ucData;
        EECR |= (1 << EEMWE); /* Write logical one to EEMWE */
        EECR |= (1 << EEWE); /* Start eeprom write by setting EEWE */ 
А это библиотечная функция записи cvavr на asm.

Код: Выделить всё

__EEPROMWRB:
	SBIS EECR,EEWE
	RJMP __EEPROMWRB1
	WDR
	RJMP __EEPROMWRB
__EEPROMWRB1:
	IN   R25,SREG
	CLI
	OUT  EEARL,R26
	OUT  EEARH,R27
	SBI  EECR,EERE
	IN   R24,EEDR
	CP   R30,R24
	BREQ __EEPROMWRB0
	OUT  EEDR,R30
	SBI  EECR,EEMWE
	SBI  EECR,EEWE
__EEPROMWRB0:
	OUT  SREG,R25
	RET
Как видно в вашей документации отсутствует сохранение SREG, CLI и восстановление SREG. Отсюда вопрос, нужно ли делать CLI, например, появление нескольких NOP-ов в методе записи в EEPROM, приводит к отказу записи по соотв. адресу. Если все-таки CLI нужен, можете поделиться кодом метода записи/чтения на С.
Заранее благодарен.
nppsem
Сообщения: 74
Зарегистрирован: 26 апр 2010, 16:09

Re: 1887ВЕ4У

Сообщение nppsem »

Здравствуйте! НИИЭТ как-то неохотно отвечает на вопросы, а на некоторые совсем не отвечает. Из личного опыта, вдруг поможет:
1 На форуме есть такая информация (поищите и найдёте, тоже актуально и для ВЕ4): "
В режиме самопрограммирования памяти данных (EEPROM) в микросхеме 1887ВЕ7Т не выполняется обнуление буфера страницы при первой записи в память данных (EEPROM), что приводит к порче данных в пределах страницы, т.к. память данных имеет постраничную организацию (32 байта) с возможностью изменения как всей страницы, так и побайтно.
Пример: При изменении байта по адресу 0x008, возможно изменение других байтов данных в пределах страницы с адресом 0x000 – 0x01F. При изменении байта по адресу 0x02A, возможно изменение других байтов данных в пределах страницы с адресом 0x020 – 0x03F.
Данное поведение проявляется только при первой записи в память данных. Запись последующих байтов не приведет к порче данных EEPROM.
Для избежания искажения данных необходимо выполнить, так называемую “холостую запись”, т.е. перед первой записью информации в память данных необходимо один раз выполнить запись байта (неважно какими данными) в любую страницу (например, которую вы не используете, допустим, последнюю в массиве памяти данных с адресом 0xFE0 – 0xFFF). Таким образом, при записи байта данных по адресу в пределах данной страницы, порча данных произойдет только в области этой страницы. Последующие записи будут выполняться корректно в любую область памяти данных."
НИИЭТ писал, что в последних ревизиях этот баг устранён, но я не проверял.
2 В части образца реализации доступа в EEPROM можно посмотреть, как это сделано в WinAVR (т.е.ветке gcc). В АВР/eeprom.h есть ф-ция eeprom_write_block(), в свою очередь она вызывают "чипозависимую" __eewr_block_m8535. Её реализацию видно по asm-листингу.
leonid
Сообщения: 4
Зарегистрирован: 13 апр 2023, 13:43
Предприятие: Завод

Re: 1887ВЕ4У

Сообщение leonid »

1 На форуме есть такая информация (поищите и найдёте, тоже актуально и для ВЕ4): "
У меня проблема вроде как именно первая запись после прошивки кристалла, я уже сделал кучу сбросов питанием и последующие записи, полет нормальный. Хотя вроде программатор должен делать сброс контроллера сразу после прошивки, или лучше перебдеть и делать холостую запись?
leonid
Сообщения: 4
Зарегистрирован: 13 апр 2023, 13:43
Предприятие: Завод

Re: 1887ВЕ4У

Сообщение leonid »

Странно как-то, зачем он записывает всю страницу, если
с возможностью изменения как всей страницы, так и побайтно
. Не пишет ли он на самом деле всегда постранично. Если он пишет все постранично, разве это не приводит к уменьшению ресурса всей страницы, мне важен ресурс каждого байта отдельно и рассчитываю, что соседние байты "отдыхают".
nppsem
Сообщения: 74
Зарегистрирован: 26 апр 2010, 16:09

Re: 1887ВЕ4У

Сообщение nppsem »

Вот Вам ещё цитата с форума:
У меня при включении питания происходило искажение данных в EEPROM, при этом искажений данных в EEPROM при первой операции записи не было. Только при включении питания, это важно.
Я не мог от этого избавиться никак - ни программными средствами, ни аппаратными. Пока не прочитал ту страницу форума, где описано искажение EEPROM при самозаписи, то, что описано в первой цитате. (напомню, что у меня такого не было).
Я сделал вот что:
В самом начале программы перед всеми операциями чтения/записи EEPROM вставил операцию холостой записи байта на последнюю страницу EEPROM, как советовали цитате №1.
И вот после этого данные в EEPROM при включении питания искажаться перестали. Совсем. НО!
Я скачал состояние EEPROM в файл и увидел, что те адреса, где хранятся данные, действительно не искажаются, а вот последняя страница, куда записываются данные самой первой "холостой" операцией записи - искажена полностью.
Отсюда я бы сделал 2 вывода:
1. При включении питания искажается не EEPROM, а вот тот самый буфер страницы, который не обнуляется при самой первой записи в EEPROM.
2. При включении питания происходит не искажение данных в EEPROM, а самопроизвольная запись вот этого необнуленного буфера страницы.
Судя по форуму, инженерам НИИЭТ проблемы с EEPROM при включении контроллера известны давно.
Есть ли какие-нибудь аппаратные или программные способы избежать искажений EEPROM при включении МК?
По своему опыту - в серийном изделии в EEPROM при регулировке программаторм записывается 3 байта "адрес прибора" (на этом этапе также пишется flash и fuse). В процессе ПСИ эта информация перезаписывается уже самим прибором (исп-ся ф-ции WinAVR eeprom_write_byte() для записи и eeprom_read_block() для контрольного чтения ). Порчи информации в EEPROM на этапе регулировка-ПСИ не наблюдалось (выборка более 4К приборов).
Yevy
Сообщения: 4
Зарегистрирован: 09 июл 2023, 14:52
Предприятие: ЦНИИ СМ

1887ВЕ4У последовательное программирование (SPI)

Сообщение Yevy »

Здравствуйте!

Хочу перейти с Atmega8535 на 1887ВЕ4У.
Годится ли проект для Atmega8535, сделанный в CodeVision АВР для прошивки (HEX-файлы)?
Я использую последовательный программатор USBASP и прошивщик AVRDUDE - программирую по SPI-интерфейсу.
В описании МК 1887ВЕ4У эта возможность предусмотрена, но не будет ли проблем с прошивкой?
Какая-нибудь несовместимость по адресам?
Yevy
Сообщения: 4
Зарегистрирован: 09 июл 2023, 14:52
Предприятие: ЦНИИ СМ

USB-программатор КФДЛ.301411.247

Сообщение Yevy »

Где найти инфу про программатор?
USB-программатор КФДЛ.301411.247

На сайте ничего не нашел. Это вообще что, ISP-программатор? Какой разъем? Программа-прошивщик к нему есть?
avp
Сообщения: 34
Зарегистрирован: 22 сен 2017, 12:40
Предприятие: АО НИИЭТ

Re: USB-программатор КФДЛ.301411.247

Сообщение avp »

Yevy писал(а): 09 июл 2023, 16:06 Где найти инфу про программатор?
USB-программатор КФДЛ.301411.247

На сайте ничего не нашел. Это вообще что, ISP-программатор? Какой разъем? Программа-прошивщик к нему есть?
Здравствуйте! Это ISP-программатор.
Вложения
Программатор МК8.zip
(22.54 МБ) 74 скачивания
Alex1603
Сообщения: 1
Зарегистрирован: 11 июл 2023, 21:40
Предприятие: OTPDI

Re: 1887ВЕ4У

Сообщение Alex1603 »

Добрый день!
Кто-то может поделиться УГО в altium 1887ВЕ4У?
Ответить

Вернуться в «Микроконтроллеры RISC»