Цитата(Alexeus @ Jan 22 2009, 16:52)

Такая же проблема- нужен скелет на асемблере, что бы пакет хоть просто в сеть кинуть...
Кто может помочь, скиньте код. (at90can128)
Из моего проекта без к.л. обработки.
RG00 - регистр равный 0x00. RBXn - регистры из R16...R24.
Выключил автоматическую перепередачу при ошибках. При неподтверждении ACK передаю 3 раза (4 попытки).
Вопросы конечно будут ещё..
CODE
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, а файл прикрепить что-то не удаётся. Какие-то проблемы с прикреплением файлов.