📄 usb90s23x3.lst
字号:
000028 3023 cpi temp2,3 ;ak boli uz 3 pretecenia
000029 953a dec temp1 ;tak uber posledny bit
00002a f059 breq EndInfraSampling ;a skonci so samplovanim
00002b cfe6 rjmp StartTSOPsampling ;a zacni odznova (pozor: MAXINFRALENGTH musi byt parne cislo !!!)
NoTSOPoverflow:
00002c 99b2 sbic TSOPPort,TSOPPin ;ak je TSOPPin v jednotke
00002d cfe9 rjmp WaitForTOSOP0 ;tak cakaj na nulu
;inak cakaj na jednotku
CheckWaitForTOSOP1:
00002e b748 in temp0,TIFR ;odchyt flag pretecenia citaca
00002f fd41 sbrc temp0,TOV0 ;ak pretiekol
000030 c005 rjmp EndInfraSampling ;tak skonci so samplovanim
000031 cfe2 rjmp WaitForTOSOP1 ;inak cakaj na zmenu stavu
CheckWaitForTOSOP0:
000032 b748 in temp0,TIFR ;odchyt flag pretecenia citaca
000033 fd41 sbrc temp0,TOV0 ;ak pretiekol
000034 c001 rjmp EndInfraSampling ;tak skonci so samplovanim
000035 cfe1 rjmp WaitForTOSOP0 ;inak cakaj na zmenu stavu
EndInfraSampling:
000036 ffb0 sbrs InfraBufferFull,0 ;ak je infra buffer plny - tak neukladaj hlavicku
000037 fc30 sbrc RAMread,0 ;ak RAMread=1 cita sa z RAM
000038 c010 rjmp EndTSOPSampling ;potom neukladaj hlavicku
000039 3020 cpi temp2,0 ;ak nebolo nejake pretecenie
00003a f011 breq NoOverflow ;tak nic nerob
00003b 2f23 mov temp2,temp1 ;inak zaznamenaj offset
00003c e234 ldi temp1,MAXINFRALENGTH ;a maximalnu dlzku buffera
NoOverflow:
00003d 9330 007c sts InfraBufferBegin,temp1 ;dlzku kodu na zaciatok Infra buffera
00003f 3033 cpi temp1,3 ;zisti ci je dlzka kodu aspon 3
000040 9130 007d lds temp1,InfraBufferBegin+1;nacitaj pocitadlo infra kodov
000042 f010 brcs NoIncrementCodeCounter ;ak je dlzka kodu vacsia alebo rovna 3
000043 9533 inc temp1 ;tak zvys pocitadlo infra kodov
000044 e0b1 ldi InfraBufferFull,1 ;a nastav plnost buffera
NoIncrementCodeCounter:
000045 9330 007d sts InfraBufferBegin+1,temp1;uloz nove pocitadlo infra kodov
000047 9320 007e sts InfraBufferBegin+2,temp2;uloz offset zaciatku buffera
EndTSOPSampling:
000049 911f pop temp3
00004a 912f pop temp2
00004b 913f pop temp1
00004c ef4f ldi temp0,0xFF ;napln temp0 hodnotou 0xFF (ukoncovaci znak)
00004d b94c out UDR,temp0 ;a vysli ukoncovaci znak na UART
00004e be4f out SREG,backupSREGTimer ;obnova SREG (a sucasne povolenie interruptu)
00004f d0e0 rcall InitCounter ;restartni citac na TSOP zmenu a zakaz interrupt
000050 914f pop temp0
000051 9518 reti
;********************************************************************
;* Init program
;********************************************************************
;------------------------------------------------------------------------------------------
reset: ;inicializacia procesora a premennych na spravne hodnoty
000052 ec48 ldi temp0,StackBegin ;inicializacia stacku
000053 bf4d out SPL,temp0
000054 27bb clr XH ;Infra pointer
000055 27dd clr YH ;USB pointer
000056 27ff clr ZH ;ROM pointer
000057 93d0 007c sts InfraBufferBegin,YH ;znuluj dlzky Infra kodu v bufferi
000059 93d0 007d sts InfraBufferBegin+1,YH ;znuluj pocitadlo infra kodov v bufferi
00005b 24ee clr MyUpdatedAddress ;nova adresa USB - nedekodovana
00005c d123 rcall InitACKBufffer ;inicializacia ACK buffera
00005d d134 rcall InitNAKBufffer ;inicializacia NAK buffera
00005e d0c8 rcall USBReset ;inicializacia USB adresy
00005f 9ac2 sbi TSOPpullupPort,TSOPpin ;nahodit pull-up na TSOP vstupe
000060 e648 ldi temp0,(1<<LEDlsb0)+(1<<LEDlsb1)+(1<<LEDlsb2)
000061 bb42 out LEDPortLSB,temp0 ;nahodit pull-up na vsetkych LED vstupoch LSB
000062 ef48 ldi temp0,(1<<LEDmsb3)+(1<<LEDmsb4)+(1<<LEDmsb5)+(1<<LEDmsb6)+(1<<LEDmsb7)
000063 bb48 out LEDPortMSB,temp0 ;nahodit pull-up na vsetkych LED vstupoch MSB
000064 9a90 sbi PORTD,0 ;nahodit pull-up na RxD vstupe
000065 e04c ldi temp0,BaudRate ;nastavitvysielaciu rychlost UART-u
000066 b949 out UBRR,temp0
000067 9a53 sbi UCR,TXEN ;povolit vysielanie UART-u
000068 9a54 sbi UCR,RXEN ;povolit prijimanie UART-u
000069 e04f ldi temp0,0x0F ;INT0 - reagovanie na nabeznu hranu
00006a bf45 out MCUCR,temp0 ;
00006b e440 ldi temp0,1<<INT0 ;povolit externy interrupt INT0
00006c bf4b out GIMSK,temp0
00006d d0c2 rcall InitCounter ;inicializacia citaca na TSOP zmenu
;------------------------------------------------------------------------------------------
;********************************************************************
;* Main program
;********************************************************************
00006e 9478 sei ;povolit interrupty globalne
Main:
00006f 9bb0 sbis inputport,DATAminus ;cakanie az sa zmeni D- na 0
000070 c005 rjmp CheckUSBReset ;a skontroluj, ci to nie je USB reset
000071 3002 cpi ActionFlag,DoReceiveSetupData
000072 f069 breq ProcReceiveSetupData
000073 3003 cpi ActionFlag,DoPrepareOutContinuousBuffer
000074 f041 breq ProcPrepareOutContinuousBuffer
000075 cff9 rjmp Main
CheckUSBReset:
000076 ef4f ldi temp0,255 ;pocitadlo trvania reset-u (podla normy je to cca 10ms - tu je to cca 100us)
WaitForUSBReset:
000077 99b0 sbic inputport,DATAminus ;cakanie az sa zmeni D+ na 0
000078 cff6 rjmp Main
000079 954a dec temp0
00007a f7e1 brne WaitForUSBReset
00007b d0ab rcall USBReset
00007c cff2 rjmp Main
ProcPrepareOutContinuousBuffer:
00007d d300 rcall PrepareOutContinuousBuffer ;priprav pokracovanie odpovede do buffera
00007e e004 ldi ActionFlag,DoReadySendAnswer
00007f cfef rjmp Main
ProcReceiveSetupData:
000080 e6c0 ldi USBBufptrY,InputBufferBegin ;pointer na zaciatok prijimacieho buffera
000081 2d6c mov ByteCount,InputBufferLength ;dlzka vstupneho buffera
000082 d125 rcall DecodeNRZI ;prevod kodovania NRZI na bity
000083 d1a8 rcall MirrorInBufferBytes ;prehodit poradie bitov v bajtoch
000084 d133 rcall BitStuff ;odstranenie bit stuffing
000085 d1b8 rcall CheckCRCIn ;kontrola CRC
000086 d21f rcall PrepareUSBOutAnswer ;pripravenie odpovede do vysielacieho buffera
000087 e004 ldi ActionFlag,DoReadySendAnswer
000088 cfe6 rjmp Main
;********************************************************************
;* Main program END
;********************************************************************
;------------------------------------------------------------------------------------------
;********************************************************************
;* Interrupt0 interrupt handler
;********************************************************************
INT0Handler: ;prerusenie INT0
000089 b65f in backupSREG,SREG
00008a 934f push temp0
00008b 933f push temp1
00008c e043 ldi temp0,3 ;pocitadlo trvania log0
00008d e032 ldi temp1,2 ;pocitadlo trvania log1
;cakanie na zaciatok paketu
CheckchangeMinus:
00008e 9bb0 sbis inputport,DATAminus ;cakanie az sa zmeni D- na 1
00008f cffe rjmp CheckchangeMinus
CheckchangePlus:
000090 9bb1 sbis inputport,DATAplus ;cakanie az sa zmeni D+ na 1
000091 cffe rjmp CheckchangePlus
DetectSOPEnd:
000092 9bb1 sbis inputport,DATAplus
000093 c005 rjmp Increment0 ;D+ =0
Increment1:
000094 e043 ldi temp0,3 ;pocitadlo trvania log0
000095 953a dec temp1 ;kolko cyklov trvala log1
000096 0000 nop
000097 f099 breq USBBeginPacket ;ak je to koniec SOP - prijimaj paket
000098 cff9 rjmp DetectSOPEnd
Increment0:
000099 e032 ldi temp1,2 ;pocitadlo trvania log1
00009a 954a dec temp0 ;kolko cyklov trvala log0
00009b 0000 nop
00009c f7a9 brne DetectSOPEnd ;ak nenastal SOF - pokracuj
00009d c007 rjmp EndInt0HandlerPOP2
EndInt0Handler:
00009e 906f pop ACC
00009f 91af pop InfraBufptrX
0000a0 911f pop temp3
0000a1 912f pop temp2
EndInt0HandlerPOP:
0000a2 91cf pop USBBufptrY
0000a3 916f pop ByteCount
0000a4 2d52 mov bitcount,backupbitcount ;obnova bitcount registra
EndInt0HandlerPOP2:
0000a5 913f pop temp1
0000a6 914f pop temp0
0000a7 be5f out SREG,backupSREG
0000a8 e480 ldi shiftbuf,1<<INTF0 ;znulovat flag interruptu INTF0
0000a9 bf8a out GIFR,shiftbuf
0000aa 9518 reti ;inak skonci (bol iba SOF - kazdu milisekundu)
USBBeginPacket:
0000ab 2e25 mov backupbitcount,bitcount ;zaloha bitcount registra
0000ac b386 in shiftbuf,inputport ;ak ano nacitaj ho ako nulty bit priamo do shift registra
USBloopBegin:
0000ad 936f push ByteCount ;dalsia zaloha registrov (setrenie casu)
0000ae 93cf push USBBufptrY
0000af e056 ldi bitcount,6 ;inicializacia pocitadla bitov v bajte
0000b0 e06e ldi ByteCount,MAXUSBBYTES ;inicializacia max poctu prijatych bajtov v pakete
0000b1 e6ce ldi USBBufptrY,InputShiftBufferBegin ;nastav vstupny buffer
USBloop1_6:
0000b2 b376 in inputbuf,inputport
0000b3 7073 cbr inputbuf,USBpinmask ;odmaskovat spodne 2 bity
0000b4 f0a1 breq USBloopEnd ;ak su nulove - koniec USB packetu
0000b5 9577 ror inputbuf ;presun Data+ do shift registra
0000b6 1f88 rol shiftbuf
0000b7 955a dec bitcount ;zmensi pocitadlo bitov
0000b8 f7c9 brne USBloop1_6 ;ak nie je nulove - opakuj naplnanie shift registra
0000b9 0000 nop ;inak bude nutne skopirovat shift register bo buffera
USBloop7:
0000ba b376 in inputbuf,inputport
0000bb 7073 cbr inputbuf,USBpinmask ;odmaskovat spodne 2 bity
0000bc f061 breq USBloopEnd ;ak su nulove - koniec USB packetu
0000bd 9577 ror inputbuf ;presun Data+ do shift registra
0000be 1f88 rol shiftbuf
0000bf e057 ldi bitcount,7 ;inicializacia pocitadla bitov v bajte
0000c0 9389 st Y+,shiftbuf ;skopiruj shift register bo buffera a zvys pointer do buffera
USBloop0: ;a zacni prijimat dalsi bajt
0000c1 b386 in shiftbuf,inputport ;nulty bit priamo do shift registra
0000c2 7083 cbr shiftbuf,USBpinmask ;odmaskovat spodne 2 bity
0000c3 f029 breq USBloopEnd ;ak su nulove - koniec USB packetu
0000c4 955a dec bitcount ;zmensi pocitadlo bitov
0000c5 0000 nop ;
0000c6 956a dec ByteCount ;ak sa nedosiahol maximum buffera
0000c7 f751 brne USBloop1_6 ;tak prijimaj dalej
0000c8 cfd9 rjmp EndInt0HandlerPOP ;inak opakuj od zaciatku
USBloopEnd:
0000c9 37c1 cpi USBBufptrY,InputShiftBufferBegin+3 ;ak sa neprijali aspon 3 byte
0000ca f2b8 brcs EndInt0HandlerPOP ;tak skonci
0000cb 9140 006e lds temp0,InputShiftBufferBegin+0 ;identifikator paketu do temp0
0000cd 9130 006f lds temp1,InputShiftBufferBegin+1 ;adresa do temp1
0000cf f469 brne TestDataPacket ;ak je dlzka ina ako 3 - tak to moze byt iba DataPaket
TestIOPacket:
0000d0 153f cp temp1,MyAddress ;ak to nie je urcene (adresa) pre mna
0000d1 f459 brne TestDataPacket ;tak to moze byt este Data Packet
TestSetupPacket:;test na SETUP paket
0000d2 3742 cpi temp0,nNRZISETUPPID
0000d3 f411 brne TestOutPacket ;ak nie je Setup PID - dekoduj iny paket
0000d4 e091 ldi State,SetupState
0000d5 cfcc rjmp EndInt0HandlerPOP ;ak je Setup PID - prijimaj nasledny Data paket
TestOutPacket: ;test na OUT paket
0000d6 3540 cpi temp0,nNRZIOUTPID
0000d7 f411 brne TestInPacket ;ak nie je Out PID - dekoduj iny paket
0000d8 e093 ldi State,OutState
0000d9 cfc8 rjmp EndInt0HandlerPOP ;ak je Out PID - prijimaj nasledny Data paket
TestInPacket: ;test na IN paket
0000da 344e cpi temp0,nNRZIINPID
0000db f409 brne TestDataPacket ;ak nie je In PID - dekoduj iny paket
0000dc c00a rjmp AnswerToInRequest
TestDataPacket: ;test na DATA0 a DATA1 paket
0000dd 3248 cpi temp0,nNRZIDATA0PID
0000de f011 breq Data0Packet ;ak nie je Data0 PID - dekoduj iny paket
0000df 3346 cpi temp0,nNRZIDATA1PID
0000e0 f421 brne NoMyPacked ;ak nie je Data1 PID - dekoduj iny paket
Data0Packet:
0000e1 3091 cpi State,SetupState ;ak bol stav Setup
0000e2 f081 breq ReceiveSetupData ;prijmi ho
0000e3 3093 cpi State,OutState ;ak bol stav Out
0000e4 f0b1 breq ReceiveOutData ;prijmi ho
NoMyPacked:
0000e5 e090 ldi State,BaseState ;znuluj stav
0000e6 cfbb rjmp EndInt0HandlerPOP ;a prijimaj nasledny Data paket
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -