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

📄 programroutines.asm

📁 The circuit is drawn for measurement of acceleration from –1000 mg until + 1000 mg. It can be place
💻 ASM
字号:
;------------------------------------------------------------------------------------------------------
;Name		:ProgramRoutines
;------------------------------------------------------------------------------------------------------
.cseg
.org		SegmentProgramRoutines
;------------------------------------------------------------------------------------------------------
UpdateInterruptFlag:											;Set InterruptFlag whenever interrupts
	ori		ProgramFlagRegister,SetInterruptFlag
	ret
;------------------------------------------------------------------------------------------------------
AccelerometterCalibration:										;calibrate the accelerometter
	ldi		TempRegisterB,_CALLIBRATION_TIMES
	ldi 	TempRegister,0x00
	clr		AccelerationZeroRegisterLow
	clr		AccelerationZeroRegisterHigh
AccelerometterCalibrationInLoop:
	out 	TCCR1B,TempRegister
	out 	TCNT1H,TempRegister
	out 	TCNT1L,TempRegister
Accelerometter1stEdge:											;Do 16 measurements and divide 
	sbic 	PIND,PinAccelerometter								;their summary with 16 (Average)
	rjmp 	Accelerometter1stEdge								
Accelerometter2ndEdge:
	sbis 	PIND,PinAccelerometter								;the average is the ZERO Acceleration
	rjmp 	Accelerometter2ndEdge
	ldi 	TempRegister,0x01
	out 	TCCR1B,TempRegister
	nop
	nop
	nop
	nop
	nop
	nop
Accelerometter3rdEdge:
	sbic 	PIND,PinAccelerometter
	rjmp 	Accelerometter3rdEdge
	clr 	TempRegister
	out 	TCCR1B,TempRegister
	in 		AccelerationTimeRegisterLow,TCNT1L
	in 		AccelerationTimeRegisterHigh,TCNT1H
	add 	AccelerationZeroRegisterLow,AccelerationTimeRegisterLow			
	adc 	AccelerationZeroRegisterHigh,AccelerationTimeRegisterHigh
	out 	TCNT1H,TempRegister
	out 	TCNT1L,TempRegister		
	ldi		TempRegister,_25_MSEC
	rcall 	Delaymsec
	dec 	TempRegisterB
	cpi 	TempRegisterB,0
	breq 	CallibrationDivision
	rjmp 	AccelerometterCalibrationInLoop
CallibrationDivision:
	sbrc 	AccelerationZeroRegisterLow,3
	ldi 	TempRegister,16
	add 	AccelerationZeroRegisterLow,TempRegister
	ldi 	TempRegister,4
CallibrationDivisionInLoop:
	lsr 	AccelerationZeroRegisterHigh
	ror 	AccelerationZeroRegisterLow
	dec 	TempRegister
	cpi 	TempRegister,0
	brne 	CallibrationDivisionInLoop
	ret
;------------------------------------------------------------------------------------------------------
UpdateLine1:													;Update LCD's line 1
	rcall	Line1
	ldi		ZH,High(2*MessageTime)								;write a standart message "TIME:"
	ldi		ZL,Low(2*MessageTime)
	rcall	LoadMessage
	mov		TempRegister,HourRegister							;and the current time counter
	rcall	UpdateCharacters
	mov		TempRegister,DisplayCharacterB
	rcall	LCDData
	mov		TempRegister,DisplayCharacterA
	rcall	LCDData
	ldi		TempRegister,_CHAR_UP_DOWN_DOT
	rcall	LCDData
	mov		TempRegister,MinuteRegister
	rcall	UpdateCharacters
	mov		TempRegister,DisplayCharacterB
	rcall	LCDData
	mov		TempRegister,DisplayCharacterA
	rcall	LCDData
	ldi		TempRegister,_CHAR_UP_DOWN_DOT
	rcall	LCDData
	mov		TempRegister,SecondRegister
	rcall	UpdateCharacters
	mov		TempRegister,DisplayCharacterB
	rcall	LCDData
	mov		TempRegister,DisplayCharacterA
	rcall	LCDData
	ret
;------------------------------------------------------------------------------------------------------
UpdateLine2:													;Update LCD's line 2
	rcall	Line2												;Check if the current acceleration measurement
	cpi		AccelerationTimeRegisterLow,127						;is positive or negative
	brlo	PossitiveAcceleration
NegativeAcceleration:
	ldi		ZH,High(2*MessageAccelerationMinus)					;write a standart message "Acc/tion:-"
	ldi		ZL,Low(2*MessageAccelerationMinus)
	rcall	LoadMessage											
	mov		TempRegister,AccelerationTimeRegisterLow
	subi	TempRegister,255
	mov		AccelerationTimeRegisterLow,TempRegister
	com		AccelerationTimeRegisterLow
	inc		AccelerationTimeRegisterLow
	rjmp	AccelerationMessageOk
PossitiveAcceleration:
	ldi		ZH,High(2*MessageAcceleration)						;write a standart message "Acc/tion:"
	ldi		ZL,Low(2*MessageAcceleration)
	rcall	LoadMessage
AccelerationMessageOk:
	rcall	MakeMeasurementInmg									;and the current acceleration measurement
	mov		TempRegister,AccelerationTimeRegisterLow
	rcall	UpdateCharacters
	ldi		TempRegister,_ASCII_0
	rcall	LCDData
	mov		TempRegister,DisplayCharacterC
	rcall	LCDData
	mov		TempRegister,DisplayCharacterB
	rcall	LCDData
	mov		TempRegister,DisplayCharacterA
	rcall	LCDData
	ldi		ZH,High(2*Messagemg)
	ldi		ZL,Low(2*Messagemg)
	rcall	LoadMessage
	ret
;------------------------------------------------------------------------------------------------------
AccelerometterMeasurement:										;acceleration measurement subroutine
	clr 	TempRegister										;measurement:
	out 	TCCR1B,TempRegister									;128-------------0--------------127
	out 	TCNT1H,TempRegister									;-1g------------0g--------------1g
	out 	TCNT1L,TempRegister
WaitForLowEdge1:
	sbic 	PIND,PinAccelerometter 
	rjmp 	WaitForLowEdge1
WaitForHighEdge2:
	sbis 	PIND,PinAccelerometter
	rjmp 	WaitForHighEdge2
	ldi 	TempRegister,1
	out 	TCCR1B,TempRegister			
	nop
	nop
	nop
	nop
	nop
	nop
WaitForHighEdge3:
	sbic 	PIND,PinAccelerometter
	rjmp 	WaitForHighEdge3
	clr 	TempRegister
	out 	TCCR1B,TempRegister
	in 		AccelerationTimeRegisterLow,TCNT1L
	in 		AccelerationTimeRegisterHigh,TCNT1H
	sub 	AccelerationTimeRegisterLow,AccelerationZeroRegisterLow
	sbc 	AccelerationTimeRegisterHigh,AccelerationZeroRegisterHigh
	rcall 	MakeMeasurementByte
	ret
;------------------------------------------------------------------------------------------------------
MakeMeasurementByte:											;Encode the 16bit measurement in abyte
	ldi 	TempRegister,0
	lsr 	AccelerationTimeRegisterHigh
	ror 	AccelerationTimeRegisterLow
	lsr 	AccelerationTimeRegisterHigh
	ror 	AccelerationTimeRegisterLow
	adc 	AccelerationTimeRegisterLow,TempRegister
	ret
;------------------------------------------------------------------------------------------------------
MakeMeasurementInmg:											;make the measurement in "mg"
	rcall	DivisionBy10
	rcall	MultiplicationResultWith8
	ret
;------------------------------------------------------------------------------------------------------
DivisionBy10:
	ldi		DelayRegisterB,_DIVISOR								;Divisor
	clr		TempRegisterB										;Remainder
	clr		TempRegister										;Result
DivisionInLoop1:
	add		TempRegisterB,DelayRegisterB
	inc		TempRegister
	cp		TempRegisterB,AccelerationTimeRegisterLow
	breq	NoRemainder
	brlo	DivisionInLoop1
	sub		TempRegisterB,DelayRegisterB
	dec		TempRegister
	sub		AccelerationTimeRegisterLow,TempRegisterB
WithRemainder:
	mov		TempRegisterB,AccelerationTimeRegisterLow
	cpi		TempRegisterB,6
	brlo	DivisionResults
	inc		TempRegister
DivisionResults:
	mov		AccelerationTimeRegisterLow,TempRegister
	ret
NoRemainder:
	clr		TempRegisterB
	rjmp	DivisionResults
;------------------------------------------------------------------------------------------------------
MultiplicationResultWith8:
	lsl		AccelerationTimeRegisterLow
	lsl		AccelerationTimeRegisterLow
	lsl		AccelerationTimeRegisterLow
	ret
;------------------------------------------------------------------------------------------------------
UpdateCharacters:												;find the BCD result
	clr		DisplayCharacterC
	clr		DisplayCharacterB
	clr 	DisplayCharacterA
CharacterC:
	cpi		TempRegister,100
	brlo	CharacterB
	inc		DisplayCharacterC
	subi	TempRegister,100
	rjmp	CharacterC
CharacterB:
	cpi		TempRegister,10
	brlo	CharacterA
	inc		DisplayCharacterB
	subi	TempRegister,10
	rjmp	CharacterB
CharacterA:
	cpi		TempRegister,1
	brlo	UpdateNumbers
	inc		DisplayCharacterA
	subi	TempRegister,1
	rjmp	CharacterA
UpdateNumbers:
	mov		TempRegister,DisplayCharacterC
	rcall	UpdateNumber
	mov		DisplayCharacterC,TempRegister
	mov		TempRegister,DisplayCharacterB
	rcall	UpdateNumber
	mov		DisplayCharacterB,TempRegister
	mov		TempRegister,DisplayCharacterA
	rcall	UpdateNumber
	mov		DisplayCharacterA,TempRegister
	ret
;------------------------------------------------------------------------------------------------------
UpdateNumber:													;find the ASCII characters for the LCD
	cpi		TempRegister,9
	breq	ItIsNumber9
	cpi		TempRegister,8
	breq	ItIsNumber8
	cpi		TempRegister,7
	breq	ItIsNumber7
	cpi		TempRegister,6
	breq	ItIsNumber6
	cpi		TempRegister,5
	breq	ItIsNumber5
	cpi		TempRegister,4
	breq	ItIsNumber4
	cpi		TempRegister,3
	breq	ItIsNumber3
	cpi		TempRegister,2
	breq	ItIsNumber2
	cpi		TempRegister,1
	breq	ItIsNumber1
ItIsNumber0:
	ldi		TempRegister,_NUMBER0
	ret
ItIsNumber9:
	ldi		TempRegister,_NUMBER9
	ret
ItIsNumber8:
	ldi		TempRegister,_NUMBER8
	ret
ItIsNumber7:
	ldi		TempRegister,_NUMBER7
	ret
ItIsNumber6:
	ldi		TempRegister,_NUMBER6
	ret
ItIsNumber5:
	ldi		TempRegister,_NUMBER5
	ret
ItIsNumber4:
	ldi		TempRegister,_NUMBER4
	ret
ItIsNumber3:
	ldi		TempRegister,_NUMBER3
	ret
ItIsNumber2:
	ldi		TempRegister,_NUMBER2
	ret
ItIsNumber1:
	ldi		TempRegister,_NUMBER1
	ret
;------------------------------------------------------------------------------------------------------
LoadMessage:													;call a string from flash memmory
	lpm
	tst		r0
	breq	LoadMessageEnd
	mov		TempRegister,r0
	rcall	LCDData
	adiw	ZL,1
	rjmp	LoadMessage
LoadMessageEnd:
	ret
;------------------------------------------------------------------------------------------------------
MessageAcceleration:
.db			"Acc/tion: ",0
;------------------------------------------------------------------------------------------------------
MessageAccelerationMinus:
.db			"Acc/tion:-",0
;------------------------------------------------------------------------------------------------------
MessageTime:
.db			"Time:   ",0
;------------------------------------------------------------------------------------------------------
Messagemg:
.db			"mg",0
;------------------------------------------------------------------------------------------------------


⌨️ 快捷键说明

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