[an error occurred while processing this directive]
Извините за повтор... Помогите пожалуйста разобраться с RTX_CAN...
(«Телесистемы»: «Конференция «Микроконтроллеры и их применение»»)

миниатюрный аудио-видеорекордер mAVR

Отправлено MX 17 апреля 2003 г. 13:50

Здравствуйте!
У меня возникла проблема при работе с CAN под RTX51 Full.
Когда я тестировал (на железе) свой проэкт под RTX для микроконтроллера Siemens C515C
(на контроллер подаю тактовую частоту 6МГц) обнаружилось что программа не получает
предназначенные ей CAN сообщения, хотя отправляет всё нормально.
Деффекты оборудования исключены, дело исключительно в моей программе.
Я написал небольшой примерчик, который и демонтсрирует суть проблемы.
Он работает так:
1) функция main запускает задачу RTX c номером 1.
2) эта задача инициирует коммуникацию CAN и в случае ошибки сразу
же останавливает систему, высветив сообщение об ошибке.
3) После успешной инициализации в бесконечном цикле получаем сообщения
с идентификатором 2500, попутно сбрасывая WatchDog таймер. При получении сообщения на
терминал высвечиваем соответствующую надпись.

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

Пожалуйста посмотрите этот код (и почитайте комментарии), скажите в чём ошибка? В чём я всё-таки заблуждаюсь?
(я ещё пока новичёк в программировании для MCU ;)


#include
#include
#include
#include "src515x5/rtxcanx.h" //стандартная библиотека RTX_CAN для С515С


#define TASK1 1

#define TIMING0 0xC4 // Baudrate: 75000 bauds on 6 MHz MCU
#define TIMING1 0x49 //

#define MM_TST_IN 2500 // идентификатор получаемых сообщений


void task1(void) _task_ TASK1 {

unsigned char err;
struct can_message_struct xdata can_msg;

puts("\nCAN_TEST v1 started!");

while(1){ //цикл хоть и бесконечный, но выполняется только один раз.
//Нужен только для того, чтоб в случае ошибки какой-либо из
//функций инициализации "перепрыгнуть" остальные.

//Инициализируем CAN

if((err=can_task_create())!=C_OK) break;
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;
}

WDT=1; SWDT=1; //Reset WatchDog

if(err!=C_OK){

puts("Ошибка инициализации CAN!");

while(1){

// "Останавливаем" систему бесконечным циклом
// и любуемся сообщением об ошибке.
// Работу программы можно восстановить только HardWare ресетом.

WDT=1; SWDT=1; //Reset WatchDog
}
}

//Добираемся до сюда только если небыло ошибок инициализации ;)

puts("receiving...");
while(1){

// Вот из этого цикла (который следует за комментарием)
// программа никогда не возвращается
// Ошибок до этого цикла никаких не возникает.
// То есть попросту стандартная библиотека RTX_CAN не регистрирует
// никаких сообщений
do{
WDT=1; SWDT=1; //Reset WatchDog
}while((err=can_receive(10,(void *)&can_msg))==C_TIMEOUT);

//Сюда попадём либо если получим сообщение, либо если произойдёт ошибка
//Но проблема именно в том что сюда мы, почему-то, никак не можем попасть ;)

if(err==C_OK) puts("Сообщение получено успешно."); //было бы неплохо!
else puts("Ошибка при получении сообщения."); //хотя бы было б за что зацепиться...

}
}


//с помошью этой функции будем инициировать COM-порт
void com_init(void) {

BD = 1; /*set internal BAUDrate generator */
PCON |= 0x80; /*6/10Mhz-Quarz */
SCON = 0x5A; /* UART to mode 1*/

}

void main(void){

WDTREL=0x80; //set WathDog timeout to maximum (0.62 sec)
WDT=1; SWDT=1; //Reset WatchDog
com_init(); //инициируем COM-порт

os_start_system(TASK1); //запускаем RTX

}

Составить ответ ||| Конференция ||| Архив

Ответы



Перейти к списку ответов ||| Конференция ||| Архив ||| Главная страница ||| Содержание

E-mail: info@telesys.ru