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

|
Доброго времени суток. Написал программу по работе с CAN. Задача довольно простая. Необходимо отлавливать сообщения поступающими по двум IDT. Для этого зарезервировал два MOB. Вроде инициализация правильная. Вроде всё настроил верно. Смотрю по JTAG и вроде всё нормально.
Проблемы в том, что с передающего устройства всё валит непрерывно. Причём поступает много различных сообщений, а мне надо отфильтровать только два.
Настораживает то, что при разных запусках работа чуть чуть отличается вроде. Хотя, возможно это из-за того, что передающее устройство я притормозить немогу. Таким образом оно продолжает валить даже тогда, когда я остановил проц по JTAG.
Сам CAN узел сложноват, и не всё мне понятно. Например непонятно сбрасывается ли прерывание автоматом при входе в прерывание. Там ведь груповое прерывание. Может надо какие-то пляски ритуальные совершить?
Конечно, в оригинале было бы замечательно посмотреть инициализацию при аналогичной задаче. Или проверить мою. Я могу выложить.
ЗЫ: В библиотеке такого нет. Спецы - отзовитесь.
|
|
|
|
|
Dec 21 2007, 10:42
|

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 в соответствующий бит. Давайте посмотрим ваш пример, что-нибудь и увидим(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 21 2007, 17:09
|
Гуру
     
Группа: Свой
Сообщений: 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]; // Прочитать температуру } }
|
|
|
|
|
Dec 22 2007, 00:48
|

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

|
Тут вроде бы всё в порядке, единственно только после проверки битов в CANSIT2, надо бы проверить биты RXOK в каждом CANSTMOB, может у вас прерывания идут по ошибке или ещё по чему, ну и сбрасывать эти биты вручную надо. Ну и я бы не стал писать if((CANSIT2 & 1)!=0), как-то не кошерно, я бы написал if((CANSIT2&1)==1), хотя на логику не влияет.
Ну а раз тут всё в порядке, надо искать в другом месте. Вы уверены, что правильно установили скорость, синхробиты, сегменты и т.п.?...
Лучше всего сделать так. Установить режим Listening Mode и начать с непрерывной передачи одного сообщения и смотреть, что принято. Добившись приёма без выхода на шину, можно начать приём с внешней шины.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Dec 23 2007, 11:36
|
Гуру
     
Группа: Свой
Сообщений: 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 ног.
|
|
|
|
|
Dec 23 2007, 17:44
|

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, да и всё, чем писать побитно. Логика в запрещении приёма есть, поскольку, если не запрещать приём, то пакет может быть переписан и, следовательно, потерян, зачем тогда его было вообще передавать?
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jan 3 2008, 10:08
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(=GM= @ Dec 24 2007, 02:51)  Ну так, что было, почему не работало? Простите. Упустил вопрос. Думал все уже поняли.  Необходимо каждый раз переконфигурировать ящик. Код Can_clear_status_mob(); Can_config_rx(); А вот такой вопрос. Ошибки обязательно надо обрабатывать? Просто похоже что ответ "да". Может у кого есть вариант текста обработки ошибок? Я конечно сам изучаю пока. Просто свой вариант проверить будет достаточно сложно. Надо сымитировать все возможные ошибки.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|