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

 
 
 
Reply to this topicStart new topic
> at90can128, Прерывания от MOB
SasaVitebsk
сообщение Dec 20 2007, 19:06
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Доброго времени суток.
Написал программу по работе с CAN. Задача довольно простая. Необходимо отлавливать сообщения поступающими по двум IDT. Для этого зарезервировал два MOB. Вроде инициализация правильная. Вроде всё настроил верно. Смотрю по JTAG и вроде всё нормально.

Проблемы в том, что с передающего устройства всё валит непрерывно. Причём поступает много различных сообщений, а мне надо отфильтровать только два.

Настораживает то, что при разных запусках работа чуть чуть отличается вроде. Хотя, возможно это из-за того, что передающее устройство я притормозить немогу. Таким образом оно продолжает валить даже тогда, когда я остановил проц по JTAG.

Сам CAN узел сложноват, и не всё мне понятно. Например непонятно сбрасывается ли прерывание автоматом при входе в прерывание. Там ведь груповое прерывание. Может надо какие-то пляски ритуальные совершить?

Конечно, в оригинале было бы замечательно посмотреть инициализацию при аналогичной задаче. Или проверить мою. Я могу выложить.

ЗЫ: В библиотеке такого нет. Спецы - отзовитесь.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 21 2007, 10:42
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(SasaVitebsk @ Dec 20 2007, 19:06) *
Проблемы в том, что с передающего устройства всё валит непрерывно

Проблема только для просмотра линии осциллом, но не проблема для МК, поскольку кан-автомат выбирает сообщения, адресованные только ему.
Цитата(SasaVitebsk @ Dec 20 2007, 19:06) *
Сам CAN узел сложноват, и не всё мне понятно. Например непонятно сбрасывается ли прерывание автоматом при входе в прерывание. Там ведь груповое прерывание. Может надо какие-то пляски ритуальные совершить?

Не надо плясок, это лишнее. Бит CANIT в регистре CANGIT сбрасывается автоматически, но не на входе, а на выходе из прерывания - по команде RETI. Остальные CAN прерывания должны сбрасываться в программе записью 1 в соответствующий бит.

Давайте посмотрим ваш пример, что-нибудь и увидим(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 21 2007, 17:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Вот так идёт инициализация.
Код
// Инициализация CAN
  Can_reset();                                            // Инициализация Can
  Can_enable();
  Can_conf_bt();                                        // Установка Fcan = 250 кбит
  can_clear_all_mob();                                    // Очистка всех mailbox
  CANEN2=3;                                                // Разрешить работу двух ящиков MOB
  CANIE2=3;                                                // Разрешить прерывания двух ящиков MOB
  
  can_Set_mob_T();                                        // Инициализация ящика температуры двигателя
  can_Set_mob_POil();                                    // Инициализация ящика давления масла
  CANGIE = (1<<ENIT)|(1<<ENRX);                            // Разрешить прерывание на приём

вот некоторые процедуры
Код
void can_Set_mob_T(void)
{
  Can_clear_rtr();
  Can_set_mob(MOB_T);
  Can_set_mask_mob();                                    // Принимать конкретные адреса
  Can_set_dlc(8);                                        // Длина пакета 8 байт
  Can_clear_rplv();                                        // без ответа
  Can_config_rx();                                        // на приём
  Can_set_ext_id(idt_T);                                // Задать адрес
}

void can_clear_all_mob(void)
{
uint8_t  mob_number;

    for (mob_number = 0; mob_number < NB_MOB; mob_number++)
    {
        CANPAGE = (mob_number << 4);    //! Page index
        Can_clear_mob();                //! All MOb Registers=0
    }
}


Вот так выглядит прерывание
Код
// Прерывание от CAN
#pragma    vector=CANIT_vect
__interrupt    static void    CAN_int(void)
{
  uint8_t    data[8],i;
  
  if((CANSIT2 & 1)!=0)                                    // MOB0 сработал? Температура первый байт
  {
    Can_set_mob(MOB_T);
    for(i=0;i<8;i++) data[i]=CANMSG;                    // Прочитать сообщение целиком
    CAN_Temp=data[0];                                    // Прочитать температуру
  }
  if((CANSIT2 & 2)!=0)                                    // MOB1 сработал? Давление масла 4 байт
  {
    Can_set_mob(MOB_OIL);
    for(i=0;i<8;i++) data[i]=CANMSG;                    // Прочитать сообщение целиком
    CAN_POil=data[3];                                    // Прочитать температуру
  }
}
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 22 2007, 00:48
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Тут вроде бы всё в порядке, единственно только после проверки битов в CANSIT2, надо бы проверить биты RXOK в каждом CANSTMOB, может у вас прерывания идут по ошибке или ещё по чему, ну и сбрасывать эти биты вручную надо. Ну и я бы не стал писать if((CANSIT2 & 1)!=0), как-то не кошерно, я бы написал if((CANSIT2&1)==1), хотя на логику не влияет.

Ну а раз тут всё в порядке, надо искать в другом месте. Вы уверены, что правильно установили скорость, синхробиты, сегменты и т.п.?...

Лучше всего сделать так. Установить режим Listening Mode и начать с непрерывной передачи одного сообщения и смотреть, что принято. Добившись приёма без выхода на шину, можно начать приём с внешней шины.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 23 2007, 11:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Настораживает вот эта выдержка из даташита по CANCDMOB.

• Bit 7:6 – CONMOB1:0: Configuration of Message Object
These bits set the communication to be performed (no initial value after RESET).
•00 - disable.
•01 - enable transmission.
•10 - enable reception.
•11 - enable frame buffer reception
These bits are not cleared once the communication is performed. The user must rewrite
the configuration to enable a new communication.
•This operation is necessary to be able to reset the BXOK flag.
•This operation also set the corresponding bit in the CANEN registers.

А также вот такие выдержки из библиотек
Код
#define CONMOB_MSK  ((1<<CONMOB1)|(1<<CONMOB0))                          //! MaSK for CONfiguration MOb

#define DISABLE_MOB       ( CANCDMOB &= (~CONMOB_MSK) )

#define Can_config_rx()        { DISABLE_MOB; CANCDMOB |= (MOB_Rx_ENA  << CONMOB); }


GM прокоментируй пожалуйста. Я так понял, что мне в прерывании надо каждый раз обязательно делать Can_config_rx() или я неверно перевёл? Мой английский хромает на все 5 ног.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 23 2007, 13:49
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



ЗЫ: Вроде заработало. Теперь появились вопросы к другим. smile.gif Похоже датчик не туда воткнули. smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 23 2007, 17:44
Сообщение #7


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(SasaVitebsk @ Dec 23 2007, 11:36) *
These bits are not cleared once the communication is performed. The user must rewrite the configuration to enable a new communication

Вольный перевод такой. Эти биты не очищаются после передачи пакета. Программа пользователя должна перезаписать конфигурацию для нового обмена.
Смысл тут такой, принят пакет в почтовый ящик, дальнейший приём запрещён, поскольку программа должна принятое прочитать, и после прочтения принять некое решение, скажем, разрешить приём нового пакета

Цитата(SasaVitebsk @ Dec 23 2007, 11:36) *
А также вот такие выдержки из библиотек
Код
#define CONMOB_MSK  ((1<<CONMOB1)|(1<<CONMOB0))    //! MaSK for CONfiguration MOb
#define DISABLE_MOB       ( CANCDMOB &= (~CONMOB_MSK) )
#define Can_config_rx()
{
DISABLE_MOB; CANCDMOB |= (MOB_Rx_ENA  << CONMOB);
}

Первые две строчки можно заменить одной
#define DISABLE_MOB (CANCDMOB=(0<<CONMOB1)|(0<<CONMOB0)) или по-рабоче-крестьянски CANCDMOB=0х08
В последней запрещается ящик, затем реконфигурируется, MOB_Rx_ENA=10 – разрешить приём
Цитата(SasaVitebsk @ Dec 23 2007, 11:36) *
GM прокомментируй пожалуйста. Я так понял, что мне в прерывании надо каждый раз обязательно делать Can_config_rx() или я неверно перевёл? Мой английский хромает на все 5 ног

Ну да, надо показать кан-модулю, что пакет считан, можно принимать дальше, для этого надо переписать биты <7-6> регистра CANCDMOB, а также поля IDE и DLC, которые заменяются принятыми битами. По-моему, проще написать CANCDMOB=0х88, да и всё, чем писать побитно.

Логика в запрещении приёма есть, поскольку, если не запрещать приём, то пакет может быть переписан и, следовательно, потерян, зачем тогда его было вообще передавать?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 23 2007, 18:12
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Пасиба. Уже сам разобрался. smile.gif Функциклирует.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 23 2007, 22:51
Сообщение #9


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(SasaVitebsk @ Dec 23 2007, 18:12) *
Пасиба. Уже сам разобрался. smile.gif Функциклирует

Ну так, что было, почему не работало?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jan 3 2008, 10:08
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(=GM= @ Dec 24 2007, 02:51) *
Ну так, что было, почему не работало?

Простите. Упустил вопрос. Думал все уже поняли. smile.gif
Необходимо каждый раз переконфигурировать ящик.
Код
    Can_clear_status_mob();
    Can_config_rx();


А вот такой вопрос. Ошибки обязательно надо обрабатывать? Просто похоже что ответ "да". Может у кого есть вариант текста обработки ошибок? Я конечно сам изучаю пока. Просто свой вариант проверить будет достаточно сложно. Надо сымитировать все возможные ошибки.
Go to the top of the page
 
+Quote Post

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

 


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


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