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

📄 ispasm.s

📁 使用ATTiny26的USBasp,简单AVR编程软件
💻 S
字号:
#include <avr/io.h>
#include "clock.h"
#include "isp.h"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.global	wait64us	;rcall 4ck count1031ck=64.4375us
wait64us:
	mov r0,r1	;1ck
_wait64usloop:
	dec r0	;1ck
	breq _ret	;1ck+1ck
	rjmp _wait64usloop ;2ck

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SLOW 16MHz fck/16/1035 966Hz SCK 可能也不正确,至少1M时钟正常
;FAST 16MHz fck/16/4 250kHz SCK 好象并不正确4M时钟都通信失败。
_ispT:
	ldi r21,(1<<USIOIF)
	out _SFR_IO_ADDR(USISR),r21
	ldi r21,(1<<USIWM0)+(1<<USICS1)+(1<<USICLK)+(1<<USITC)			;
#ifdef selectFAST
	sbic _SFR_IO_ADDR(PINA),selectFAST
	rjmp _SPI_loop
_slowSPI_loop:
	out  _SFR_IO_ADDR(USICR),r21	;1
	rcall wait64us
	sbis _SFR_IO_ADDR(USISR),USIOIF		;1
	rjmp _slowSPI_loop
	ret
#endif
_SPI_loop:
	out  _SFR_IO_ADDR(USICR),r21	;1
	sbis _SFR_IO_ADDR(USISR),USIOIF		;1
	rjmp _SPI_loop
	ret
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
.global	ispTransmit32
ispTransmit32:
;  push r21
  out	_SFR_IO_ADDR(USIDR), r22	;低位先
  rcall  _ispT				;
  in	r22,_SFR_IO_ADDR(USIDR)		;
  out	_SFR_IO_ADDR(USIDR), r23	;
  rcall  _ispT				;
  in	r23,_SFR_IO_ADDR(USIDR)		;
  out	_SFR_IO_ADDR(USIDR), r24	;
  rcall  _ispT				;
  in	r24,_SFR_IO_ADDR(USIDR)		;
  out	_SFR_IO_ADDR(USIDR), r25	;
  rcall  _ispT				;
  in	r25,_SFR_IO_ADDR(USIDR)		;
;  pop r21
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispEnterProgrammingMode()
.global	ispEnterProgrammingMode
ispEnterProgrammingMode:
	ldi r22,lo8(31)
	mov r11,r22
_count_loop:
	ldi r22,0xAC;
	ldi r23,0x53;
;	ldi r24,0;
;	ldi r25,0
	rcall ispTransmit32
	subi r24,lo8(83);0x53 cpi r24,0x53
	breq _ret	;return 0
	sbi _SFR_IO_ADDR(ISP_OUT),ISP_SCK	;ISP_OUT |= (1 << ISP_SCK);ISP_SCK? ISP_RST?
	rcall wait64us;
	cbi _SFR_IO_ADDR(ISP_OUT),ISP_SCK	;ISP_OUT &= ~(1 << ISP_SCK);
	rcall wait64us;
	dec r11
	brne _count_loop
_epmret:
_ret:
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;uchar ispReadEEPROM(unsigned int address) 
.global	ispReadEEPROM
ispReadEEPROM:
  ldi r22,0xA0	;
;	ldi r25,0;
_transmit32:
  mov r23, r9	;hi
  mov r24, r8	;lo
	rjmp _retlast

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispReadFlash()
;&prog_address= lo8(r8) hi8(r9) hlo8(r10)
.global	ispReadFlash
ispReadFlash:
	ldi r22,0x20;cmd
;	ldi r25, 0
_address_lsr:
	mov r23, r9	;hi
	mov r24, r8	;lo
	lsr r23	;
	bst r10,0
	bld r23,7
	ror r24	;
	brcc _retlast;
	ori r22,0x08;
_retlast:
	rcall ispTransmit32;
	mov r24, r25;
	ret

.global inc_prog_address
inc_prog_address:
	sec
	adc r8, r1
	adc r9, r1
	adc r10, r1
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;uchar ispWriteFlash(uchar data)
.global	ispWriteFlash
ispWriteFlash:
	ldi r22,0x40	;cmd
	mov r25, r24	;data
	cp	r4, r1	;prog_pagesize
	cpc	r5, r1
	breq _address_lsr
	rcall _polling_flash	;paged
	dec	r2	;prog_pagecounter--
	brne	_ret     	;
	rcall	ispFlushPage   	; 0x7a4 <ispFlushPage>
	mov	r2, r4
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;ispFlushPage(prog_address, data[i]);
.global	ispFlushPage
ispFlushPage:
	ldi r22, 0x4c	;cmd
;	ldi r25, 0	;任意值
_polling_flash:
;	push r20
	ldi r20, 0x7F
	mov r11, r25
	cpi r22, 0x40
	breq _polling
	ldi r20,0xFF
	ld	r11, Y	;Y=data[i]
_polling:	
	rcall _address_lsr
	cp r11,r20
	brne _loop_init
	ldi r24, CLOCK_T_4800us
	rcall Waitn64us
	rjmp _popr20ret
_loop_init:
	out _SFR_IO_ADDR(TIMERVALUE),r1	;TIMERVALUE=0
_retries_loop:
  rcall ispReadFlash;
  cp r24,r20;		if (ispReadFlash(address) != 0xFF)
  brne _return1
  in r24,_SFR_IO_ADDR(TIMERVALUE);
  cpi r24,CLOCK_T_9600us
  brlo _retries_loop	;if ((uint8_t)TIMERVALUE > CLOCK_T_9600us)
_return1:
_popr20ret:
;	pop r20
	ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;uchar ispWriteEEPROM(uchar data) 返回值无使用去掉
;;;;;;;;;;;;;;;;;;; r24 r25        r22 r23
 .global	ispWriteEEPROM
ispWriteEEPROM:
	ldi r22,0xC0	;cmd
	mov  r25,r24	;data
	rcall _transmit32
	ldi r24,CLOCK_T_9600us;
; 	rjmp Waitn64us	;
;	ret	            ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.global	Waitn64us
Waitn64us:
	rcall wait64us;
	subi r24,lo8(-(-1))
	brne Waitn64us
	ret

⌨️ 快捷键说明

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