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

 
 
 
Reply to this topicStart new topic
> AT90CAN128 CAN Buffer
pavel-pervomaysk
сообщение Dec 13 2011, 17:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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 : вот это не понятно тоже ...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 13 2011, 19:35
Сообщение #2


Гуру
******

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



Цитата(Павлик @ Dec 13 2011, 21:57) *
Как туда загнать данные перед отправкой ?
Bcё тот же CANMSG

Цитата(Павлик @ Dec 13 2011, 21:57) *
INDX0 ... INDX2 местоположение байта данных CAN в FIFO для определенного Mob : вот это не понятно тоже ...
Логично установить их (INDXn) в ноль, и установить автоинкремент (индекс будет увиличиваться при каждом обращении к CANMSG).
Go to the top of the page
 
+Quote Post
KRS
сообщение Dec 13 2011, 19:51
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



А зачем вы на асме пишите?
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Dec 14 2011, 15:02
Сообщение #4


Местный
***

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



Индексы я ставлю в ноль, автоинкремент включаю, данные в пакете получаеются такие же как я привел в первом посте. Есть ли у кого пример отправки 8 байтового сообщения ?
Пишу на асме, Си не знаю...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 14 2011, 16:02
Сообщение #5


Гуру
******

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



Цитата(Павлик @ Dec 14 2011, 19:02) *
Индексы я ставлю в ноль, автоинкремент включаю, данные в пакете получаеются такие же как я привел в первом посте. Есть ли у кого пример отправки 8 байтового сообщения ?

Зачем Вам пример? У Вас и так всё работает... После занесения в CANMSG значения 0х85 занесите в этот же регистр нужные Вам данные ещё семь раз!
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Dec 14 2011, 16:15
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Dec 14 2011, 17:07
Сообщение #7


Местный
***

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



Попробую, спасибо за подсказку.

Гы, не смешно если чесно.
С граматикой в студии у меня проблем нет, ниже все есть.
Модуль инициализирую первый раз, еще так сказать не обкатано все и нет полных коментов, когда будут, пооптимизирую, хотя куда мне девать 128 КБ флеш, за которые я заплатил денег ?

Сообщение отредактировал IgorKossak - Dec 15 2011, 08:28
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Dec 14 2011, 19:43
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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 ?


Странно получается ... Или я что-то не дочитал ?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 15 2011, 05:10
Сообщение #9


Гуру
******

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



Цитата(Павлик @ Dec 14 2011, 23:43) *
Или я что-то не дочитал ?

Наверное, какой-нибудь пример Вам всё-таки посмотреть стоит...
Попробуйте заглянуть в исходники AppNote AVR076 - CAN Bootloader.
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Dec 18 2011, 15:13
Сообщение #10


Местный
***

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



Вопрос решился, подсказали мне мою ошибку.
Go to the top of the page
 
+Quote Post
bumborashik
сообщение Dec 21 2011, 05:24
Сообщение #11





Группа: Новичок
Сообщений: 7
Регистрация: 20-12-07
Пользователь №: 33 494



Цитата(Павлик @ Dec 18 2011, 18:13) *
Вопрос решился, подсказали мне мою ошибку.

Так написал бы тут - в чём дело было.
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Dec 21 2011, 18:22
Сообщение #12


Местный
***

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



Когда полностью будет готово, отпишусь с коментами.
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Dec 22 2011, 16:23
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 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 ?




Может кто подскажет где ошибка ?
Go to the top of the page
 
+Quote Post
pavel-pervomaysk
сообщение Feb 23 2015, 10:52
Сообщение #14


Местный
***

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



Разобрался и с прерываниями и с заполнением.
Странная организация без непосредственного доступа без CANPAGE.

Сообщение отредактировал Павлик - Feb 23 2015, 10:57
Go to the top of the page
 
+Quote Post

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

 


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


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