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

📄 ltc.asm

📁 Source code for line followe Robot... aslo going to upload Schametic
💻 ASM
📖 第 1 页 / 共 2 页
字号:
flip_value:
	ldiw	Y, SensReg+6		;Get ceiling level
	clrw	A			;(= average of top 3 values)
	ld	BL, Y+			;
	ld	BH, Y+			;
	addw	A, B			;
	cpi	YL, SensReg+12		;
	brne	PC-5			;
	ldiw	B, 3			;
	 rcall	div16u			;/
	ldiw	Y, SensReg		;Flip top-bottom
	movw	T0L, AL			;
	lddw	B, Y+0			;
	subw	T0, B			;
	brcc	PC+3			;
	clrw	T0			;
	st	Y+, T0L			;
	st	Y+, T0H			;
	cpi	YL, SensReg+12		;
	brne	PC-11			;/
	ret

get_peak:
	ldiw	Y, SensReg
	lddw	C, Y+0		;Get peak value into DH:CL
	clrw	D		;
	cpi	CL, 40		;Error if peak is <40
	cpc	CH, _0		;
	retcs			;/
	clrw	T4		;Clear offset ratio
	ldd	BL, Y+12	;If peak is end of line, skip 3rd
	cpi	BL, 5		;
	breq	gp_df2		;
	cpi	BL, 0		;
	breq	gp_df2		;/
	lddw	A, Y+4		;If 3rd is less than 1/4 of peak, skip 3rd
	lslw	A		;
	lslw	A		;
	cpw	A, C		;
	brcs	gp_df2		;/
	ldd	BH, Y+16	;Error if 3rd is not next to peak
	sub	BH, BL		;
	brcc	PC+2		;
	neg	BH		;
	cpi	BH, 1		;
	retne			;/
	clrw	A		;Calcurate peak to 3rd ratio
	lddw	B, Y+4		;
	 rcall	div32u		;
	lsr	BL		;
	ror	AH		;
	sub	T4L, AH		;
	sbc	T4H, BL		;/
gp_df2:	lddw	A, Y+2		;If 2nd is less than 1/4 of peak, skip 2nd
	lslw	A		;
	lslw	A		;
	cpw	A, C		;
	brcs	gp_df3		;/
	ldd	BL, Y+12	;Error if 2nd is not next to peak
	ldd	BH, Y+14	;
	sub	BH, BL		;
	brcc	PC+2		;
	neg	BH		;
	cpi	BH, 1		;
	retne			;/
	clrw	A		;Calcurate peak to 2rd ratio
	lddw	B, Y+2		;
	 rcall	div32u		;
	lsr	BL		;
	ror	AH		;
	add	T4L, AH		;
	adc	T4H, BL		;/
gp_df3:	clr	AL		;Peak position to linear value
	ldd	AH, Y+12	;
	ldd	BL, Y+14	;
	cp	BL, AH		;
	brcc	PC+5		;
	comw	T4		;
	adc	T4L, _0		;
	adc	T4H, _0		;
	addw	A, T4		;/
	sez
	ret


disp_peak:
	breq	PC+4		;Exit if error
	ldiw	Z, m_error*2	;
	rjmp	dp_str		;/
	movw	T4L, AL
	ldi	AH, '0'		;Put scale
	mov	AL, AH		;
	 rcall	xmit		;
	ldiw	Z, m_rule1*2	;
	 rcall	dp_str		;
	inc	AH		;
	cpi	AH, '5'		;
	brne	PC-7		;
	mov	AL, AH		;
	 rcall	xmit		;
	ldiw	Z, m_crlf*2	;
	 rcall	dp_str		;/
	movw	AL, T4L		;Put marker
	ldi	BL, 32		;
	ldi	BH, 0		;
	 rcall	div16u		;
	mov	AH, AL		;
	subi	AH, 1		;
	brcs	PC+4		;
	ldi	AL, ' '		;
	 rcall	xmit		;
	rjmp	PC-4		;
	ldi	AL, '@'		;
	 rcall	xmit		;/
	ldiw	Z,m_crlf*2	;Put value
	 rcall	dp_str		;
	movw	AL, T4L		;
	ldi	CL, 5		;
	rjmp	dp_decu16	;/




disp_sens_regs:
	ldiw	Y, SensReg
ds_lp:	ldiw	Z, m_crlf*2	;CRLF
	 rcall	dp_str		;/
	ldd	AL, Y+12	;Channel#
	addi	AL, '0'		;
	 rcall	xmit		;/
	lddw	A, Y+0		;Value
	ldi	CL, 5		;
	 rcall	dp_decu16	;/
	 rcall	space		;" "
	lddw	A, Y+0		;Bar graph
	ldiw	B, 10		;
	 rcall	div16u		;
	mov	CL, AL		;
	ldi	AL, '#'		;
	 rcall	xmit		;
	subi	CL, 1		;
	brcc	PC-3		;/
	adiw	YL, 2		;Next channel
	cpi	YL, SensReg+12	;
	brne	ds_lp		;/
	ldiw	Z, m_crlf*2	;CRLF
	rjmp	dp_str		;/


scan_test:
	outi	TIMSK, (1<<TOIE0) ;Start acquisition
	cbr	_Flags, bit0	;
	sbic	PINB, MOSI	;Exit if any key is pressed
	rjmp	PC+5		;/
	sbrs	_Flags, 0	;Wait for end of a line scan
	rjmp	PC-3		;/
	dec	ZL		;Repeat ZL scans
	brne	PC-6		;/
	out	TIMSK, _0	;Stop acquisition
	outi	PORTD, -1	;/
	ret


;--------------------------------------;
; Calibration

do_cal:
	ldi	ZL, 3		;Scan 3 times
	 rcall	scan_test	;/
	 rcall	disp_sens_regs	;Display raw values

	ldiw	Y, SensReg	;Get minimum value into Z
	ldiw	Z, -1		;
	ld	AL, Y+		;
	ld	AH, Y+		;
	cpw	Z, A		;
	brcs	PC+2		;
	movw	ZL, AL		;
	cpi	YL, SensReg+12	;
	brne	PC-7		;/

	ldiw	Y, SensReg	;Create compensation table into ComVal
	clrw	A		;
	movw	BL, ZL		;
	ld	CL, Y+		;
	ld	CH, Y+		;
	clrw	D		;
	 rcall	div32u		;
	stdw	Y+34, A		;
	cpi	YL, SensReg+12	;
	brne	PC-11		;/

	 rcall	save_cal	;Save the compensation values into EEPROM

	ldi	ZL, 3		;Scan 3 times
	 rcall	scan_test	;/
	 rcall	comp_sens	;Display compensated values
	 rcall	disp_sens_regs	;/

	rjmp	monitor


comp_sens:
	ldiw	Y, SensReg
	lddw	A, Y+36	;ComVal[]
	lddw	B, Y+0	;SensReg[]
	movw	T4L, BL
	cpse	AH, _0
	 rcall	mulu1616
	st	Y+, T4L
	st	Y+, T4H
	cpi	YL, SensReg+12
	brne	PC-10
	ret


save_cal:
	ldiw	Z, eeComVal
	ldiw	Y, ComVal
	ldi	CL, 12
	rjmp	write_eeblk

save_gain:
	ldiw	Z, eeParms
	ldiw	Y, Parms
	ldi	CL, 3
	rjmp	write_eeblk

load_allparms:
	ldiw	Z, eeComVal
	ldiw	Y, ComVal
	ldi	CL, 12
	 rcall	read_eeblk
	ldiw	Z, eeParms
	ldiw	Y, Parms
	ldi	CL, 3
	rjmp	read_eeblk


write_eeblk:
	ld	AL, Y+
	 rcall	write_eep
	adiw	ZL, 1
	dec	CL
	brne	PC-4
	ret

read_eeblk:
	 rcall	read_eep
	st	Y+, AL
	adiw	ZL, 1
	dec	CL
	brne	PC-4
	ret

read_eep:
	outw	EEAR, Z
	sbi	EECR, EERE
	in	AL, EEDR
	ret

write_eep:
	outw	EEAR, Z
	out	EEDR, AL
	sbi	EECR, EEMWE
	sbi	EECR, EEWE
	sbic	EECR, EEWE
	rjmp	PC-1
	ret


;--------------------------------------;
; 儂僗僩偐傜 1峴擖椡
;
; Call: none
; Ret:  LineBuf

get_line:
	ldiw	X,LineBuf
rl_lp:	 rcall	receive
	st	X,AL
	cpi	AL,0x0d	; CR
	brne	PC+2
	rjmp	xmit
	cpi	AL,0x08	; BS
	brne	PC+7
	cpi	XL,low(LineBuf)
	breq	rl_lp
	 rcall	xmit
	sbiw	XL,1
	rjmp	rl_lp
	cpi	AL,' '		; SP
	brcs	rl_lp
	cpi	XL,low(LineBuf+31)
	breq	rl_lp
	 rcall	xmit
	adiw	XL,1
	rjmp	rl_lp

caps:	cpi	BH,'a'		; CAPS
	brcs	PC+2		; 
	subi	BH,0x20	; /
	ret


;--------------------------------------;
; ROM偺暥帤楍傪憲怣
; Send ROM string
;
; Call: Z = top of the string (ASCIZ)
; Ret:  Z = next string

dp_str:	lpm	AL, Z+
	tst	AL
	brne	PC+2
	ret
	 rcall	xmit
	rjmp	PC-5


;--------------------------------------;
; display byte value in hexdecimal

dp_byte:
	swap	AL
	 rcall	PC+2
	swap	AL
	push	AL
	andi	AL,0x0f
	cpi	AL,10
	brcs	PC+2
	subi	AL,-7
	subi	AL,-0x30
	 rcall	xmit
	pop	AL
	ret

;--------------------------------------;
; display value in decimal

dp_decu8:clr	AH		;8 bit entry
dp_decu16:			;16 bit entry
	clr	T0L		;digit counter
	inc	T0L		;---- decimal string generating loop
	clr	BL		;vaT0H /= 10;
	ldi	BH, 16		;
	lslw	A		;
	rol	BL		;
	cpi	BL, 10		;
	brcs	PC+3		;
	subi	BL, 10		;
	inc	AL		;
	dec	BH		;
	brne	PC-8		;/
	subi	BL,-'0'		;Push the remander (a decimal digit)
	push	BL		;/
	cp	AL, BH		;if(var =! 0) continue digit loop;
	cpc	AH, BH		;
	brne	PC-16		;/
	cp	T0L,CL		;Adjust string length
	brcc	PC+5		;
	inc	T0L		;
	ldi	AL,' '		;
	push	AL		;
	rjmp	PC-5		;/
	pop	AL		;Put decimal string
	 rcall	xmit		;<-- Put a char (vaT0L) to memory, console or any display device
	dec	T0L		;
	brne	PC-3		;/
	ret


;--------------------------------------;
; 16bit * 16bit multiply
; 
; Multiplyer:   AH:AL
; Multiplicand: BH:BL
; Result:       T4H:T2L
; Clk:		16

muls1616:
	clr	T0L
	sbrs	AH, 7
	rjmp	PC+6
	inc	T0L
	comw	A
	adc	AL, _0
	adc	AH, _0
	sbrs	BH, 7
	rjmp	PC+6
	inc	T0L
	comw	B
	adc	BL, _0
	adc	BH, _0
	bst	T0L, 0
	rjmp	PC+2
mulu1616:
	clt
	mul	BL, AL
	movw	T2L, T0L
	mul	BH, AH
	movw	T4L, T0L
	mul	BH, AL
	add	T2H, T0L
	adc	T4L, T0H
	adc	T4H, _0
	mul	BL, AH
	add	T2H, T0L
	adc	T4L, T0H
	adc	T4H, _0

	brtc	PC+9
	comw	T2
	comw	T4
	adc	T2L, _0
	adc	T2H, _0
	adc	T4L, _0
	adc	T4H, _0
	ret


;--------------------------------------;
; 16bit / 16bit unsigned division

div16u:	clrw	T0		; Call: AH:AL = dividend
	ldi	CL,16		;       BH:BL = divisor
	lslw	A		; Ret:  AH:AL = quotient
	rolw	T0		;       T0H:T0L   = surplus
	cpw	T0,B
	brcs	PC+4
	inc	AL
	subw	T0,B
	dec	CL
	brne	PC-11
	ret


;--------------------------------------;
; 32bit / 32bit unsigned division

div32u:	clrw	T0		; Call: BH:AL = dividend
	clrw	T2		;       DH:CL = divisor
	ldi	EH,32		; Ret:  BH:AL = quotient
	lslw	A		;       T2H:T0L   = surplus
	rolw	B
	rolw	T0
	rolw	T2
	cpw	T0,C
	cpcw	T2,D
	brcs	PC+6
	inc	AL
	subw	T0,C
	sbcw	T2,D
	dec	EH
	brne	PC-19
	ret


;--------------------------------------;
; 16恑悢暥帤楍偺抣傪庢摼
; Get hexdecimal value
;
; Call: X = string pointer
; Ret:  X = updated
;         if    C=1: error
;         elsif Z=1: end of line, value=0
;         else:      BL:AH:AL = 24bit value

get_valh:
	ldi	BL,0
	ldiw	A,0
	ld	BH,X+
	cpi	BH,' '
	brcs	gv_n
	breq	PC-3
	rjmp	PC+2
gv_l:	ld	BH,X+
	 rcall	caps
	cpi	BH,' '+1
	brcs	gv_e
	subi	BH,'0'
	brcs	gv_x
	cpi	BH,10
	brcs	PC+4
	subi	BH,7
	cpi	BH,10
	brcs	gv_x
	cpi	BH,16
	brcc	gv_x
	swap	BH
	ori	BH,0x0f
	lsl	BH
	rolw	A
	rol	BL
	cpi	BH,0xf0
	brne	PC-5
	rjmp	gv_l
gv_x:	sec
	sez
	ret
gv_e:	sbiw	XL,1
	clc
	clz
	ret
gv_n:	sbiw	XL,1
	clc
	sez
	ret


;--------------------------------------;
; 僗儁乕僗昞帵

space:
	ldi	AL,' '
	; must be followed by transmit routine

;--------------------------------------;
; ISP働乕僽儖巊梡偺僜僼僩僂僃傾UART
; Software implemented UART using ISP cable

.equ	BPS	= 62	; Bit delay time 38.4kbps @7.4MHz (Refer to UART.ASM)
.equ	MISO	= 4	; Change these value when use at 8 or 28 pin device.
.equ	MOSI	= 3	; /

xmit:	; Transmit AL. AL is broken
	push	AH
	push	BL
	com	AL
	cli
	sec			; Start bit
	ldi	BL,10		; bit count
	ldi	AH,BPS-1	; Wait for full bit time
	dec	AH		; 
	brne	PC-1		; /
	brcs	PC+2		; MISO = bit for send
	cbi	PORTB,MISO	; 
	brcc	PC+2		; 
	sbi	PORTB,MISO	; /
	lsr	AL		; next bit
	dec	BL		; All sent ?
	brne	PC-9		;  no, coutinue
	sei
	pop	BL
	pop	AH
	ret


receive:; Receive into AL. AH is broken
	ldi	AL,0x80	; Shift register for receive
	sbic	PINB,MOSI	; Wait for rise edge of MOSI
	rjmp	PC-1		; 
	sbis	PINB,MOSI	; 
	rjmp	PC-1		; /
	ldi	AH,BPS/2	; Wait for half bit time
	dec	AH		; 
	brne	PC-1		; /
	ldi	AH,BPS		; Wait for full bit time
	dec	AH		; 
	brne	PC-1		; /
	lsr	AL		; Next bit
	sbis	PINB,MOSI	; Read MOSI into AL.7
	ori	AL,0x80	; /
	brcc	PC-6		; All bits received?  no, continue
	ret			;                     yes, end



;----------------------------------------------------------;
; ROM撪暥帤楍


m_crlf:		.db	13, 10, 0, 0
m_error:	.db	13, "???", 0, 0
m_start:	.db	13, "LTC debug monitor R0.2", 13, 10, 10, "s1 <left> <right> - Test motor", 13, 10, "s2 - Test sensor", 13, 10, "s3 - Calibrate sensor", 13, 10, "ee0 - PWM base", 13, 10, "ee1 - P gain", 13, 10, "ee2 - D gain", 13, 10, 0
m_rule1:	.db	"-------",0

⌨️ 快捷键说明

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