реклама на сайте
подробности

 
 
> Перевод программы AVR на PIC.
TAPAKAN
сообщение Aug 20 2014, 06:33
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



Приветствую!
В своей программе для 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 проверить не могу, нет компилятора.
Но зашитый в МК код работает.
Моего опыта программирования не хватает, на то. что бы понять в чем причина.
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 18)
kovigor
сообщение Aug 20 2014, 10:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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


BPRSMS - это константа, и она должна быть где-то определена. Чему она равна ? Если не знаете, то подставьте вместо нее какое-то разумное и обоснованное значение, например, 128 ...
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 20 2014, 10:46
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



kovigor
Константа оказалась определена в файле с #define.
Которого у меня не было под рукой
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 20 2014, 11:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(TAPAKAN @ Aug 20 2014, 13:46) *
Константа оказалась определена в файле с #define.

И чему она равна ?
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 20 2014, 11:06
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



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

256
Go to the top of the page
 
+Quote Post
kovigor
сообщение Aug 20 2014, 11:11
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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

Если в PIC'е хватит ОЗУ, то все должно получиться ...
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 20 2014, 12:16
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



Подскажите, пожалуйста еще.
Есть такие объявления:
Код
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 ''
Может в разных компиляторах синтаксис объявления указателя отличается?
Go to the top of the page
 
+Quote Post
ataradov
сообщение Aug 20 2014, 17:37
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 014
Регистрация: 8-01-07
Из: San Jose, CA
Пользователь №: 24 202



Конструкции
CODE
SIGNAL(USART1_RXC_vect )
и
CODE
uin1=UDR1;
в пике абсолютно бессмысленны.

MesX объявлены после PP? А где это вообще тогда работает?
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 20 2014, 18:28
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



Taradov Alexander
Это я скопировал с листинга для AVR.
Для пика исправил на
Код
void interrupt()
if(RCIF_bit == 1) и т.д....

и
Код
uin1=UART1_Read();

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

PP объявлены после MesX. Это я вставляя сюда, почему-то поменял последовательность.

Сообщение отредактировал TAPAKAN - Aug 20 2014, 18:29
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 21 2014, 04:45
Сообщение #10


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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};


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 21 2014, 06:39
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



dxp
у меня так и написано...
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 21 2014, 08:03
Сообщение #12


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (TAPAKAN @ Aug 21 2014, 13:39) *
dxp
у меня так и написано...

В посте №7 написано не так (смотрите внимательнее), там объявление массива указателей сделано раньше объявления объектов, чьи адреса используются при инициализации этого массива. Я вам привёл ваш код, где массив указателей объявлен после. Этот код успешно компилируется GCC и IAR.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 21 2014, 08:07
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



Цитата(dxp @ Aug 21 2014, 12:03) *
В посте №7 написано не так (смотрите внимательнее)

Я в 9 сообщении написал: PP объявлены после MesX. Это я вставляя сюда, почему-то поменял последовательность.
Компилятор не подсвечивает синтаксис строки *PP[]={Mes1,Mes2,Mes3,Mes4,Mes5,Mes6,Mes7,Mes8};
Как будто ему непонятна такая запись...
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 21 2014, 08:17
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

Покажите полный текст сообщения об ошибке? Я попробовал собрать двумя компиляторами, собралось без вопросов. Какому компилятору вы это пытаетесь скормить?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 21 2014, 08:28
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



Компилятор mikroC for PIC mikroElektronika лицензия.

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 21 2014, 09:53
Сообщение #16


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (TAPAKAN @ Aug 21 2014, 15:28) *
Компилятор mikroC for PIC mikroElektronika лицензия.

Прикрепленное изображение

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
TAPAKAN
сообщение Aug 21 2014, 10:48
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150



Цитата(dxp @ Aug 21 2014, 13:53) *
Попробуйте убрать квалификаторы volatile const (для начала оба, если заработает, то потом по отдельности)

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


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

пропущена const
после добавления все работает.
Go to the top of the page
 
+Quote Post
dxp
сообщение Aug 21 2014, 12:04
Сообщение #18


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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

Ну, тут компилятор, по ходу, не прав: указатель на константный объект разрешено (и это вполне безопасно) инициализировать адресом неконстантного объекта (что и демонстрируют упомянутые компиляторы). Вот наоборот нельзя и это понятно - чтобы исключить изменение константного объекта через указатель. Ваш компилер зачем-то требует полного соответствия. Хорошо, что в данном случае вас это устраивает.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
hd44780
сообщение Aug 22 2014, 07:46
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



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


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


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 09:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01536 секунд с 7
ELECTRONIX ©2004-2016