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

📄 common.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 5 页
字号:
;             dw -> y+0
;          pnter -> R16,R17
	.even
_u32_Get::
	xcall push_gset1
	sbiw R28,4
	.dbline -1
	.dbline 314
; 	#endif
; }
; 
; u32 u32_Get(volatile u32 *pnter)
; {
	.dbline 321
; 	#ifdef CPU_eZ8
; 	return *pnter;								// read the value
; 	#endif
; 
; 	#ifdef CPU_ATmega128
; 	u32	dw;
; 	u8 savedSREG = SREG;						// keep interrupt setting
	in R20,0x3f
	.dbline 322
; 	Disable_Ints();								//
	cli
	.dbline 323
; 	dw = *pnter;								// read the value
	movw R30,R16
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 324
; 	SREG = savedSREG;							// restore interrupt setting
	out 0x3f,R20
	.dbline 325
; 	return dw;									//
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	.dbline -2
L11:
	adiw R28,4
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r savedSREG 20 c
	.dbsym l dw 0 l
	.dbsym r pnter 16 pl
	.dbend
	.dbfunc e EPROMWrite _EPROMWrite fV
;      savedSREG -> R20
;           Data -> R18
;           Addr -> R16,R17
	.even
_EPROMWrite::
	xcall push_gset1
	.dbline -1
	.dbline 334
; 	#endif
; }
; 
; // **************************************************************************
; 
; #ifdef CPU_ATmega128
; 
; void EPROMWrite(u16 Addr, u8 Data)
; {
	.dbline 337
; 	u8 savedSREG;
; 
; 	savedSREG = SREG;							// keep setting so the interrupt setting can be restored
	in R20,0x3f
	.dbline 338
; 	Disable_Ints();								//
	cli
	.dbline 340
L13:
	.dbline 340
L14:
	.dbline 340
L16:
	.dbline 340
; 												//
; 	for (; bit_is_set(EECR, EEWE); );			// wait for previous write to finish
	sbic 0x1c,1
	rjmp L13
	.dbline 341
; 	EEAR = Addr;								// set address
	out 0x1f,R17
	out 0x1e,R16
	.dbline 342
; 	EEDR = Data;								// set data
	out 0x1d,R18
	.dbline 343
; 	sbi(EECR, EEMWE);							// set "write enable" bit
	sbi 0x1c,2
	.dbline 344
; 	sbi(EECR, EEWE);							// set "write" bit
	sbi 0x1c,1
	.dbline 346
; 												//
; 	SREG = savedSREG;							// restore SREG - ie, the CLI/SEI state
	out 0x3f,R20
	.dbline 347
; 	EEAR = 0;									//
	clr R2
	clr R3
	out 0x1f,R3
	out 0x1e,R2
	.dbline -2
L12:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r savedSREG 20 c
	.dbsym r Data 18 c
	.dbsym r Addr 16 s
	.dbend
	.dbfunc e EPROMRead _EPROMRead fc
;           Addr -> R16,R17
	.even
_EPROMRead::
	.dbline -1
	.dbline 351
; }
; 
; u8 EPROMRead(u16 Addr)
; {
	.dbline 352
L18:
	.dbline 352
L19:
	.dbline 352
L21:
	.dbline 352
; 	for (; bit_is_set(EECR, EEWE); );			// wait for previous write to finish
	sbic 0x1c,1
	rjmp L18
	.dbline 353
; 	EEAR = Addr;								// set address
	out 0x1f,R17
	out 0x1e,R16
	.dbline 354
; 	sbi(EECR, EERE);							// set "read enable" bit
	sbi 0x1c,0
	.dbline 355
; 	EEAR = 0;									//
	clr R2
	clr R3
	out 0x1f,R3
	out 0x1e,R2
	.dbline 356
; 	return (u8)EEDR;							// return the EEPROM byte
	in R16,0x1d
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbsym r Addr 16 s
	.dbend
	.dbfunc e EPROMWrite_Data _EPROMWrite_Data fV
;              c -> R20
;            crc -> R22,R23
;            len -> R10,R11
;            src -> R12,R13
;           Addr -> R14,R15
	.even
_EPROMWrite_Data::
	xcall push_gset5
	movw R12,R18
	movw R14,R16
	ldd R10,y+10
	ldd R11,y+11
	.dbline -1
	.dbline 360
; }
; 
; void EPROMWrite_Data(u16 Addr, u8 *src, u16 len)
; {
	.dbline 364
; 	u8	c;
; 	u16	crc;
; 
; 	if (!src)											//
	tst R12
	brne L23
	tst R13
	brne L23
X1:
	.dbline 365
; 	{													// fill with '0'
	.dbline 366
	xjmp L28
L25:
	.dbline 366
	clr R18
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMWrite
L26:
	.dbline 366
	movw R24,R10
	sbiw R24,1
	movw R10,R24
L28:
	.dbline 366
; 		for (; len; len--) EPROMWrite(Addr++, 0);		// data
	tst R10
	brne L25
	tst R11
	brne L25
X2:
	.dbline 367
; 		EPROMWrite(Addr++, 0xff);						// crc LS-Byte
	ldi R18,255
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMWrite
	.dbline 368
; 		EPROMWrite(Addr, 0xff);							// crc MS-Byte
	ldi R18,255
	movw R16,R14
	xcall _EPROMWrite
	.dbline 369
; 		return;											//
	xjmp L22
L23:
	.dbline 372
; 	}
; 
; 	crc = 0xffff;										// init crc
	ldi R22,65535
	ldi R23,255
	.dbline 373
; 	crc = UpdateFCS_16(crc, 10);						// update crc
	ldi R18,10
	movw R16,R22
	xcall _UpdateFCS_16
	.dbline 374
; 	crc = UpdateFCS_16(crc, (u8)(len & 0xff));			// update crc
	mov R18,R10
	andi R19,0
	xcall _UpdateFCS_16
	.dbline 375
; 	crc = UpdateFCS_16(crc, (u8)(len >> 8));			// update crc
	movw R18,R10
	mov R18,R19
	clr R19
	xcall _UpdateFCS_16
	movw R22,R16
	.dbline 376
; 	for (; len; len--)									//
	xjmp L32
L29:
	.dbline 377
	.dbline 378
	movw R30,R12
	ld R20,Z+
	movw R12,R30
	.dbline 379
	mov R18,R20
	movw R16,R22
	xcall _UpdateFCS_16
	movw R22,R16
	.dbline 380
	mov R18,R20
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMWrite
	.dbline 381
L30:
	.dbline 376
	movw R24,R10
	sbiw R24,1
	movw R10,R24
L32:
	.dbline 376
	tst R10
	brne L29
	tst R11
	brne L29
X3:
	.dbline 382
; 	{													//
; 		c = *src++;										// get byte
; 		crc = UpdateFCS_16(crc, c);						// update crc
; 		EPROMWrite(Addr++, c);							// save it into the eeprom
; 	}													//
; 	crc = ~crc;											// finalize the crc
	com R22
	com R23
	.dbline 383
; 	EPROMWrite(Addr++, (u8)(crc & 0xff));				// save LS-Byte of crc
	mov R18,R22
	andi R19,0
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMWrite
	.dbline 384
; 	EPROMWrite(Addr++, (u8)(crc >> 8));					// save MS-Byte of crc
	movw R18,R22
	mov R18,R19
	clr R19
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMWrite
	.dbline -2
L22:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r c 20 c
	.dbsym r crc 22 s
	.dbsym r len 10 s
	.dbsym r src 12 pc
	.dbsym r Addr 14 s
	.dbend
	.dbfunc e EPROMRead_Data _EPROMRead_Data fc
;           crc2 -> R10,R11
;              i -> R14,R15
;              c -> R22
;              j -> R12,R13
;           crc1 -> R20,R21
;            len -> y+16
;           dest -> y+14
;           Addr -> y+12
	.even
_EPROMRead_Data::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,2
	.dbline -1
	.dbline 388
; }
; 
; bool EPROMRead_Data(u16 Addr, u8 *dest, u16 len)
; {
	.dbline 393
; 	u8	c;
; 	u16	i, j;
; 	u16	crc1, crc2;
; 
; 	if (!dest) return false;
	ldd R0,y+14
	ldd R1,y+15
	tst R0
	brne L34
	tst R1
	brne L34
X4:
	.dbline 393
	clr R16
	xjmp L33
L34:
	.dbline 396
; 
; 	// first check the data is valid
; 	crc1 = 0xffff;										// init crc
	ldi R20,65535
	ldi R21,255
	.dbline 397
; 	crc1 = UpdateFCS_16(crc1, 10);						// update crc
	ldi R18,10
	movw R16,R20
	xcall _UpdateFCS_16
	.dbline 398
; 	crc1 = UpdateFCS_16(crc1, (u8)(len & 0xff));		// update crc
	ldd R18,y+16
	ldd R19,y+17
	andi R19,0
	xcall _UpdateFCS_16
	.dbline 399
; 	crc1 = UpdateFCS_16(crc1, (u8)(len >> 8));			// update crc
	ldd R18,y+16
	ldd R19,y+17
	mov R18,R19
	clr R19
	xcall _UpdateFCS_16
	movw R20,R16
	.dbline 400
; 	i = Addr;											// eeprom address to read from
	ldd R14,y+12
	ldd R15,y+13
	.dbline 401
; 	for (j = len; j; j--)								//
	ldd R12,y+16
	ldd R13,y+17
	xjmp L39
L36:
	.dbline 402
	.dbline 403
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMRead
	mov R22,R16
	.dbline 404
	mov R18,R22
	movw R16,R20
	xcall _UpdateFCS_16
	movw R20,R16
	.dbline 405
L37:
	.dbline 401
	movw R24,R12
	sbiw R24,1
	movw R12,R24
L39:
	.dbline 401
	tst R12
	brne L36
	tst R13
	brne L36
X5:
	.dbline 406
; 	{													//
; 		c = EPROMRead(i++);								// read byte from eeprom
; 		crc1 = UpdateFCS_16(crc1, c);					// update crc
; 	}													//
; 	crc1 = ~crc1;										// finalize the crc
	com R20
	com R21
	.dbline 407
; 	crc2 = (u16)EPROMRead(i++);							// read LS-Byte of crc
	movw R2,R14
	movw R24,R2
	adiw R24,1
	movw R14,R24
	movw R16,R2
	xcall _EPROMRead
	mov R10,R16
	clr R11
	.dbline 408
; 	crc2 |= ((u16)EPROMRead(i)) << 8;					// read MS-Byte of crc
	movw R16,R14
	xcall _EPROMRead
	mov R2,R16
	clr R3
	mov R3,R2
	clr R2
	or R10,R2
	or R11,R3
	.dbline 409
; 	if (crc1 != crc2)									//
	cp R20,R10
	cpc R21,R11
	breq L45
	.dbline 410
; 	{													//
	.dbline 411
; 		memset(dest, 0, len);							//
	ldd R0,y+16
	ldd R1,y+17
	std y+1,R1
	std y+0,R0
	clr R18
	clr R19
	ldd R16,y+14
	ldd R17,y+15
	xcall _memset
	.dbline 412
; 		return false;									// data is invalid
	clr R16
	xjmp L33
X6:
	.dbline 416
L42:
	.dbline 416
	ldd R2,y+12
	ldd R3,y+13
	movw R24,R2
	adiw R24,1
	std y+13,R25
	std y+12,R24
	movw R16,R2
	xcall _EPROMRead
	mov R2,R16
	ldd R30,y+14
	ldd R31,y+15
	st Z+,R2
	std y+15,R31
	std y+14,R30
L43:
	.dbline 416
	ldd R24,y+16
	ldd R25,y+17
	sbiw R24,1
	std y+17,R25
	std y+16,R24
L45:
	.dbline 416
; 	}													//
; 
; 	// go get the data from the eeprom
; 	for (; len; len--) *dest++ = EPROMRead(Addr++);		// read byte from eeprom
	ldd R0,y+16
	ldd R1,y+17
	tst R0
	brne L42
	tst R1
	brne L42
X7:
	.dbline 418
; 														//
; 	return true;										// data is valid
	ldi R16,1
	.dbline -2
L33:
	adiw R28,2
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r crc2 10 s
	.dbsym r i 14 s
	.dbsym r c 22 c
	.dbsym r j 12 s
	.dbsym r crc1 20 s
	.dbsym l len 16 s
	.dbsym l dest 14 pc
	.dbsym l Addr 12 s
	.dbend
	.dbfunc e Set_UnitID _Set_UnitID fV
;         UnitID -> y+2
;              i -> R22,R23
;              s -> R20,R21
	.even
_Set_UnitID::
	xcall push_gset2
	movw R20,R16
	sbiw R28,34
	.dbline -1
	.dbline 429
; }
; 
; #endif
; 
; // *********************************************************************************
; // set/get the unit id
; 
; #ifdef CPU_ATmega128
; 
; void Set_UnitID(char *s)
; {
	.dbline 434
; 	int i;
; 
; 	char	UnitID[Unit_ID_Len];
; 
; 	if (!s)															//
	cpi R20,0
	cpc R20,R21
	brne L47
X8:
	.dbline 435
; 	{																//
	.dbline 436
; 		EPROMWrite_Data((u16)&Unit_ID, 0, Unit_ID_Len);				//
	ldi R24,32
	ldi R25,0
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	ldi R16,<_Unit_ID
	ldi R17,>_Unit_ID
	xcall _EPROMWrite_Data
	.dbline 437
; 		return;														//
	xjmp L46
L47:
	.dbline 440
; 	}																//
; 
; 	memset(UnitID, 0, Unit_ID_Len);									//
	ldi R24,32
	ldi R25,0
	std y+1,R25
	std y+0,R24
	clr R18
	clr R19
	movw R16,R28
	subi R16,254  ; offset = 2
	sbci R17,255
	xcall _memset
	.dbline 441
; 	i = strlen(s);													//
	movw R16,R20
	xcall _strlen
	movw R22,R16
	.dbline 442
; 	if (i >= Unit_ID_Len) i = Unit_ID_Len - 1;						//
	cpi R16,32
	ldi R30,0
	cpc R17,R30
	brlt L49
	.dbline 442
	ldi R22,31
	ldi R23,0
L49:
	.dbline 443
; 	strncpy(UnitID, s, i);											//
	std y+1,R23
	std y+0,R22
	movw R18,R20
	movw R16,R28
	subi R16,254  ; offset = 2
	sbci R17,255
	xcall _strncpy
	.dbline 444
; 	EPROMWrite_Data((u16)&Unit_ID, (u8*)UnitID, Unit_ID_Len);		// write it to eeprom
	ldi R24,32
	ldi R25,0
	std y+1,R25
	std y+0,R24
	movw R18,R28
	subi R18,254  ; offset = 2
	sbci R19,255
	ldi R16,<_Unit_ID
	ldi R17,>_Unit_ID
	xcall _EPROMWrite_Data
	.dbline -2
L46:
	adiw R28,34
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l UnitID 2 A[32:32]c
	.dbsym r i 22 I
	.dbsym r s 20 pc
	.dbend
	.dbfunc e Get_UnitID _Get_UnitID fc
;            buf -> R20,R21
	.even
_Get_UnitID::
	xcall push_gset1
	movw R20,R16
	sbiw R28,2
	.dbline -1
	.dbline 448
; }
; 
; bool Get_UnitID(char *buf)
; {
	.dbline 449
; 	return EPROMRead_Data((u16)&Unit_ID, (u8*)buf, Unit_ID_Len);	//
	ldi R24,32

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -