Свежие обсуждения
Микроконтроллеры

PIC16F877

1 4

При работе отказывается записывать данные в EEPROM память. Ну просто не сохраняет и все. Подпрограмма записи взята с сайта производителя и из справочника ( автор Предко).
Какие могут быть советы ?

 

А какой программатор (В смысле железо)?

Проверить уровни и сигналы на ногах контроллера при цикле записи в EEPROM на соответствие даташиту.

 

Программатор самодельный. Его аналог я видел под названием ProPic2. Программная оболочка ICProg. Работаю с ним второй год. Но вопрос в том, что немогу записать данные в EEPROM ни при программировании ни программно. Возможно в этом контроллере надо что-то устанавливать или наоборот выключать в слове конфигурации или ещё где. Программа довольно простая. Запрещены все прерывания. А может наоборот надо разрешить? Возможно и программиста надо заменить!!!

 

Вот из доки на контроллер, может поможет. Текст не копируется, поэтому прилагаю картинку.

26512.rar

 

VitVas, хотелось бы посмотреть исходник. Если пришлете (picmaniac[@]rambler.ru), попробую помочь. Хотя, если и программатором не пишется... Сколько экземпляров PIC проверяли? В память программ записывается нормально? Я записывал данные в EEPROM PIC16F628 программатором JDM - проблем не возникало.
Работа с EEPROM хорошо описана в datasheet (стр.43-48)
http://www.microchip.ru/files/d-sheets-rus/pic16f87x.pdf

 

Спасибо. Я как раз этой документацией и пользуюсь. Все-таки может быть напряжение? У меня 4,87 вместо 5. Сегодня привезу другой блок питания и поэкспериментирую. Но неужели эта небольшая разница сыграет? Если так, то я перейду на Atmel или ещё на что-нибудь менее критичное.

 

Ещё раз внимательно прочитал: «EEPROM память данных доступна для записи/чтения в нормальном режиме работы микроконтроллера во всем диапазоне рабочего напряжения питания (Vdd). Там ещё об инициализации и диагностическом режиме. Но тогда, как я понимаю, микроконтроллер вообще не подавал бы признаков жизни, А ведь вся остальная программа работает. И ещё один момент не совсем понятен. В 877-м 4 банка памяти. Специальные регистры раскиданы по разным банкам. Чтобы записать или считать данные или адрес, нам надо переключиться в другой банк. Я понял, что аккумулятор (W) читается во всех банках, независимо от того в каком из них были записаны в него данные. А как себя ведут регистры для временного хранения. Вот конкретный пример, после которого у меня возник этот вопрос:

movf ADRESH,W ;берём значение t(град)
movwf NumH ;записываем в рег
bsf STATUS,RP0 ;вкл банк 1
movf ADRESL,W ;берём значение t
movwf NumL ;записываем в рег
bcf STATUS,RP0 ;вкл банк 0
movwf NumL ;записываем в рег
call SetupDelay ;пауза >= 10uS.
bcf ADCON0,1 ;сбрасывается флаг
bsf ADCON0,2 ;старт нового измерения(GO/-DONE)
loop
btfss ADCON0,2 ;закончилоcь измерение?
return ;да
goto loop ;нет – ждем

значение в регистре NumL я смог прочесть только когда после переключения в банк 0 ещё раз повторил команду movwf.
Так может и с записью в EEPROM нечто подобное?

 

VitVas
Странно, что программатор не записывает EEPROM. Очень странно.
Регистр W (аккумулятор) доступен из любого банка, это верно.
Держите перед глазами карту памяти (см. datasheet, рис.2.3 на стр.16)
Также посмотрите п.2.5, рис.2.6 (стр.31)
В случае прямой адресации (без использования регистра FSR), 7 младших бит адреса регистра в памяти данных берутся из кода операции (OPCODE). Т.е. 7-ю битами мы можем адресовать до 128 регистров в каждом банке. Банк выбирается битами RP0, RP1 в регистре STATUS.
Получается, что для контроллера в коде операции неразличимы регистры, к примеру, ADRESH (1Eh) и ADRESL (9Eh). Если забыть о переключении банков ОЗУ, то старший бит будет проигнорирован, и команды
movf ADRESH,W
movf ADRESL,W
контроллер поймет одинаково, как
movf 1Eh, W

Регистры для временного хранения ведут себя аналогично. В какой банк их поместите - там с ними и работайте. Пример

TEMP00 EQU 030h ; Регистр пользователя в банке 0
TEMP01 EQU 0B0h ; Регистр пользователя в банке 1

Если регистр NumL расположен в банке 0, то команды

bsf STATUS,RP0 ;вкл банк 1
movf ADRESL,W ;берём значение t
movwf NumL ;записываем в рег

реально перепишут байт из ADRESL через W не в NumL, а в другой регистр, с адресом на 080h больше, и находящийся на карте памяти "напротив" NumL "правее".

По обрывкам кода разбираться нелегко, неужели исходник засекречен? Пришлите мне, или присоедините сюда заархивированный - будет намного легче понять, в чем закавыка.

Жаль, что ASD сюда не заходит - он бы получше растолковал...

 

Вот пример - это я учился работать с АЦП PIC16F876. Может быть пригодится.
Только обращений к EEPROM там нет.

26682.zip

 

У автора Предко - описан егойный программатор и программное обеспечение к нему (у него на сайте). Не подскажете - они работают? А то собираюсь паять (уже комплектующие купил).