02.03.2020, 19:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2004
Адрес: Нижний Новгород
Сообщений: 1,746
Сказал спасибо: 416
Сказали Спасибо 1,240 раз(а) в 551 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Программатор указывает что вы обращаетесь к памяти по адресу 8007, это за пределами для этого контроллера.
__________________
Решил посоветовать, да забыл что...
|
|
|
|
02.03.2020, 19:29
|
|
Прописка
Регистрация: 17.07.2006
Сообщений: 129
Сказал спасибо: 23
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Сообщение от RECTO
|
Судя по всему, адреса 8007h физически не существует: программатор пытается записать туда значение "2914", при проверке получает "63" (=3FFh).
Скорее всего, в проекте неправильно указан тип МК...
|
Не верно.
Тип указан правильно. Функция "CFG_WORD = Read_DIA(0x8007);" читает с данного адреса без проблем.
|
|
|
|
02.03.2020, 19:35
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,633
Сказал спасибо: 73
Сказали Спасибо 1,793 раз(а) в 647 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Ещё, наиболее вероятная причина - использование где-то в тексте программы hex-значений без указания их типа, из-за чего они воспринимаются компилятором как десятичные. И в результате идёт запись не тех значений и не в те адреса. Например, ваши адрес "8007" и значение "2914". Это - десятичные значения. Но, просто навеяло - очень похожий адрес 2007h - это как раз адрес для записи слова конфигурации в PIC16F628A. А значение 2914h - один из "ходовых" вариантов его конфигурации. Значение "63", возвращаемое программатору, говорит о том, что это как раз всё десятичные значения. Т.к. оно =3FF, т.е. значение "пустой" или несуществующей ячейки.
Последний раз редактировалось RECTO; 02.03.2020 в 19:44.
|
|
|
|
02.03.2020, 20:23
|
|
Прописка
Регистрация: 26.01.2007
Сообщений: 106
Сказал спасибо: 4
Сказали Спасибо 37 раз(а) в 25 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Я давно для 16f877A писал:
list p=16f877A
include‹p16F877A.inc›
__CONFIG 03F76H ;Бит защиты выкл,WDT вкл,ВЧ HS-генератор RB6,7-порты
-------------------------
Вы в какой среде писали?
-------------------------
MPLAB IDE v8.88 или наверно был помладше, типа v6
|
|
|
|
02.03.2020, 21:26
|
|
Прописка
Регистрация: 17.07.2006
Сообщений: 129
Сказал спасибо: 23
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Сообщение от RECTO
|
Ещё, наиболее вероятная причина - использование где-то в тексте программы hex-значений без указания их типа, из-за чего они воспринимаются компилятором как десятичные. И в результате идёт запись не тех значений и не в те адреса. Например, ваши адрес "8007" и значение "2914". Это - десятичные значения. Но, просто навеяло - очень похожий адрес 2007h - это как раз адрес для записи слова конфигурации в PIC16F628A. А значение 2914h - один из "ходовых" вариантов его конфигурации. Значение "63", возвращаемое программатору, говорит о том, что это как раз всё десятичные значения. Т.к. оно =3FF, т.е. значение "пустой" или несуществующей ячейки.
|
Спасибо за рациональные советы.
Проверил в режиме отладки.
Дело не в ошибочной адресации, потому что функция читает и адресное слово и слово данных правильно.
Кстати, запустить программу (и проверить в режиме отладки) возможно только в том случае, если программа была скомпиллирована с NVMCON1bits.WR = 0;
Если установить единицу (пытаться записать значение 2 байт (Дата), то программа не записывается на микроконтроллер.
Последний раз редактировалось stubiflex; 02.03.2020 в 21:35.
|
|
|
|
02.03.2020, 22:14
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,633
Сказал спасибо: 73
Сказали Спасибо 1,793 раз(а) в 647 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Сообщение от stubiflex
|
Дело не в ошибочной адресации, потому что функция читает и адресное слово и слово данных правильно.
|
Да при чём здесь функция, если программатор сообщает вам, на этапе заливки прошивки: "я не могу записать по адресу 0x1F47 значение 0xB62, т.к. получаю ответ 0x3F"!
Только сообщает он вам это в десятичной форме: 8007, 2914 и 63 соответственно.
А должно быть: 0x8007 0x2914.
Так понятнее?
Так что погодите с вашими функциями, сначала разберитесь, почему у вас слово конфигурации адресуется на физически не существующий адрес (0x1F47)...
|
|
|
|
02.03.2020, 22:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.10.2004
Адрес: Нижний Новгород
Сообщений: 1,746
Сказал спасибо: 416
Сказали Спасибо 1,240 раз(а) в 551 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Цитата:
|
CONFIG4
Name: CONFIG4
Address: 0x800A
Configuration Word 4
Memory Write Protection
|
Цитата:
|
Bit 9 – WRTC Configuration Register Write Protection bit (1)
Value Description
1 Configuration Registers NOT write-protected
0 Configuration Registers write-protected
|
По сбросу = 1
Начни с стирания контроллера
__________________
Решил посоветовать, да забыл что...
Последний раз редактировалось anatol378; 02.03.2020 в 22:29.
|
|
|
Сказали "Спасибо" anatol378
|
|
|
02.03.2020, 22:45
|
|
Прописка
Регистрация: 17.07.2006
Сообщений: 129
Сказал спасибо: 23
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Сообщение от RECTO
|
Да при чём здесь функция, если программатор сообщает вам, на этапе заливки прошивки: "я не могу записать по адресу 0x1F47 значение 0xB62, т.к. получаю ответ 0x3F"!
Только сообщает он вам это в десятичной форме: 8007, 2914 и 63 соответственно.
А должно быть: 0x8007 0x2914.
Так понятнее?
Так что погодите с вашими функциями, сначала разберитесь, почему у вас слово конфигурации адресуется на физически не существующий адрес (0x1F47)...
|
То, о чем Вы говорите -прошедший этап.
С тех пор выяснилось, (как писал выше) что программа пишется на микроконтроллер и запускается и в нормальном режиме и в режиме отладки. С одним условием: если NVMCON1bits.WR = 0; (Команда записи байтов)
Если установить NVMCON1bits.WR = 1 (пытаться записать NVMDATH и NVMDATL), то программа не записывается на микроконтроллер.
Коротко, если программа настроена так, что смог бы записать конфигурационные слова, то невозможно его записать на PIC.
|
|
|
|
02.03.2020, 23:31
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Кстати, сначала загружаются данные в "защелки" и только затем дергается рубильник(процедура анлока и установка бита WR) для их физической записи во флеш. Во время процедуры записи процессор останавливается.
Еще надо смотреть чтобы компилятор ничего не намудрил тут
NVMCON2 = 0x55;
NVMCON2 = 0xAA;
NVMCON1bits.WR = 1;
Оно может не развернутся в правильную последовательность:
movlw 0x55
movwf NVMCON2
movlw 0xAA
movwf NVMCON2
bsf NVMCON1,WR
Последний раз редактировалось realid; 02.03.2020 в 23:36.
|
|
|
|
03.03.2020, 02:33
|
|
Прописка
Регистрация: 17.07.2006
Сообщений: 129
Сказал спасибо: 23
Сказали Спасибо 4 раз(а) в 3 сообщении(ях)
|
Re: Запись конфигурационных слов в PIC16F18456
Сообщение от realid
|
Кстати, сначала загружаются данные в "защелки" и только затем дергается рубильник(процедура анлока и установка бита WR) для их физической записи во флеш. Во время процедуры записи процессор останавливается.
Еще надо смотреть чтобы компилятор ничего не намудрил тут
NVMCON2 = 0x55;
NVMCON2 = 0xAA;
NVMCON1bits.WR = 1;
Оно может не развернутся в правильную последовательность:
movlw 0x55
movwf NVMCON2
movlw 0xAA
movwf NVMCON2
bsf NVMCON1,WR
|
void Write_CFG(uint32_t Address, uint16_t Data)
{
uint8_t DataLB = 0x00;
uint8_t DataHB = 0x00;
DataLB = (0x00FF & Data);
DataHB = ((0xFF00 & Data) ›› ;
NVMADRL = (0x000000FF & Address);
NVMADRH = ((0x0000FF00 & Address ) ›› ;
uint8_t GIEBitValue = INTCONbits.GIE;
NOP();
NOP();
INTCONbits.GIE = 0; // Disable interrupts
NVMCON1bits.NVMREGS = 1; // Access Configuration Registers
NVMCON1bits.LWLO = 1; // The next WR command write data
NVMCON1bits.FREE = 0; // The next WR command writes without erasing
NVMCON1bits.WREN = 1; // Enable Write
NVMDATH = DataHB;
NVMDATL = DataLB;
NVMCON2 = 0x55; // NVM Unlock Sequence 1st step
NVMCON2 = 0xAA; // NVM Unlock Sequence 2nd step
NVMCON1bits.WR = 1; // 0 - for debug only. For normal use, set to 1!
while (NVMCON1bits.WR != 0)
{
}
NVMCON1bits.WREN = 0;
INTCONbits.GIE = GIEBitValue; // restore interrupt state
}
Посмотрю потом с куском кода на ассемблере, но уже стало видно в режиме отладки, что по ходу программы NVMCON2 не получает значения. В крайнем случае в окне дебагера не видно.
Как думаете, конфигурационные биты в NVMCON1 байте правильно выставлены?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:08.
|
|