⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb90s23x3.lst

📁 单片机AT90S系列 制作简易USB接口(软件模拟,无usb硬件)。asm源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -