Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

Вопросы начинающих Прежде чем задать вопрос, стоит воспользоваться поиском

Ответ
 
Опции темы Опции просмотра
Старый 03.11.2017, 12:07   #1
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Не инициализируется массив

Не инициализируется массив.

Контроллер: PIC18F65K40.
MPLABX: v4.00.
Compiler: xc8 1.42

Пр.: unsigned char Crc8Table[] = { 0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97 };

Простейшее действие, проблема не ясна. В flash эти константы прошиваются при программировании. При старте программы они должны сами копироваться в RAM. По asm коду видно, что код для этого генерируется и исполняется. Но результатом считывания является "0".

Поэтому претензий к компилятору нет. Возможно, есть какая-нибудь защита. Конфиг регистры настроил, как смог. Все биты защиты в конфигурационных регистрах не установлены.

CONFIG4L
CONFIG4H
CONFIG5L
CONFIG6L
CONFIG6H

Ранее писал под pic18F45K22 и др. без проблем.
LexxExe вне форума   Ответить с цитированием
Старый 03.11.2017, 12:39   #2
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,501
Вес репутации: 3061/65
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Не инициализируется массив

LexxExe
ясное дело все это крайне странно.пример кода приведите.
попробуйте простейшую проверку и посмотрите в дебаггере.
вдруг там где-то убежавший указатель обнуляет или вроде того.
Код:
...
u8 test_array[6] = {1,2,3,4,5,6};
...
BUG_ON(test_array[0] != 1);
и на всякий случай попробуйте v1.44.
besogon вне форума   Ответить с цитированием
Старый 03.11.2017, 12:46   #3
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Не инициализируется массив

Тот пример, что Вы привели вполне подходит. Читаются нули.
В дебаггере тоже все хорошо, все указатели и команды. Но при инициализации массива в Си, только нули, хотя компилятор сгенерировал код перезаписи из flash в массив в RAM.
Возможно, есть какие-то блокировки в данном камне. С ним я ранее не работал.
LexxExe вне форума   Ответить с цитированием
Старый 03.11.2017, 12:48   #4
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Не инициализируется массив

В процессе работы в main() и др. я могу и использовать массив для записи и чтения. А именно инициализация не получается.
LexxExe вне форума   Ответить с цитированием
Старый 03.11.2017, 12:48   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,501
Вес репутации: 3061/65
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Не инициализируется массив

LexxExe
попробуйте более новый компилятор. я тоже не работал с поздними pic18.
besogon вне форума   Ответить с цитированием
Старый 03.11.2017, 14:48   #6
yeskela
Senior Member
 
Аватар для yeskela
 
Регистрация: 28.01.2010
Адрес: Новочеркасск
Возраст: 35
Сообщений: 1,112
Вес репутации: 3551/75
yeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond reputeyeskela has a reputation beyond repute
По умолчанию Re: Не инициализируется массив

Цитата:
Сообщение от LexxExe Посмотреть сообщение
Тот пример, что Вы привели вполне подходит. Читаются нули.
Как проверяете, Оптимизатор не заоптимизаровал?
__________________
Отсутствие доступа в интернет с рабочего места очень замедляет работу. Наличие - полностью парализует её.
yeskela вне форума   Ответить с цитированием
Старый 03.11.2017, 15:03   #7
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Не инициализируется массив

Проверяю по шагам в отладчике. Результаты в watch окне. Код программ в памяти. Компилятор все по командам делает верно и константы адресов в порядке.

Оптимизацию полностью отключал. Компилятор FREE.

Похоже не судьба. Но дело не с самом камне. Не знаю что делать. Видимо буду MPLABX 4.05 ставить и последний версии компилятор.
LexxExe вне форума   Ответить с цитированием
Старый 03.11.2017, 15:11   #8
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,501
Вес репутации: 3061/65
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Не инициализируется массив

LexxExe
Результаты в watch окне - проверьте кодом. может watch сломан.
и да, конечно, ставьте последнюю среду и компилятор.
besogon вне форума   Ответить с цитированием
Старый 03.11.2017, 15:42   #9
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 53
Сообщений: 960
Вес репутации: 2006/62
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: Не инициализируется массив

Цитата:
Сообщение от LexxExe Посмотреть сообщение
Не инициализируется массив.

Пр.: unsigned char Crc8Table[] = { 0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97 };
А если так:
const unsigned char Crc8Table[] = { 0x00, 0x31, 0x62, 0x53, 0xC4, 0xF5, 0xA6, 0x97 };

CONST данные в ROM размещаются с этим квалификатором.
Не все компиляторы инициируют массивы в регистровой памяти.
Для инициирования массива в RAM памяти нужно использовать
memcpy((void*)&TempBufer[0], (const unsigned char *)"PRIMER",6);
или через заранее созданный массив
memcpy((void*)&TempBufer[0], (void*)Crc8Table,8);
Это пример для компилятора МСС18
smart_pic вне форума   Ответить с цитированием
Старый 03.11.2017, 15:45   #10
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,501
Вес репутации: 3061/65
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Не инициализируется массив

smart_pic
в xc8 раньше работало.
besogon вне форума   Ответить с цитированием
Старый 03.11.2017, 16:10   #11
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Не инициализируется массив

В xc8 раньше работало на других камнях PIC18 и сейчас работает.

На этом камне впервые.
Коды портировал с другого камня PIC18. Файлы h и c целиком. Config word написал сам с нуля с учетом datasheet. В кодах правил только переферию, которая несколько поменялась. Запустил adc, таймеры, uart. Все настроил. Все работает.

crc при обмене данными я вычисляю табличным способом. Стал налаживать связь по uart. У меня свой протокол более высокого уровня. Стал проверять crc. Не сходится. Стал разбираться. Массив с таблицей для вычисления crc содержит нули, вместо необходимых констант. Вот и все.

Сейчас убрал из проекта все, кроме main, while и считывания в переменную из этого массива. Не работает. В массив через watch можно свободно записать значение. При копировании из нулевой ячейки в переменную, нулевая ячейка и переменная обнуляется. При копировании из первой ячейки в переменную - значение нормально копируется в ячейку.

Я уже ничего не понимаю и не в чем не уверен).
Весь код программы ниже.

#include "..\Include\Fuses.h"

unsigned char table_1[] = {1,2,3,4,5};
unsigned char tmp = 0, crc = 0;

void main(void)
{
crc=table_1[0];
crc=table_1[1];

while (1)
{
crc=table_1[0];
crc=table_1[1];
}
}


Ниже Config words:

/*
************************************************** *********
Config words
************************************************** *********
*/

#define DEBUG_ON 1
#define SECURE_FUSES 0

// CONFIG1L
#pragma config FEXTOSC = HS // External Oscillator mode Selection bits (HS (crystal oscillator) above 8 MHz; PFM set to high power)
#pragma config RSTOSC = EXTOSC_4PLL // Power-up default value for COSC bits (EXTOSC with 4x PLL, with EXTOSC operating per FEXTOSC bits)

// CONFIG1H
#pragma config CLKOUTEN = OFF // Clock Out Enable bit (CLKOUT function is disabled)
#pragma config CSWEN = ON // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)

// CONFIG2L
#pragma config MCLRE = EXTMCLR // Master Clear Enable bit (If LVP = 0, MCLR pin is MCLR; If LVP = 1, RG5 pin function is MCLR )

#if DEBUG_ON
#pragma config PWRTE = OFF // Power-up Timer Enable bit (Power up timer disable)
#else
#pragma config PWRTE = ON // Power-up Timer Enable bit (Power up timer enabled)
#endif

#pragma config LPBOREN = ON // Low-power BOR enable bit (ULPBOR enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled according to SBOREN)

// CONFIG2H
#pragma config BORV = VBOR_285 // Brown Out Reset Voltage selection bits (Brown-out Reset Voltage (VBOR) set to 2.85V)
#pragma config ZCD = OFF // ZCD Disable bit (ZCD disabled. ZCD can be enabled by setting the ZCDSEN bit of ZCDCON)
#pragma config PPS1WAY = ON // PPSLOCK bit One-Way Set Enable bit (PPSLOCK bit can be cleared and set only once; PPS registers remain locked after one clear/set cycle)
#pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config DEBUG = OFF // Debugger Enable bit (Background debugger disabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Extended Instruction Set and Indexed Addressing Mode disabled)

// CONFIG3L
#pragma config WDTCPS = WDTCPS_31 // WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF // WDT operating mode (WDT Disabled)

// CONFIG3H
#pragma config WDTCWS = WDTCWS_7 // WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC // WDT input clock selector (Software Control)

// прошивка ЗАЩИЩЕНА
//#if SECURE_FUSES



// прошивка НЕ защищена
//#else

// CONFIG4L
#pragma config WRT0 = OFF // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected)

// CONFIG4H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-30000Bh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
#pragma config SCANE = ON // Scanner Enable bit (Scanner module is available for use, SCANMD bit can control the module)
#pragma config LVP = ON // Low Voltage Programming Enable bit (Low voltage programming enabled. MCLR/VPP pin function is MCLR. MCLRE configuration bit is ignored)

// CONFIG5L
#pragma config CP = OFF // UserNVM Program Memory Code Protection bit (UserNVM code protection disabled)
#pragma config CPD = OFF // DataNVM Memory Code Protection bit (DataNVM code protection disabled)

// CONFIG6L
#pragma config EBTR0 = OFF // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)

// CONFIG6H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks)

//#endif
LexxExe вне форума   Ответить с цитированием
Старый 03.11.2017, 16:27   #12
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 30
Сообщений: 1,501
Вес репутации: 3061/65
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Не инициализируется массив

LexxExe
пробовали так
Код:
unsigned char table_1[5] = {1,2,3,4,5};
?
besogon вне форума   Ответить с цитированием
Старый 03.11.2017, 16:28   #13
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Не инициализируется массив

Пробовал) Результат тот же.
LexxExe вне форума   Ответить с цитированием
Старый 03.11.2017, 16:29   #14
igor_tgru
Senior Member
 
Аватар для igor_tgru
 
Регистрация: 25.02.2007
Возраст: 44
Сообщений: 664
Вес репутации: 1357/59
igor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud ofigor_tgru has much to be proud of
По умолчанию Re: Не инициализируется массив

похоже на проблему в стартап коде для этого контроллера
igor_tgru вне форума   Ответить с цитированием
Старый 03.11.2017, 16:30   #15
smart_pic
Senior Member
 
Регистрация: 08.12.2008
Адрес: Ставрополь
Возраст: 53
Сообщений: 960
Вес репутации: 2006/62
smart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond reputesmart_pic has a reputation beyond repute
Отправить сообщение для smart_pic с помощью Skype™
По умолчанию Re: Не инициализируется массив

Повторю еще раз:
Переменные массивов в ОЗУ не инициируются. Компилятор не создает код для инициализации массивов в ОЗУ.
Для отдельных переменных создается код инициализации.
Инициализацию массива в ОЗУ нужно делать принудительно своим кодом.
На этапе компиляции инициализацию массивов можно сделать в программной памяти.

У вас
unsigned char table_1[] = {1,2,3,4,5};
массив размещается в ОЗУ.
поэтому и нет инициализации
smart_pic вне форума   Ответить с цитированием
Старый 03.11.2017, 17:31   #16
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 19
Вес репутации: 239/29
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Не инициализируется массив

Случай описан в Errata.
Ткнули носом на microchip.com форуме.

Описание примерно следующее: для инициализации констант и переменных так и должно быть ибо ошибка данной ревизии камня.

TBLRD requires NVMREG value to point to
appropriate memory
The affected silicon revisions of the PIC18FXXK40
devices improperly require the NVMREG<1:0>
bits in the NVMCON register to be set for TBLRD
access of the various memory regions. The issue
is most apparent in compiled C programs when the
user defines a const type and the compiler uses
TBLRD instructions to retrieve the data from program Flash memory (PFM). The issue is also
apparent when the user defines an array in RAM
for which the complier creates start-up code, executed before main(), that uses TBLRD instructions
to initialize RAM from PFM

Решение (обходной путь) предложен в Errata.

Всем спасибо за помощь.
LexxExe вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Промышленный контроллер на PIC in37usd Продукция MICROCHIP 52 21.06.2015 13:56
наше образование, или будущие ембеддеры - кто они... Vlad&mir Общетехнические вопросы 357 13.01.2015 11:34
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
WH-1602D, не инициализируется... kaspiysk Вопросы начинающих 23 13.06.2010 13:48
Графические среды Vidoc Общетехнические вопросы 47 10.02.2010 06:18


Часовой пояс GMT +3, время: 04:13.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot