|
|
  |
AT90CAN128 CAN Buffer |
|
|
|
Dec 13 2011, 17:57
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Всем привет, кто работал с кан модулем пните в нужную сторону плиз. Доку на русском читаю, понять толком не могу. CODE .cseg
RESET: // // STACK INIT ldi tmp, low(ramend) // out SPL,tmp // ldi tmp,high(ramend) // out SPH,tmp //
// CAN ldi tmp,0b00000010 // sts CANGCON,tmp // Can General Control Register ldi tmp,0b00000000 // sts CANGSTA,tmp // Can General Status Register ldi tmp,0b00000000 // sts CANGIT,tmp // Can General Interrupt Register ldi tmp,0b00000000 // sts CANGIE,tmp // Can General Interrupt Enable Register ldi tmp,0b00000000 // sts CANEN2,tmp // Can Enable MOb Register ldi tmp,0b11111111 // sts CANEN1,tmp // Can Enable MOb Register ldi tmp,0b11111111 // sts CANIE2,tmp // Can Enable Interrupt MOb Register ldi tmp,0b00000000 // sts CANIE1,tmp // Can Enable Interrupt MOb Register ldi tmp,0b00000000 // sts CANSIT2,tmp // Can Status Interrupt MOb Register ldi tmp,0b00000000 // sts CANSIT1,tmp // Can Status Interrupt MOb Register
// CAN 8 bit 250 Kbps 16 MHz ldi tmp,0x0E // sts CANBT1,tmp // Can Bit Timming Register ldi tmp,0x04 // sts CANBT2,tmp // Can Bit Timming Register ldi tmp,0x13 // sts CANBT3,tmp // Can Bit Timming Register
ldi tmp,0b00000000 // sts CANTCON,tmp // Can Timer Control Register ldi tmp,0b00000000 // sts CANTIML,tmp // Can Bit Timer RegisterL ldi tmp,0b00000000 // sts CANTIMH,tmp // Can Bit Timer RegisterH ldi tmp,0b00000000 // sts CANTTCL,tmp // Can TCC Timer RegisterL ldi tmp,0b00000000 // sts CANTTCH,tmp // Can TCC Timer RegisterH ldi tmp,0b00000000 // sts CANTEC,tmp // Can Transmit Error Counter Register ldi tmp,0b00000000 // sts CANREC,tmp // Can Receive Error Counter Register ldi tmp,0b00000000 // sts CANHPMOB,tmp // Can Highest Priority MOb Register
// MOBNB0 ... MOBNB3 номер Mob 0 ... 14 // AINC - 0 автоинкремент индекса 1 нет автоинкремента индекса // INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob ldi tmp,(0<<MOBNB3)|(0<<MOBNB2)|(0<<MOBNB1)|(0<<MOBNB0)|(0<<AINC)|(0<<INDX2)|(0<<INDX1)|(0<<INDX0) sts CANPAGE,tmp // Can Page MOb Register
// Регистр состояния объектов сообщения CAN ldi tmp,0b00000000 // sts CANSTMOB,tmp // Can MOb Status Register
// CANCDMOB инициализация // CANMOB1:0 конфигурация объекта сообщения // 0 0 - запрет 0 1 - разрешение передачи 1 0 - разрешение приема 1 1 - разрешение приема буфера кадра // RPLV - ответ допустим // 0 - ответ не готов // 1 - ответ готов и допустим // IDE расширение идентификатора // 0 - CAN 2.0A (длинна идентификаторов 11 бит) // 1 - CAN 2.0B (длинна идентификаторов 29 бит) // DLC 0...3 количество байт в сообщении 0...8 ldi tmp,(0<<CONMOB1)|(1<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) // sts CANCDMOB,tmp // Can MOb Control and DLC Register
// Регистры тэга идентификатора CAN // Если CABNMOB bit IDE равен 1 // ID = 29 bit CANIDT1 (7..0) CANIDT2 (7..0) CANIDT3 (7..0) CANIDT4 (7..3) направление ID <- 28 ...0 // Если CABNMOB bit IDE равен 0 // ID = 11 bit CANIDT1 (7..0) CANIDT2 (7..5) CANIDT3 =0 CANIDT4 &0x05 направление ID <- 10 ...0 ldi xl,low (0x100) // 0 ... 0x7FF ldi xh,high(0x100) // 0 ... 0x7FF mov tmp,xl // swap tmp // lsl tmp // andi tmp,0xE0 // lsr xh ror xl lsr xh ror xl lsr xh ror xl sts CANIDT1,xl // Can Identifier Tag Register1 sts CANIDT2,tmp // Can Identifier Tag Register2 ldi tmp,0x00 // sts CANIDT3,tmp // Can Identifier Tag Register3 ldi tmp,0x00 // sts CANIDT4,tmp // Can Identifier Tag Register4
// Регистры маски идентификатора CAN ldi tmp,0xFE // sts CANIDM1,tmp // Can Identifier Mask Register1 ldi tmp,0xE0 // sts CANIDM2,tmp // Can Identifier Mask Register2 ldi tmp,0x00 // sts CANIDM3,tmp // Can Identifier Mask Register3 ldi tmp,0x00 // sts CANIDM4,tmp // Can Identifier Mask Register4
// статус временной ометки CAN 0 ... 65535 ldi tmp,0b00000000 // sts CANSTML,tmp // Can Time Stamp RegisterL ldi tmp,0b00000000 // sts CANSTMH,tmp // Can Time Stamp RegisterH
// Регистр данных сообщения CAN ldi tmp,0x85 // sts CANMSG,tmp // Can Data Message Register
Получаю такие посылки : START:0 ID:100 SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:85 F9 FF 99 FE 73 DD 6D CRC:0060 OK CRCDEL:1 ACK:3 END:7F Первый байт 0х85 у нас идет с регистра CANMSG Где он берет остальные 7 байт ? F9 FF 99 FE 73 DD 6D Как туда загнать данные перед отправкой ? В пространстве до 0х100 я их не нашел ... INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob : вот это не понятно тоже ...
|
|
|
|
|
Dec 14 2011, 16:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Вы можете вместо ldi tmp,0b00000000
сделать например .def zero = R7 ; регистр с значением 00 И убрать все ldi приведенного выше из кода , где такая команда встречается и записать так sts CANTIML,zero
CODE ldi tmp,0b00000000 // sts CANTCON,tmp // Can Timer Control Register ldi tmp,0b00000000 // sts CANTIML,tmp // Can Bit Timer RegisterL ldi tmp,0b00000000 // sts CANTIMH,tmp // Can Bit Timer RegisterH ldi tmp,0b00000000 // sts CANTTCL,tmp // Can TCC Timer RegisterL ldi tmp,0b00000000 // sts CANTTCH,tmp // Can TCC Timer RegisterH ldi tmp,0b00000000 // sts CANTEC,tmp // Can Transmit Error Counter Register ldi tmp,0b00000000 // sts CANREC,tmp // Can Receive Error Counter Register ldi tmp,0b00000000 // sts CANHPMOB,tmp // Can Highest Priority MOb Register
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Dec 14 2011, 17:07
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Попробую, спасибо за подсказку. Гы, не смешно если чесно. С граматикой в студии у меня проблем нет, ниже все есть. Модуль инициализирую первый раз, еще так сказать не обкатано все и нет полных коментов, когда будут, пооптимизирую, хотя куда мне девать 128 КБ флеш, за которые я заплатил денег ?
Сообщение отредактировал IgorKossak - Dec 15 2011, 08:28
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Dec 14 2011, 19:43
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Попробовал по советам, получилось кое что, но не могу выловить закономерность. Включаю модуль на передачу, в цикле посылаю сообщения по 8 байт. Это код тестовый. CODE cycle_can: ldi tmp,(0<<CONMOB1)|(1<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) // sts CANCDMOB,tmp ldi tmp,0x00 sts CANMSG,tmp inc tmp sts CANMSG,tmp inc tmp sts CANMSG,tmp inc tmp sts CANMSG,tmp inc tmp sts CANMSG,tmp inc tmp sts CANMSG,tmp inc tmp sts CANMSG,tmp inc tmp sts CANMSG,tmp ldi tmp,(0<<CONMOB1)|(0<<CONMOB0)|(1<<RPLV)|(0<<IDE)|(1<<DLC3)|(0<<DLC2)|(0<<DLC1)|(0<<DLC0) // sts CANCDMOB,tmp rcall wait_20ms rjmp cycle_can На выходе имеем CODE ; CAN decoder ;Baudrate=250000
START:0 ID:100 SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:07 00 01 02 03 04 05 06 CRC:6A74 OK CRCDEL:1 ACK:2 END:03 ?
Странно получается ... Или я что-то не дочитал ?
|
|
|
|
|
Dec 15 2011, 05:10
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Павлик @ Dec 14 2011, 23:43)  Или я что-то не дочитал ? Наверное, какой-нибудь пример Вам всё-таки посмотреть стоит... Попробуйте заглянуть в исходники AppNote AVR076 - CAN Bootloader.
|
|
|
|
|
Dec 21 2011, 05:24
|
Группа: Новичок
Сообщений: 7
Регистрация: 20-12-07
Пользователь №: 33 494

|
Цитата(Павлик @ Dec 18 2011, 18:13)  Вопрос решился, подсказали мне мою ошибку. Так написал бы тут - в чём дело было.
|
|
|
|
|
Dec 22 2011, 16:23
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
Возникла еще одна проблема, не могу вставить задержку нормально между отправками сообщений, если вставляю, получается бред ... Без задержки отдает нормально, но устройство не успевает принять. Это тестовый модуль CODE cantx:
; 18 12 00 00 45 85 21 8C
ldi xl,low (0x60D) // 0 ... 0x7FF ldi xh,high(0x60D) // 0 ... 0x7FF rcall can_id // Установка ID сообщения CAN
ldi data,0x00 sts CANPAGE,data ldi data,0x18 // 0 sts CANMSG,data ldi data,0x01 sts CANPAGE,data ldi data,0x12 // 1 sts CANMSG,data ldi data,0x02 sts CANPAGE,data ldi data,0x00 // 2 sts CANMSG,data ldi data,0x03 sts CANPAGE,data ldi data,0x00 // 3 sts CANMSG,data ldi data,0x04 sts CANPAGE,data ldi data,0x45 // 4 sts CANMSG,data ldi data,0x05 sts CANPAGE,data ldi data,0x85 // 5 sts CANMSG,data ldi data,0x06 sts CANPAGE,data ldi data,0x21 // 6 sts CANMSG,data ldi data,0x07 sts CANPAGE,data ldi data,0x8c // 7 sts CANMSG,data
ldi data,0x48 // 0 - 8 длинна сообщения rcall cantx_wait //
ldi xl,low (0x181) // 0 ... 0x7FF ldi xh,high(0x181) // 0 ... 0x7FF rcall can_id // Установка ID сообщения CAN
ldi data,0x00 sts CANPAGE,data ldi data,0x2E // 0 sts CANMSG,data ldi data,0x01 sts CANPAGE,data ldi data,0xB0 // 1 sts CANMSG,data ldi data,0x02 sts CANPAGE,data ldi data,0x2A // 2 sts CANMSG,data ldi data,0x03 sts CANPAGE,data ldi data,0x10 // 3 sts CANMSG,data ldi data,0x04 sts CANPAGE,data ldi data,0x2A // 4 sts CANMSG,data ldi data,0x05 sts CANPAGE,data ldi data,0x28 // 5 sts CANMSG,data ldi data,0x06 sts CANPAGE,data ldi data,0x3F // 6 sts CANMSG,data ldi data,0x07 sts CANPAGE,data ldi data,0x02 // 7 sts CANMSG,data
ldi data,0x48 // 0 - 8 длинна сообщения rcall cantx_wait //
; 075E 4 1 8F 19 00
ldi xl,low (0x75e) // 0 ... 0x7FF ldi xh,high(0x75e) // 0 ... 0x7FF rcall can_id // Установка ID сообщения CAN
ldi data,0x00 sts CANPAGE,data ldi data,0x01 // 0 sts CANMSG,data ldi data,0x01 sts CANPAGE,data ldi data,0x8f // 1 sts CANMSG,data ldi data,0x02 sts CANPAGE,data ldi data,0x19 // 2 sts CANMSG,data ldi data,0x03 sts CANPAGE,data ldi data,0x00 // 3 sts CANMSG,data
ldi data,0x44 // 0 - 8 длинна сообщения rcall cantx_wait //
;10 03 00 00 00 00 50 00
ldi xl,low (0x35D) // 0 ... 0x7FF ldi xh,high(0x35D) // 0 ... 0x7FF rcall can_id // Установка ID сообщения CAN
ldi data,0x00 sts CANPAGE,data ldi data,0x10 sts CANMSG,data ldi data,0x01 sts CANPAGE,data ldi data,0x03 sts CANMSG,data ldi data,0x02 sts CANPAGE,data ldi data,0x00 sts CANMSG,data ldi data,0x03 sts CANPAGE,data ldi data,0x00 sts CANMSG,data ldi data,0x04 sts CANPAGE,data ldi data,0x00 sts CANMSG,data ldi data,0x05 sts CANPAGE,data ldi data,0x00 sts CANMSG,data ldi data,0x06 sts CANPAGE,data ldi data,0x50 sts CANMSG,data ldi data,0x07 sts CANPAGE,data ldi data,0x00 sts CANMSG,data
ldi data,0x48 // 0 - 8 длинна сообщения rcall cantx_wait //
ret
cantx_wait: ser tmp // sts CANSTMOB,tmp // sts CANCDMOB,data // ldi tmp,0x02 // sts CANGCON,tmp // can_wt: lds tmp,CANSTMOB // sbrc tmp,TXOK // ждем пока сбросится бит 6 TXOK rjmp can_wt // cantx_ok: sts CANGCON,zero // lds tmp,CANCDMOB // andi tmp,0xF // sts CANCDMOB,tmp // ser tmp sts CANSTMOB,tmp // rcall wait_10ms ret //
can_id: // Установка ID сообщения CAN push tmp // mov tmp,xl // swap tmp // lsl tmp // andi tmp,0xE0 // clc // lsr xh // ror xl // lsr xh // ror xl // lsr xh // ror xl // sts CANIDT1,xl // Can Identifier Tag Register1 sts CANIDT2,tmp // Can Identifier Tag Register2 sts CANIDT3,zero // Can Identifier Tag Register3 sts CANIDT4,zero // Can Identifier Tag Register4 pop tmp // ret //
wait_10ms: // Задержка 10 мсек. ldi yl, low(35000) // ldi yh,high(35000) // wt_10: // sbiw yl,1 // brne wt_10 // ret // На выходе получаю CODE ; CAN decoder ;Baudrate=500000
START:0 ID:60D SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:18 12 00 00 45 85 21 8C CRC:43EE OK CRCDEL:1 ACK:2 END:03 ?
START:0 ID:60D SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:2E B0 2A 10 2A 28 3F 02 CRC:66B0 OK CRCDEL:1 ACK:2 END:03 ?
START:0 ID:181 SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:01 8F 19 00 2A 28 3F 02 CRC:76EB OK CRCDEL:1 ACK:2 END:03 ?
START:0 ID:75E SRR:0 IDE:0 CTRL:04 [Dsize=4] DATA:10 03 00 00 CRC:5B3B OK CRCDEL:1 ACK:2 Если убрать задержку 10мс получаем так : CODE ; CAN decoder ;Baudrate=500000
START:0 ID:60D SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:18 12 00 00 45 85 21 8C CRC:43EE OK CRCDEL:1 ACK:2 END:03 ?
START:0 ID:181 SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:2E B0 2A 10 2A 28 3F 02 CRC:47F1 OK CRCDEL:1 ACK:2 END:03 ?
START:0 ID:75E SRR:0 IDE:0 CTRL:04 [Dsize=4] DATA:01 8F 19 00 CRC:3D8C OK CRCDEL:1 ACK:2 END:03 ?
START:0 ID:35D SRR:0 IDE:0 CTRL:08 [Dsize=8] DATA:10 03 00 00 00 00 50 00 CRC:199A OK CRCDEL:1 ACK:2 END:03 ?
Может кто подскажет где ошибка ?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|