Jump to content

    
Sign in to follow this  
dormouse

CAN128. Попробуем разобраться.

Recommended Posts

Чуть-чуть портят впечатление кривенькие с косенькими светодиодиками торцевые стенки-заглушки, но надеюсь это до следующей партии.

 

Спасибо за замечание, в текущей партии уже исправили.

Share this post


Link to post
Share on other sites

Меня очень интерисует эта тема. т. к. я сейчас только разбираючь с CAN ом. У меня вопрос.

может ли в арбитраже учавствать не только индентификатор но и остальная часть какдра.

Edited by zuuuuk

Share this post


Link to post
Share on other sites
Меня очень интерисует эта тема. т. к. я сейчас только разбираючь с CAN ом. У меня вопрос.

может ли в арбитраже учавствать не только индентификатор но и остальная часть какдра.

Это вопрос для другого форума -- http://electronix.ru/forum/index.php?showforum=158

 

Нет, не может. Это четко описано в спецификации.

Share this post


Link to post
Share on other sites
При начале работы я использовал CAN примерно так:

 

// обработчик CAN (полингом)

static void CanHandler(void)
{
  {
    BYTE Tmp;
    if (CANGSTA & (1<<BOFF)) {
      Reset(); // произошло BUS OFF
    }
    Tmp=CANHPMOB; // Проверка принятых пакетов
    if (Tmp<0xF0) {
      CANPAGE=Tmp;
      if (Tmp<0x20) RxHandler1(); // прием из майл бокса 0 или 1
      else if (Tmp<0x40) RxHandler2(); // прием из майл бокса 2 или 3
      else if (Tmp<0x60) RxHandler3(); // прием из майл бокса 4 или 5
      // удаляем пакет
      CANSTMOB=0;
      CANCDMOB=0x90;

    } else {
      // 7 ой майл бокс используем для отправки
      CANPAGE=0x60;
      if (!(CANSTMOB & (1<<TXOK))) return;
      TxHandler();
    }  
  }
}

 

на эту функчию получаю в компиляторе winavr ошибки

C:\WinAVR\projects\Can_Int/main.c:143: undefined reference to `TxHandler'

C:\WinAVR\projects\Can_Int/main.c:127: undefined reference to `Reset'

C:\WinAVR\projects\Can_Int/main.c:132: undefined reference to `RxHandler1'

C:\WinAVR\projects\Can_Int/main.c:133: undefined reference to `RxHandler2'

C:\WinAVR\projects\Can_Int/main.c:134: undefined reference to `RxHandler3'

 

как их исправить?

Share this post


Link to post
Share on other sites

я не могу понять как этот Can ваще работает млиин помогите....

Надо чтобы одна микросхемка At90cAn128 отправляла какие-нибудь данные а другая At90cAn128 их принимала и в случае обнарожения нуля в байте данных зажигала светодиод .....очень нужно помогите :)))

_________________________________________________

я не волщебник я только учусь .....

Edited by Dimorus

Share this post


Link to post
Share on other sites
А кто-нибудь автора dormouse видел или может знает? :1111493779:

сорри за офтопик :bb-offtopic:

 

Такая же проблема- нужен скелет на асемблере, что бы пакет хоть просто в сеть кинуть...

Кто может помочь, скиньте код. (at90can128)

Share this post


Link to post
Share on other sites

я же выкладывал нормальную библиотеку для работы с этим контроллером - чем не подходит? Единственный недостаток - работа поллингом, т.е. без прерываний по приему/передаче сообщения, но для множества применений вполне достаточно и этого.

Share this post


Link to post
Share on other sites
Такая же проблема- нужен скелет на асемблере, что бы пакет хоть просто в сеть кинуть...

Кто может помочь, скиньте код. (at90can128)

Из моего проекта без к.л. обработки.

RG00 - регистр равный 0x00. RBXn - регистры из R16...R24.

Выключил автоматическую перепередачу при ошибках. При неподтверждении ACK передаю 3 раза (4 попытки).

Вопросы конечно будут ещё..

ICAN_L:	; Инициализация CAN.
; Тактовая частота 14745600. Связь 125000 (реально 126031)
.SET CBT1=0x10	; писаемое в CANBT1 (делитель=9, частота 1.6384 МГц)
.SET CBT2=0x0A	; писаемое в CANBT2 (Tsjw=1, Tprs=6)
.SET CBT3=0x25	; писаемое в CANBT3 (Tphs2=3, Tphs1=3, SMP=1)
; TQ=(SYN=1)+(Tprs=6)+(Tphs1=3)+(Tphs2=3)=13
; Sampling Point=((SYN=1)+(Tprs=6)+(Tphs1=3))/(TQ=13)=76.92%

;.SET CBT1=0x12	; писаемое в CANBT1 (16 МГц) (частота 1,6 МГц)
;.SET CBT2=0x0C	; писаемое в CANBT2 (16 МГц)
;.SET CBT3=0x37	; писаемое в CANBT3 (16 МГц)
; BRP=9 (предделитель на 10), SJW=0 (1 квант), PRS=6 (7 квантов),
; PHS2=3 (4 кванта), PHS1=3 (4 кванта), SMP=1 (3 выборки). Итого 16.

;.SET CBT1=0x0A	; писаемое в CANBT1 (12 МГц) (частота 2 МГц)
;.SET CBT2=0x0E	; писаемое в CANBT2 (12 МГц)
;.SET CBT3=0x4B	; писаемое в CANBT3 (12 МГц)
; BRP=5 (предделитель на 6), SJW=0 (1 квант), PRS=7 (8 квантов),
; PHS2=4 (5 квантов), PHS1=5 (6 квантов), SMP=1 (3 выборки). Итого 20.
sts	CANGCON,RG00	; CAN запрещён
ldi	RBX0,15		; имеется 15 MOb
ldi	RBX1,0x00	; писаем в CANPAGE
ldi	XL,0x00		; писаем в CANSTMOB
ldi	XH,0x00		; писаем в CANCDMOB
IniCAN1: ; цикл сброса всех MOb
sts	CANPAGE,RBX1	; N MOb
sts	CANCDMOB,XH	; регистр контроля MOb
sts	CANSTMOB,XL	; регистр статуса MOb
subi	RBX1,0xF0	; увеличим N Page MOb на след. раз
dec	RBX0		; уменьшаем сч-к
brne	IniCAN1		; циклимся
ldi	RBX0,CBT1	; настройка
sts	CANBT1,RBX0	; частоты
ldi	RBX0,CBT2	; шоб получить
sts	CANBT2,RBX0	; скорость
ldi	RBX0,CBT3	; CAN
sts	CANBT3,RBX0	; 125 кБит
; инициализируем скорость счёта CANTIM (Time Stamp)
ldi	RBX0,((Fclk>>3)/16000)-1 ; шоб считалось
sts	CANTCON,RBX0	; +16 единиц за 1 мС

; иниц-зируем MOb N10..14 на прослушку сообщений "я ещё живой"

ldi	RBX1,14<<4	; начнём с 14 MOb
IniCAN2: ; цикл иниц-ии MOb N14..10
sts	CANPAGE,RBX1	; и писать в AT45 и слать через InIn
ldi	RBX0,1<<IDE	; 29 бит адреса (пока до кучи)
sts	CANCDMOB,RBX0	; остальное пока запрещено
; адрес CAN приёма "я ещё живой"
ldi	RBX0,AdSiV>>21	; 28..21 биты
sts	CANIDT1,RBX0	; адреса приёма
ldi	RBX0,low(AdSiV>>13) ; 20..13 биты
sts	CANIDT2,RBX0	; адреса приёма
ldi	RBX0,low(AdSiV>>5) ; 12..5 биты
sts	CANIDT3,RBX0	; адреса приёма
ldi	RBX0,low(AdSiV<<3) ; 4..0 маска,
sts	CANIDT4,RBX0	; RTRTAG, RB1TAG и RB0TAG
; маска адреса CAN приёма "я ещё живой"
ldi	RBX0,AmSiV>>21	; 28..21 биты маски
sts	CANIDM1,RBX0	; адреса приёма
ldi	RBX0,low(AmSiV>>13) ; 20..13 биты маски
sts	CANIDM2,RBX0	; адреса приёма
ldi	RBX0,low(AmSiV>>5) ; 12..5 биты маски
sts	CANIDM3,RBX0	; адреса приёма
ldi	RBX0,low(AmSiV<<3)|(1<<RTRMSK)|(1<<IDEMSK)
sts	CANIDM4,RBX0	; 4..0 маска, RTR и IDE (2.0B)
ldi	RBX0,(1<<CONMOB1)|(1<<IDE) ; у MOb
sts	CANCDMOB,RBX0	; разрешим приём (+2.0 B до кучи)
subi	RBX1,1<<4	; уменьшаем N MOb
cpi	RBX1,10<<4	; проверим на < 10го MOb
brcc	IniCAN2		; C=0 - циклимся

sts	CANIE2,RG00	; разрешим прерывание токо от
ldi RBX0,1<<IEMOB14|1<<IEMOB13|1<<IEMOB12|1<<IEMOB11|1<<IEMOB10
sts	CANIE1,RBX0	;  слушаюших MOb N10..14

ldi	RBX0,0x7F	; сбросим все сбрасываемые
sts	CANGIT,RBX0	; флаги прерываний от CAN

;	sts	L_GER,RG00	; очистим LISTEN-накопитель ошибок

ldi	RBX0,(1<<ENIT)|(1<<ENRX)|(1<<ENTX)|(1<<ENERR)|(1<<ENERG)
;	ldi	RBX0,(1<<ENIT)|(1<<ENERG)
; ldi	RBX0,0x00
sts	CANGIE,RBX0	; прер-я по приёму и ош-кам

;	ldi	RBX0,(1<<TTC)|(1<<SYNTTC)|(1<<LISTEN)|(1<<ENASTB)
ldi	RBX0,(1<<TTC)|(1<<SYNTTC)|(1<<ENASTB)
sts	CANGCON,RBX0	;

sts	FlOpO,RG00	; шоб не зависнуть
sts	FlCpO,RG00	; после переиниц-ии
ret
;***
C6CRO:	; Пошлём сообщение, управляющее CAN РЕЛЕ (передача Выходов).
; Но в начале запретим низкоприоритетную передачу Выходов.
ldi	RBX0,7<<4	; выберем MOb
sts	CANPAGE,RBX0	; N7 (+ MSG с 0)
lds	RBX0,CANCDMOB	; прочтём, шоб запретить токо передачу
andi	RBX0,low(~((1<<CONMOB1)|(1<<CONMOB0))) ; (шоб если она
sts	CANCDMOB,RBX0	; уже пошла, то былаб такой-же)
ldi	RBX0,6<<4	; выберем MOb
sts	CANPAGE,RBX0	; N6 (+ MSG с 0)
ldi	RBX0,1<<IDE	; 29 бит адреса (пока до кучи)
sts	CANCDMOB,RBX0	; остальное пока запрещено
; адрес CAN передачи срочного управления CAN РЕЛЕ (Выходов)
lds	RBX1,N8OpO	; N8 передачи Выходов
lds	XL,N16OpO	; м.б. N16
lds	XH,N16OpO+1	; с.б. N16
add	XL,XL		; сдвинем
rol	XH		; всё
rol	RBX1		; это
rol	RBX0		; на 3 бита
add	XL,XL
rol	XH
rol	RBX1
rol	RBX0
add	XL,XL
rol	XH
rol	RBX1
rol	RBX0
andi	RBX0,0x07	; тут 3 ст. бита N8
ori	RBX0,(Ad6CAN>>21)&0xF8 ; 5 ст. бит адреса
sts	CANIDT1,RBX0	; 28..21 биты адреса передачи
sts	CANIDT2,RBX1	; 20..13 биты адреса передачи
sts	CANIDT3,XH	; 12..5 биты адреса передачи
sts	CANIDT4,XL	; 4..0 биты с RTR=RB1=RB0=0
; маска адреса CAN передачи CAN РЕЛЕ (Выходов)
ldi	RBX0,Am6CAN>>21	; 28..21 биты маски
sts	CANIDM1,RBX0	; адреса передачи
ldi	RBX0,low(Am6CAN>>13) ; 20..13 биты маски
sts	CANIDM2,RBX0	; адреса передачи
ldi	RBX0,low(Am6CAN>>5) ; 12..5 биты маски
sts	CANIDM3,RBX0	; адреса передачи
ldi	RBX0,low(Am6CAN<<3)|(1<<RTRMSK)|(1<<IDEMSK)
sts	CANIDM4,RBX0	; 4..0 маска, RTR и IDE (2.0B)
ldi	RBX0,(1<<IDE)|(LgMOb6&0x0F) ; у соотв-го MOb
sts	CANCDMOB,RBX0	; запретим всё (+2.0 B до кучи)
lds	RBX0,DtOpO	; м.б. данных
sts	CANMSG,RBX0	; в передачу
lds	RBX0,DtOpO+1	; с.б. данных
sts	CANMSG,RBX0	; в передачу
ldi	RBX0,0x03	; разрешим 3 неполучения
sts	MO6Cn,RBX0	; ACK (min м.б. 4 попытки)
sts	MO6St,RG00	; статус передачи =0
sts	CANSTMOB,RG00	; очистим ош-ки и прерывания
ldi	RBX0,(1<<CONMOB0)|(1<<IDE)|(LgMOb6&0x0F) ; у MOb N6
sts	CANCDMOB,RBX0	; разрешим передачу + 2.0B
lds	RBX0,CANIE2	; там разр-ние прерываний от MOb N0..7
andi	RBX0,low(~(1<<IEMOB7)) ; запретим от MOb N7
ori	RBX0,(1<<IEMOB6) ; разрешим от MOb N6
sts	CANIE2,RBX0	; назад изменённую маску
lds	RBX0,CANGIE	; прочтём шоб доп-но
ori	RBX0,(1<<ENIT)|(1<<ENTX); разрешить прер-е
sts	CANGIE,RBX0	; по передаче (до кучи)
ret			; возврат
;***

Кодировка не совпадает - пришлось перекодировать в DOS-866, а файл прикрепить что-то не удаётся. Какие-то проблемы с прикреплением файлов.

Share this post


Link to post
Share on other sites
я же выкладывал нормальную библиотеку для работы с этим контроллером - чем не подходит? Единственный недостаток - работа поллингом, т.е. без прерываний по приему/передаче сообщения, но для множества применений вполне достаточно и этого.

 

Спасибо. Там вроде на Си все реализовано. Мне для понимания на асме полегче было бы... Но спасибо, будем разбираться...

(Ох уж этот CAN, никто не хочет написать обучалку на примерах попроще для реализации CAN??? Очень нужная вещь :) )

Edited by Alexeus

Share this post


Link to post
Share on other sites

А там нечего писать. Инициализацию - заимствовать. А приём - передача - найприметивнейшая. Одни разговоры - CAN.

На PIC значительно сложнее всё получается.

 

Если же приём осущ. по прерыванию - вообще лафа. Можно даже таймаут настроить, без внешних измерений. Короче - несколько строк.

 

Главное - не ленитесь - разберитесь. Ну и общее представление по CAN надо иметь.

Share this post


Link to post
Share on other sites
Спасибо. Там вроде на Си все реализовано. Мне для понимания на асме полегче было бы... Но спасибо, будем разбираться...

(Ох уж этот CAN, никто не хочет написать обучалку на примерах попроще для реализации CAN??? Очень нужная вещь :) )

использование ассемблера для 128 килобайт флеша - это попахивает мазохизмом... а если абстрагироваться от удобольствий, то в вышеупомянутой библиотеке достаточно для понимания... ну и почитать даташит хоть поверхностно...

Share this post


Link to post
Share on other sites

Это, конечно, похоже больше в тематику- обучалка, но подскажите как пакет составить и отправить, что то не соображу куда подставлять ID и собственно сами данные...

 

Я понимаю УСАПП там... или SPI- есть регистр в который кидай из переменной и все уйдет, по приходу реагируем на поднятый флаг, но в этом CANе я что то не въеду никак. Нужно вот пакет с полезной инфой в 8 байт отправить с идентификатором (ID), ну пусть число 395. Что для этого нужно?

 

(8 байт будем? например, считывать циклом из ОЗУ (ld temp,Y+))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this