Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перевод программы AVR на PIC.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
TAPAKAN
Приветствую!
В своей программе для PIC хочу использовать кусок кода, написанный для ATmega162.
На AVR код такой:
Код
volatile char BufSms[BPRSMS];//буфер приема анализа содержимого
.........

SIGNAL(USART1_RXC_vect ) //принят байт по USART1
{
    FlagIn=1;
    uin1=UDR1;
    indpr++;
    if (indpr>=BPRSMS) indpr=0;//ограничение
    BufSms[indpr]=uin1;
    //проверка принятого символа на сообщение устанавливает биты в SUsart1
    for(i=0; i<8; i++)
    {
        if(PP[i][s[i]]==uin1)
        {
            s[i]++;
            if(PP[i][s[i]]==0)
            {
                SUsart1 |= maska[i];
                s[i]=0;
            }
        }
        else s[i]=0;
    }
    
}

После переноса в среду для PIC, мой компилятор MicroC ругается на определение:
Код
volatile char BufSms[BPRSMS];//буфер приема анализа содержимого

А именно подчеркивает BPRSMS.
Ошибка такая: Undeclared identifier 'BPRSMS' in expression.
Правильность кода для AVR проверить не могу, нет компилятора.
Но зашитый в МК код работает.
Моего опыта программирования не хватает, на то. что бы понять в чем причина.
kovigor
Цитата(TAPAKAN @ Aug 20 2014, 09:33) *
Приветствую!
В своей программе для PIC хочу использовать кусок кода, написанный для ATmega162.
На AVR код такой:
Код
volatile char BufSms[BPRSMS];//буфер приема анализа содержимого


BPRSMS - это константа, и она должна быть где-то определена. Чему она равна ? Если не знаете, то подставьте вместо нее какое-то разумное и обоснованное значение, например, 128 ...
TAPAKAN
kovigor
Константа оказалась определена в файле с #define.
Которого у меня не было под рукой
kovigor
Цитата(TAPAKAN @ Aug 20 2014, 13:46) *
Константа оказалась определена в файле с #define.

И чему она равна ?
TAPAKAN
Цитата(kovigor @ Aug 20 2014, 15:00) *
И чему она равна ?

256
kovigor
Цитата(TAPAKAN @ Aug 20 2014, 14:06) *
256

Если в PIC'е хватит ОЗУ, то все должно получиться ...
TAPAKAN
Подскажите, пожалуйста еще.
Есть такие объявления:
Код
volatile const unsigned char *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8};

volatile const unsigned char Mes1[]={'U','N','D','E','R','-','V','O','L','T','A','G','E',0};
volatile const unsigned char Mes2[]={'+','C','M','T','I',':',0};
volatile const unsigned char Mes3[]={'+','C','L','I','P',':',0};
volatile const unsigned char Mes4[]={'C','a','l','l',' ','R','e','a','d','y',0};
volatile const unsigned char Mes5[]={'O','K',0xD,0};
volatile const unsigned char Mes6[]={0x30,0x0d,0};
volatile const unsigned char Mes7[]={0x34,0x0d,0};
volatile unsigned char Mes8[]={0x3e,0x20,0,0,0,0,0,0,0,0,0};

Компилятор Microc ругается на volatile const unsigned char *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8}
И даже подсвечивает не так как массив. Пишет Cannot cast '' to ''
Может в разных компиляторах синтаксис объявления указателя отличается?
ataradov
Конструкции
CODE
SIGNAL(USART1_RXC_vect )
и
CODE
uin1=UDR1;
в пике абсолютно бессмысленны.

MesX объявлены после PP? А где это вообще тогда работает?
TAPAKAN
Taradov Alexander
Это я скопировал с листинга для AVR.
Для пика исправил на
Код
void interrupt()
if(RCIF_bit == 1) и т.д....

и
Код
uin1=UART1_Read();

это функция чтения в mikroC, хотя можно заменить на регистр UART.

PP объявлены после MesX. Это я вставляя сюда, почему-то поменял последовательность.
dxp
QUOTE (TAPAKAN @ Aug 20 2014, 19:16) *
Компилятор Microc ругается на volatile const unsigned char *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8}
И даже подсвечивает не так как массив. Пишет Cannot cast '' to ''
Может в разных компиляторах синтаксис объявления указателя отличается?

Попробуйте:

CODE
volatile const unsigned char Mes1[]={'U','N','D','E','R','-','V','O','L','T','A','G','E',0};
volatile const unsigned char Mes2[]={'+','C','M','T','I',':',0};
volatile const unsigned char Mes3[]={'+','C','L','I','P',':',0};
volatile const unsigned char Mes4[]={'C','a','l','l',' ','R','e','a','d','y',0};
volatile const unsigned char Mes5[]={'O','K',0xD,0};
volatile const unsigned char Mes6[]={0x30,0x0d,0};
volatile const unsigned char Mes7[]={0x34,0x0d,0};
volatile unsigned char Mes8[]={0x3e,0x20,0,0,0,0,0,0,0,0,0};


volatile const unsigned char *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8};
TAPAKAN
dxp
у меня так и написано...
dxp
QUOTE (TAPAKAN @ Aug 21 2014, 13:39) *
dxp
у меня так и написано...

В посте №7 написано не так (смотрите внимательнее), там объявление массива указателей сделано раньше объявления объектов, чьи адреса используются при инициализации этого массива. Я вам привёл ваш код, где массив указателей объявлен после. Этот код успешно компилируется GCC и IAR.
TAPAKAN
Цитата(dxp @ Aug 21 2014, 12:03) *
В посте №7 написано не так (смотрите внимательнее)

Я в 9 сообщении написал: PP объявлены после MesX. Это я вставляя сюда, почему-то поменял последовательность.
Компилятор не подсвечивает синтаксис строки *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8};
Как будто ему непонятна такая запись...
dxp
QUOTE (TAPAKAN @ Aug 21 2014, 15:07) *
Я в 9 сообщении написал: PP объявлены после MesX. Это я вставляя сюда, почему-то поменял последовательность.
Компилятор не подсвечивает синтаксис строки *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8};
Как будто ему непонятна такая запись...

Покажите полный текст сообщения об ошибке? Я попробовал собрать двумя компиляторами, собралось без вопросов. Какому компилятору вы это пытаетесь скормить?
TAPAKAN
Компилятор mikroC for PIC mikroElektronika лицензия.
Нажмите для просмотра прикрепленного файла
dxp
QUOTE (TAPAKAN @ Aug 21 2014, 15:28) *
Компилятор mikroC for PIC mikroElektronika лицензия.
Нажмите для просмотра прикрепленного файла

Похоже, что что-то с компилятором не так. Проверил ещё раз на древнем IAR v1.40E от 1998 года, проглотил без единого вопроса. Попробуйте убрать квалификаторы volatile const (для начала оба, если заработает, то потом по отдельности). Есть подозрение, что именно с ними у компилятора нелады (судя по 'cast' в сообщении).
TAPAKAN
Цитата(dxp @ Aug 21 2014, 13:53) *
Попробуйте убрать квалификаторы volatile const (для начала оба, если заработает, то потом по отдельности)

Заработало! Только если везде удалить.
Как минимум ошибки не выдает.
Можно опять писать.
Что получится дальше, еще не знаю.
Спасибо!


Все оказалось еще проще.
В строке
Код
volatile unsigned char Mes8[]={0x3e,0x20,0,0,0,0,0,0,0,0,0};

пропущена const
после добавления все работает.
dxp
QUOTE (TAPAKAN @ Aug 21 2014, 17:48) *
Все оказалось еще проще.
В строке
CODE
volatile unsigned char Mes8[]={0x3e,0x20,0,0,0,0,0,0,0,0,0};

пропущена const
после добавления все работает.

Ну, тут компилятор, по ходу, не прав: указатель на константный объект разрешено (и это вполне безопасно) инициализировать адресом неконстантного объекта (что и демонстрируют упомянутые компиляторы). Вот наоборот нельзя и это понятно - чтобы исключить изменение константного объекта через указатель. Ваш компилер зачем-то требует полного соответствия. Хорошо, что в данном случае вас это устраивает.
hd44780
Цитата(dxp @ Aug 21 2014, 18:04) *
Ну, тут компилятор, по ходу, не прав: указатель на константный объект разрешено (и это вполне безопасно) инициализировать адресом неконстантного объекта (что и демонстрируют упомянутые компиляторы). Вот наоборот нельзя и это понятно - чтобы исключить изменение константного объекта через указатель. Ваш компилер зачем-то требует полного соответствия. Хорошо, что в данном случае вас это устраивает.


Он прав. Если у пика гарвардская архитектура, как у авра, то const объекты всегда помещаются во flash, а не const - в RAM.
А это - совершенно разные адресные пространства.
Поэтому компилятор и выдаёт как минимум предупреждения. Даже на архитектурах с единым адресным пространством - фон-Неймана (например, обычные компы), модифицированного Гарварда (например, STM32) или ещё какие-то.
Если Вы хотите подавить эти ошибки/предупреждения, то используйте явное приведение типа. Но при этом имейте в виду все нюансы типа разных адресных пространств. Иначе полезут ошибки времени исполнения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.