📄 90stest.asm
字号:
;*
;* FUNCTION
;* putc
;*
;* DESCRIPTION
;* Send a character on the UART Tx line.
;*
;***************************************************************************
putc:
sbis USR,UDRE ; test for TX register empty
rjmp putc ; loop until TX empty
out UDR,u_data ; send the byte
ret
;***************************************************************************
;*
;* FUNCTION
;* put_string
;*
;* DESCRIPTION
;* Send Z - pointed null-terminated string on the UART Tx line.
;*
;***************************************************************************
put_string:
lpm
tst r0
breq ps_ret ; check for end of string (0x00)
mov u_data,r0
rcall putc ; putc(char)
adiw ZL,1 ; next char
rjmp put_string
ps_ret: ret
;***************************************************************************
;*
;* FUNCTION
;* put_table
;*
;* DESCRIPTION
;* Send Z - pointed table on the UART Tx line.
;*
;***************************************************************************
put_table:
lpm
tst r0
breq pt_ret ; check for end of table (0x00)
mov u_data,r0
rcall putc ; putc(Byte)
adiw ZL,2 ; skip MSB
rjmp put_table
pt_ret: ret
;***************************************************************************
;*
;* FUNCTION
;* bel_table
;*
;* DESCRIPTION
;* C=0 if device belongs to table.
;*
;***************************************************************************
bel_table:
lpm ; read table
tst r0 ; check for end of table
breq c1_ret
cp device,r0
breq c0_ret ; C=0
adiw ZL,2 ; skip MSB
rjmp bel_table
c1_ret: sec ; C=1
c0_ret: ret
;***************************************************************************
;*
;* FUNCTION
;* set_pagesize
;*
;* DESCRIPTION
;* sets programming Page size for selected Device.
;*
;***************************************************************************
set_pagesize:
lpm ; read table
tst r0 ; check for end of table
breq spa_end ; no Pagesize to set
cp device,r0
breq spa_set ; C=0
adiw ZL,2 ; skip MSB
rjmp set_pagesize
spa_set:
adiw ZL,1 ; Point to high Byte of Word
lpm ; get Pagesize to R0
mov Pagewords,r0
mov Bcnt3,Pagewords ; initiate Counter
spa_end:
ret
;***************************************************************************
;*
;* FUNCTION
;* set_pollcode
;*
;* DESCRIPTION
;* sets Code for Polling Flash for selected Device.
;*
;***************************************************************************
set_pollcode:
lpm ; read table
tst r0 ; check for end of table
breq spo_end ; no Pollcode to set
cp device,r0
breq spo_set ; C=0
adiw ZL,2 ; skip MSB
rjmp set_pollcode
spo_set:
adiw ZL,1 ; Point to high Byte of Word
lpm ; get Pagesize to R0
mov PollcodeF,r0 ; Set Pollcode for Flash Rom
spo_end:
ret
;***************************************************************************
;*
;* FUNCTION
;* delay
;*
;* DESCRIPTION
;* Make delay 1mS (x temp1).
;*
;***************************************************************************
delay:
ldi temp2,40
dl2: ldi temp3,(XTAL/120)
dl1: dec temp3
brne dl1
dec temp2
brne dl2
dec temp1
brne delay
ret
;***************************************************************************
;*
;* FUNCTION
;* spi123
;*
;* DESCRIPTION
;* Write bytes 1 to 3 on the SPI. Byte 1 must be loadet into s_data
;* Byte 2 ist addrh, Byte 3 ist addrl
;*
;***************************************************************************
spi123:
rcall wrser ; wrser(s_data) SPI write (byte 1)
mov s_data,addrh
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
ret
;***************************************************************************
;*
;* FUNCTION
;* w1234 (for Code simplification,)
;*
;* DESCRIPTION
;* Write SPI bytes 1 to 4.
; Byte 1 must be loadet into cmd1
; Byte 2 must be loadet into cmd2
; Byte 3 must be loadet into cmd3
; Byte 4 must be loadet into u_data
;*
;***************************************************************************
w1234:
mov s_data,cmd1
rcall wrser
mov s_data,cmd2
rcall wrser
mov s_data,cmd3
rcall wrser
mov s_data,u_data ; get Byte 4 from serial
rcall wrser
ret
;***************************************************************************
;*
;* FUNCTION
;* w123r4 (for Code simplification)
;*
;* DESCRIPTION
;* Write SPI bytes 1 to 3, read Byte 4 to serial.
; Byte 1 must be loadet into cmd1
; Byte 2 must be loadet into cmd2
; Byte 3 must be loadet into cmd3
;*
;***************************************************************************
w123r4:
mov s_data,cmd1
rcall wrser
mov s_data,cmd2
rcall wrser
mov s_data,cmd3
rcall wrser
rcall rdser
mov u_data,s_data ; put Byte 4 to serial
rcall putc
ret
;***************************************************************************
;*
;* FUNCTION
;* rdser, wrser
;*
;* DESCRIPTION
;* Write and read bytes on the SPI.
;*
;***************************************************************************
rdser:
clr s_data
wrser:
ldi temp1,8 ; load bit counter
ldi rd_s_data,0
wrs0:
rol s_data
brcc wrs1
set_MOSI ; MOSI = 1
rjmp wrs2
wrs1:
clr_MOSI ; MOSI = 0
wrs2:
lsl rd_s_data
sbic_MISO ; read MISO
ori rd_s_data,1
pulse_SCK ; pulse SCK
dec temp1 ; advance bit counter
brne wrs0 ; loop
mov s_data,rd_s_data
ret
;***************************************************************************
;*
;* FUNCTION
;* read_send_progmem
;*
;* DESCRIPTION
;* Read one adress (2 Byte) from Program Memory and send it through UART
;*
;***************************************************************************
read_send_progmem:
tst device
brmi rsp1 ; S89 device
ldi s_data,0x20 ; read low Byte
rcall wrser ; wrser(0x28) SPI write (byte 1)
mov s_data,addrh
rjmp rsp2
rsp1:
mov s_data,addrh ; s_data = (addrh << 3) | 0x01;
rcall shift_s_data3
ori s_data,0x01
rsp2:
rcall wrser ; wrser(addrh) SPI write (byte 2) (S89=byte1)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
rcall rdser ; SPI read (byte 4)
mov u_data,s_data
rcall putc ; send data
tst device
brmi rsp3 ; S89 device
ldi s_data,0x28 ; read High Byte
rcall wrser ; wrser(0x20) SPI write (byte 1)
mov s_data,addrh
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
rcall rdser ; SPI read (byte 4)
mov u_data,s_data
rcall putc ; send data
rsp3:
adiw addrl,1 ; Auto increment address
ret
;***************************************************************************
;*
;* FUNCTION
;* read_send_datamem
;*
;* DESCRIPTION
;* Read one Byte from Data Memory (eeprom) and send it through UART
;*
;***************************************************************************
read_send_datamem: ; Subroutine to read one eeprom Address
tst device
brmi rsd1 ; S89 device
ldi s_data,0xa0
rcall wrser ; wrser(0xa0) SPI write (byte 1)
mov s_data,addrh
rjmp rsd2
rsd1:
cpi device,0x87 ; if (device == S53)
breq rsd3 ; no Support for 89S53 device due to Bug in AVRProg V1.37
mov s_data,addrh
rcall shift_s_data3
ori s_data,0x05
rsd2:
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
rcall rdser ; SPI read (byte 4)
mov u_data,s_data
rcall putc ; send data
adiw addrl,1 ; Auto increment address
ret
rsd3:
pop temp1 ; remove return Adress from Stack in case of Error
pop temp1
rjmp put_err
;***************************************************************************
;*
;* FUNCTION
;* eeprom_write
;*
;* DESCRIPTION
;* Write u_data to Data Memory (eeprom)
;*
;***************************************************************************
eeprom_write:
tst device
brmi eew1 ; S89 device
ldi s_data,0xc0
rcall wrser ; wrser(0xc0) SPI write (byte 1)
mov s_data,addrh
rjmp eew2
eew1:
cpi device,0x87 ; if (device == S53)
breq eew3
mov s_data,addrh
rcall shift_s_data3
ori s_data,0x06
eew2:
rcall wrser ; wrser(addrh) SPI write (byte 2)
mov s_data,addrl
rcall wrser ; wrser(addrl) SPI write (byte 3)
mov s_data,u_data
rcall wrser ; wrser(u_data) SPI write (byte 4)
ldi temp1,10 ; delay 10mS
rcall delay
adiw addrl,1 ; Auto increment address
ret
eew3:
pop temp1 ; remove return Adress from Stack in case of failure
pop temp1
rjmp put_err
;***************************************************************************
;*
;* FUNCTION
;* shift_s_data3
;*
;* DESCRIPTION
;* Shift s_data 3 times left for S89 device.
;*
;***************************************************************************
shift_s_data3:
lsl s_data
lsl s_data
lsl s_data
brcc s3_ret
cpi device,0x87 ; if (device != S53)
brne s3_ret
sbr s_data, 4 ; a13 +
s3_ret: ret
;***************************************************************************
;*
;* FUNCTION
;* healthcheck
;*
;* DESCRIPTION
;* changes color of dual color led.
;*
;***************************************************************************
healthcheck: ; for dual color LED
clr_LED ; LED red
ldi temp1,200 ; 200 ms
rcall delay
ldi temp1,200 ; again 200 ms
rcall delay
ldi s_data,200 ; counter Register
LEDloop: ; Pulse for yellow LED
set_LED ; LED green
ldi temp1,2 ; 2 ms
rcall delay
clr_LED ; LED red
ldi temp1,1 ; 1 ms
rcall delay
dec s_data ; dec. counter
brne LEDloop
set_LED ; LED green
ret
;***************************************************************************
;***************************************************************************
;***************************************************************************
;*
;* INIT
;*
;* DESCRIPTION
;* Initialization
;*
;***************************************************************************
;***************************************************************************
;***************************************************************************
INIT:
ldi temp1,RAMEND
out SPL,temp1 ; Locate stack
ldi temp1,PAGESIZE ; default Pagesize
mov Pagewords,temp1
mov Bcnt3,Pagewords ; set counter for Pagesize
ldi device,0x20 ; S2313 as default
clr B_Mode ; Flag for Block Modes (see Note 16)
clr B_Flag ; Flag for eNhanced Block write
init_ports ; Initialize ports
release_ports ; Release ports
rcall u_init ; Initialize UART
rcall healthcheck ; show that Prog is working after Powerup (LED test)
;***************************************************************************
;*
;* PROGRAM
;* waitcmd -> main
;*
;* DESCRIPTION
;* Wait for and execute commands.
;*
;***************************************************************************
waitcmd:
rcall getc ; while (getc() == ESC) {};
cpi u_data,0x1b
breq waitcmd
;====== 'T' - Device Type ==================================================
cpi u_data,'T' ; 'T' Device type
brne w0
rcall getc
mov device,u_data ; get device type
table Dev_M ; prepare to set Pagesize
rcall set_pagesize ; If device has Page Mode support, set Pagesize
ldi temp1,0xFF
mov PollcodeF,temp1 ; preset PollcodeF with 0xFF, will be overwritten if Pollcode known
table Dev_S ; prepare to set Polling Code
rcall set_pollcode ; If device has no Page Size support, set code for Polling Flash
rjmp put_ret
;====== 'S' - Return Software Identifier ===================================
w0:
cpi u_data,'S' ; 'S' Return software identifier
brne w1
table ID_Str
rcall put_string ; put string "AVR ISP"
rjmp waitcmd
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -