|
Перевод программы AVR на PIC. |
|
|
|
Aug 20 2014, 06:33
|
Частый гость
 
Группа: Участник
Сообщений: 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 проверить не могу, нет компилятора. Но зашитый в МК код работает. Моего опыта программирования не хватает, на то. что бы понять в чем причина.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 18)
|
Aug 20 2014, 10:03
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(TAPAKAN @ Aug 20 2014, 09:33)  Приветствую! В своей программе для PIC хочу использовать кусок кода, написанный для ATmega162. На AVR код такой: Код volatile char BufSms[BPRSMS];//буфер приема анализа содержимого BPRSMS - это константа, и она должна быть где-то определена. Чему она равна ? Если не знаете, то подставьте вместо нее какое-то разумное и обоснованное значение, например, 128 ...
|
|
|
|
|
Aug 20 2014, 11:06
|
Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150

|
Цитата(kovigor @ Aug 20 2014, 15:00)  И чему она равна ? 256
|
|
|
|
|
Aug 20 2014, 12:16
|
Частый гость
 
Группа: Участник
Сообщений: 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 ''Может в разных компиляторах синтаксис объявления указателя отличается?
|
|
|
|
|
Aug 20 2014, 17:37
|

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

|
Конструкции CODE SIGNAL(USART1_RXC_vect ) и CODE uin1=UDR1; в пике абсолютно бессмысленны. MesX объявлены после PP? А где это вообще тогда работает?
|
|
|
|
|
Aug 20 2014, 18:28
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 21 2014, 04:45
|

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};
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 21 2014, 08:07
|
Частый гость
 
Группа: Участник
Сообщений: 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}; Как будто ему непонятна такая запись...
|
|
|
|
|
Aug 21 2014, 08:17
|

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}; Как будто ему непонятна такая запись... Покажите полный текст сообщения об ошибке? Я попробовал собрать двумя компиляторами, собралось без вопросов. Какому компилятору вы это пытаетесь скормить?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 21 2014, 08:28
|
Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 13-01-06
Пользователь №: 13 150

|
Компилятор mikroC for PIC mikroElektronika лицензия.
|
|
|
|
|
Aug 21 2014, 10:48
|
Частый гость
 
Группа: Участник
Сообщений: 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 после добавления все работает.
|
|
|
|
|
Aug 21 2014, 12:04
|

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 после добавления все работает. Ну, тут компилятор, по ходу, не прав: указатель на константный объект разрешено (и это вполне безопасно) инициализировать адресом неконстантного объекта (что и демонстрируют упомянутые компиляторы). Вот наоборот нельзя и это понятно - чтобы исключить изменение константного объекта через указатель. Ваш компилер зачем-то требует полного соответствия. Хорошо, что в данном случае вас это устраивает.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Aug 22 2014, 07:46
|

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

|
Цитата(dxp @ Aug 21 2014, 18:04)  Ну, тут компилятор, по ходу, не прав: указатель на константный объект разрешено (и это вполне безопасно) инициализировать адресом неконстантного объекта (что и демонстрируют упомянутые компиляторы). Вот наоборот нельзя и это понятно - чтобы исключить изменение константного объекта через указатель. Ваш компилер зачем-то требует полного соответствия. Хорошо, что в данном случае вас это устраивает. Он прав. Если у пика гарвардская архитектура, как у авра, то const объекты всегда помещаются во flash, а не const - в RAM. А это - совершенно разные адресные пространства. Поэтому компилятор и выдаёт как минимум предупреждения. Даже на архитектурах с единым адресным пространством - фон-Неймана (например, обычные компы), модифицированного Гарварда (например, STM32) или ещё какие-то. Если Вы хотите подавить эти ошибки/предупреждения, то используйте явное приведение типа. Но при этом имейте в виду все нюансы типа разных адресных пространств. Иначе полезут ошибки времени исполнения.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|