[an error occurred while processing this directive]
|
|
Здравствуйте!
У меня возникла проблема при работе с CAN под RTX51 Full.
Когда я тестировал (на железе) свой проэкт под RTX для микроконтроллера Siemens C515C
(на контроллер подаю тактовую частоту 6МГц) обнаружилось что программа не получает
предназначенные ей CAN сообщения, хотя отправляет всё нормально.
Деффекты оборудования исключены, дело исключительно в моей программе.
Я написал небольшой примерчик, который и демонтсрирует суть проблемы.
Он работает так:
1) функция main запускает задачу RTX c номером 1.
2) эта задача инициирует коммуникацию CAN и в случае ошибки сразу
же останавливает систему, высветив сообщение об ошибке.
3) После успешной инициализации в бесконечном цикле получаем сообщения
с идентификатором 2500, попутно сбрасывая WatchDog таймер. При получении сообщения на
терминал высвечиваем соответствующую надпись.
В общем, когда это запускаешь на железе, никаких ошибок не случается.
Когда посылаешь сообщения, которые программа, по идее, должна слышать,
на терминал ни ошибок, ни сообщений о получении объекта не выводится,
то есть программа никогда не выходит из цикла ожидания сообщения,
следовательно никаких сообщений программа в сети не регистрирует.
Пожалуйста посмотрите этот код (и почитайте комментарии), скажите в чём ошибка? В чём я всё-таки заблуждаюсь?
(я ещё пока новичёк в программировании для MCU ;)
#define TIMING0 0xC4 // Baudrate: 75000 bauds on 6 MHz MCU #define MM_TST_IN 2500 // идентификатор получаемых сообщений unsigned char err; puts("\nCAN_TEST v1 started!"); while(1){ //цикл хоть и бесконечный, но выполняется только один раз. //Инициализируем CAN if((err=can_task_create())!=C_OK) break; //Добираемся до сюда только если не было ошибок инициализации WDT=1; SWDT=1; //Reset WatchDog if(err!=C_OK){ puts("Ошибка инициализации CAN!"); while(1){ // "Останавливаем" систему бесконечным циклом WDT=1; SWDT=1; //Reset WatchDog //Добираемся до сюда только если небыло ошибок инициализации ;) puts("receiving..."); // Вот из этого цикла (который следует за комментарием) //Сюда попадём либо если получим сообщение, либо если произойдёт ошибка if(err==C_OK) puts("Сообщение получено успешно."); //было бы неплохо! } BD = 1; /*set internal BAUDrate generator */ } void main(void){ WDTREL=0x80; //set WathDog timeout to maximum (0.62 sec) os_start_system(TASK1); //запускаем RTX }
E-mail:
info@telesys.ru
#include
#include
#include
#include "src515x5/rtxcanx.h" //стандартная библиотека RTX_CAN для С515С
#define TASK1 1
#define TIMING1 0x49 //
void task1(void) _task_ TASK1 {
struct can_message_struct xdata can_msg;
//Нужен только для того, чтоб в случае ошибки какой-либо из
//функций инициализации "перепрыгнуть" остальные.
if((err=can_hw_init(TIMING0,TIMING1,0,0,0))!=C_OK) break;
if((err=can_def_obj_ext(MM_TST_IN,8,D_REC))!=C_OK) break;
if((err=can_start())!=C_OK) break;
break;
}
// и любуемся сообщением об ошибке.
// Работу программы можно восстановить только HardWare ресетом.
}
}
while(1){
// программа никогда не возвращается
// Ошибок до этого цикла никаких не возникает.
// То есть попросту стандартная библиотека RTX_CAN не регистрирует
// никаких сообщений
do{
WDT=1; SWDT=1; //Reset WatchDog
}while((err=can_receive(10,(void *)&can_msg))==C_TIMEOUT);
//Но проблема именно в том что сюда мы, почему-то, никак не можем попасть ;)
else puts("Ошибка при получении сообщения."); //хотя бы было б за что зацепиться...
}
//с помошью этой функции будем инициировать COM-порт
void com_init(void) {
PCON |= 0x80; /*6/10Mhz-Quarz */
SCON = 0x5A; /* UART to mode 1*/
WDT=1; SWDT=1; //Reset WatchDog
com_init(); //инициируем COM-порт
Ответы