📄 avr_910_avr_isp_(auto_adr_inc_19200bps).asm
字号:
;***************************************************************************
;*
;* FUNCTION
;* show_id
;*
;* DESCRIPTION
;* Show our ID ("AVR ISP") on the serial line.
;*
;***************************************************************************
show_id:
ldi u_data,0x41 ; 'A'
rcall putc
ldi u_data,0x56 ; 'V'
rcall putc
ldi u_data,0x52 ; 'R'
rcall putc
ldi u_data,0x20 ; ' '
rcall putc
ldi u_data,0x49 ; 'I'
rcall putc
ldi u_data,0x53 ; 'S'
rcall putc
ldi u_data,0x50 ; 'P'
rcall putc
ret
;***************************************************************************
;*
;* RESET
;*
;* DESCRIPTION
;* Initialization
;*
;***************************************************************************
RESET:
clr temp1
out GIMSK,temp1 ; disable external interrupt
ser temp1 ; Initialize
out PORTD,temp1
set_reset ; set RESET=1
out PORTB,temp1
ddrb_release
rcall u_init ; Initialize UART
sei ; Enable interrupts
;***************************************************************************
;*
;* PROGRAM
;* waitcmd -> main
;*
;* DESCRIPTION
;* Wait for and execute commands.
;*
;***************************************************************************
waitcmd:
rcall getc ; while (getc() == ESC) {};
cpi u_data,0x1b
breq waitcmd
;**** Device Type ****
cpi u_data,0x54 ; 'T' Device type
brne w0
rcall getc ; getc(); // dummy
mov device,u_data ; putc(device);
rjmp put_ret
;**** Return Software Identifier ****
w0:
cpi u_data,0x53 ; 'S' Return software identifier
brne w1
rcall show_id ; show_id();
rjmp waitcmd
;**** Return Software Version ****
w1:
cpi u_data,0x56 ;'V' Return software version
brne w2
ldi u_data,SW_MAJOR
rcall putc
ldi u_data,SW_MINOR
rcall putc
rjmp waitcmd
;**** Return Hardware Version ****
w2:
cpi u_data,0x76 ;'v' Return hardware version
brne w3
ldi u_data,0x30+HW_MAJOR ; putc(0x30+HW_MAJOR);
rcall putc
ldi u_data,0x30+HW_MINOR ; putc(0x30+HW_MINOR);
rcall putc
rjmp waitcmd
;**** Show Supported Devices ****
w3:
cpi u_data,0x74 ; 't' Show supported devices
brne w4
ldi u_data,tn12 ; putc(tiny12);
rcall putc
ldi u_data,tn15 ; putc(tiny15);
rcall putc
ldi u_data,S1200D ; putc(S1200D);
rcall putc
ldi u_data,S2313A ; putc(S2313A);
rcall putc
ldi u_data,S4414A ; putc(S4414A);
rcall putc
ldi u_data,S8515A ; putc(S8515A);
rcall putc
ldi u_data,S2323A ; putc(S2323A);
rcall putc
ldi u_data,S2343A ; putc(S2343A);
rcall putc
ldi u_data,S2333A ; putc(S2333A);
rcall putc
ldi u_data,S4433A ; putc(S4433A);
rcall putc
ldi u_data,S4434 ; putc(S4434);
rcall putc
ldi u_data,S8535 ; putc(S8535);
rcall putc
ldi u_data,m83 ; putc(m83);
rcall putc
ldi u_data,m161 ; putc(mega161);
rcall putc
ldi u_data,m163 ; putc(mega163);
rcall putc
ldi u_data,m103 ; putc(mega103);
rcall putc
ldi u_data,m603 ; putc(mega603);
rcall putc
ldi u_data,0x00 ; putc(0x00); // end of device list
rcall putc
rjmp waitcmd
;**** Return Programmer Type ****
w4:
cpi u_data,0x70 ; 'p' Return programmer type
brne w51
ldi u_data,0x53 ; putc('S'); // serial programmer
rcall putc
rjmp waitcmd
;**** Return autoincrement address support
w51:
cpi u_data,'a' ; 'a' Return address auto increment
brne w5
ldi u_data,'Y' ; putc('Y'); // supports autoinc
rcall putc
rjmp waitcmd
;**** Set LED ****
w5:
cpi u_data,0x78 ; 'x' Set LED (ignored)
brne w6
rjmp put_ret
;**** Clear LED ****
w6:
cpi u_data,0x79 ; 'y' Clear LED (ignored)
brne w7
rjmp put_ret
;**** Enter Programming Mode ****
; We require that the device code be selected before any of the other commands
w7:
cpi device,tn12 ; if ((device != tn12) &&
breq w72
cpi device,tn15 ; if ((device != tn15) &&
breq w72
cpi device,S1200D ; if ((device != S1200D) &&
breq w72
cpi device,S2313A ; (device != S2313A) &&
breq w72
cpi device,S4414A ; (device != S4414A) &&
breq w72
cpi device,S8515A ; (device != S8515A) &&
breq w72
cpi device,S2323A ; (device != S2323A))
breq w72
cpi device,S2343A ; (device != S2343A))
breq w72
cpi device,S2333A ; (device != S2333A) &&
breq w72
cpi device,S4433A ; (device != S4433A) &&
breq w72
cpi device,S4434 ; (device != S4434A) &&
breq w72
cpi device,S8535 ; (device != S8535) &&
breq w72
cpi device,m83 ; (device != m83) &&
breq w72
cpi device,m161 ; (device != m161) &&
breq w72
cpi device,m163 ; (device != m163) &&
breq w72
cpi device,m603 ; (device != m603) &&
breq w72
cpi device,m103 ; (device != m103) &&
breq w72
rjmp put_err ; goto put_err();
w72:
cpi u_data,0x50 ; 'P' Enter programming mode
brne w8
rcall spiinit ; spiinit();
rjmp put_ret
;**** Wait Program Memory ****
;* USAGE
;* wait_pm(byte cmd, byte c_data);
;*
;* cmd : 0x28 - wait for high byte written
;* 0x20 - wait for low byte written
;* u_data : current data written
;wait_pm: ; do
; ; {
; mov s_data,cmd ; wrser(cmd); // SPI write (byte 1)
; rcall wrser
; mov s_data,addrh ; wrser(addrh); // SPI write (byte 2)
; rcall wrser
; mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
; rcall wrser
; rcall rdser ; s_data = rdser(); // SPI read (byte 4)
; }
; cp s_data,u_data ; while(s_data != u_data);
; brne wait_pm
; ret
;**** Write Program Memory, High Byte ****
w8:
cpi u_data,0x43 ; 'C' Write program memory, high byte
brne w9
rcall getc
w81:
ldi s_data,0x48 ; wrser(0x48); // SPI write (byte 1)
rcall wrser
mov s_data,addrh ; wrser(addrh); // SPI write (byte 2)
rcall wrser
mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
rcall wrser
mov s_data,u_data ; wrser(u_data); // SPI write (byte 4)
rcall wrser
ldi temp1,0x01 ; Auto increment address !!!!
clr temp2
add addrl,temp1
adc addrh,temp2
rjmp writeFLASHdelay
;**** Write Program Memory, Low Byte ****
w9:
cpi u_data,0x63 ; 'c' Write program memory, low byte
brne w12
rcall getc
ldi s_data,0x40 ; wrser(0x40); // SPI write (byte 1)
rcall wrser
mov s_data,addrh ; s_data = addrh;
w91: ; }
rcall wrser ; wrser(s_data); // SPI write (byte 2)
mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
rcall wrser
mov s_data,u_data ; wrser(u_data); // SPI write (byte 4)
rcall wrser
writeFLASHdelay:
cpi device,m103
breq w92
cpi device,m83
breq w92
cpi device,m603
breq w92
cpi device,m161
breq w92
cpi device,m163
breq w92
ldi temp1,0x20 ; delay(0x20); // 24585 cycles delay
rcall delay ; // Page mode requires no delay!
w92:
rjmp put_ret ; goto reply();
;**** Read Program Memory ****
w12:
cpi u_data,0x52 ; 'R' Read program memory
brne w10 ;
ldi s_data,0x28 ; wrser(0x28); // SPI write (byte 1)
rcall wrser
mov s_data,addrh ; s_data = addrh;
rcall wrser ; wrser(s_data); // SPI write (byte 2)
mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
rcall wrser
rcall rdser ; putc(rdser()); // Send data (byte 4)
mov u_data,s_data
rcall putc
ldi s_data,0x20 ; wrser(0x20); // SPI write (byte 1)
rcall wrser
mov s_data,addrh ; wrser(addrh); // SPI write (byte 2)
rcall wrser
mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
rcall wrser
rcall rdser ; putc(rdser()); // Send data (byte 4)
mov u_data,s_data
rcall putc
rjmp readaddrinc
;**** Load Address ****
w10:
cpi u_data,0x41 ; 'A' Load address
brne w11
rcall getc ; addrh = getc();
mov addrh,u_data
rcall getc ; addrl = getc();
mov addrl,u_data
rjmp put_ret ; goto reply();
;**** Write Data Memory ****
w11:
cpi u_data,0x44 ; 'D' Write data memory
brne w13
rcall getc
ldi s_data,0xc0
rcall wrser
mov s_data,addrh
rcall wrser
mov s_data,addrl
rcall wrser
mov s_data,u_data
rcall wrser
ldi temp1,0x20
rcall delay
ldi temp1,0x01 ; Auto increment address !!!!
clr temp2
add addrl,temp1
adc addrh,temp2
rjmp put_ret
;;**** Read Data Memory ****
w13:
cpi u_data,0x64 ; 'd' Read data memory
brne w14
ldi s_data,0xa0 ; wrser(0xA0); // SPI write (byte 1)
rcall wrser
mov s_data,addrh ; s_data = addrh;
rcall wrser ; wrser(s_data); // SPI write (byte 2)
mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
rcall wrser
rcall rdser ; putc(rdser()); // Send data (byte 4)
mov u_data,s_data
rcall putc
readaddrinc:
ldi temp1,0x01 ; Auto increment address !!!!
clr temp2
add addrl,temp1
adc addrh,temp2
rjmp waitcmd ; goto waitcmd();
;**** Leave Programming Mode ****
w14:
cpi u_data,0x4c ; 'L' Leave programming mode
brne w15
ddrb_release
set_reset ; set RESET = 1
rjmp put_ret
;**** Chip Erase ****
w15:
cpi u_data,0x65 ; 'e' Chip erase
brne w16
ldi s_data,0xac
rcall wrser
ldi s_data,0x80
rcall wrser
ldi s_data,0x04
rcall wrser
ldi s_data,0x00
rcall wrser
ldi temp1,0x30
rcall delay
rjmp put_ret
;**** Write Lock Bits ****
w16:
cpi u_data,0x6c ; 'l' Write lock bits
brne w17
rcall getc
ldi s_data,0xac
rcall wrser
mov s_data,u_data
andi s_data,0x06
ori s_data,0xe0
rcall wrser
ldi s_data,0x00
rcall wrser
w162:
ldi s_data,0x00
rcall wrser
ldi temp1,0x30
rcall delay
rjmp put_ret
;**** Read Signature Bytes ****
w17:
cpi u_data,0x73 ; 's' Read signature bytes
brne w18
ldi param1,0x02
rcall w17call
ldi param1,0x01
rcall w17call
ldi param1,0x00
rcall w17call
rjmp waitcmd
w17call:
ldi s_data,0x30
rcall wrser
ldi s_data,0x00
rcall wrser
mov s_data,param1
rcall wrser
rcall rdser
mov u_data,s_data
rcall putc
ret
;**** Write Program Memory Page ****
w18:
cpi u_data,0x6D ; 'm' Write Program Memory Page
brne w19
ldi s_data,0x4c ; wrser(0x4c); // SPI write (byte 1)
rcall wrser
mov s_data,addrh ; wrser(addrh); // SPI write (byte 2)
rcall wrser
mov s_data,addrl ; wrser(addrl); // SPI write (byte 3)
rcall wrser
ldi s_data,0x00 ; wrser(0x00); // SPI write (byte 4)
rcall wrser
ldi temp1,0xff ; delay(0xFF); // 0x20 = 24585 cycles delay
rcall delay
rjmp put_ret
;**** Universal Command ****
w19:
cpi u_data,0x3A ; ':' Universal Command
brne w191
rcall getc
mov cmd1,u_data
rcall getc
mov cmd2,u_data
rcall getc
mov cmd3,u_data
clr u_data
rcall NewUniversal
ldi temp1,0xff ; delay(0xFF); // 0x20 = 24585 cycles delay
rcall delay
rjmp put_ret
;**** New Universal Command ****
w191:
cpi u_data,'.' ; '.' New Universal Command
brne w99
rcall getc
mov cmd1,u_data
rcall getc
mov cmd2,u_data
rcall getc
mov cmd3,u_data
rcall getc
rcall NewUniversal
ldi temp1,0xff ; delay(0xFF); // 0x20 = 24585 cycles delay
rcall delay
rjmp put_ret
NewUniversal:
mov s_data,cmd1
rcall wrser
mov s_data,cmd2
rcall wrser
mov s_data,cmd3
rcall wrser
mov s_data,u_data
rcall wrser
mov u_data,rd_s_data
rcall putc
ret
w99:
;**** Command Error ****
put_err:
ldi u_data,0x3f ; putc('?'); \\ send '?'
rcall putc
rjmp waitcmd
;**** Reply Command ****
put_ret:
ldi u_data,0x0d ; putc(0x0D); \\ send CR
rcall putc
rjmp waitcmd
delay1us: ; count R16
nop
cpi temp1,0x03
breq finished
nop
nop
loop:
dec temp1
cpi temp1,0x03
brne loop
finished:
ret
;**** End of File ****
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -