📄 avr910.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,0x30+SW_MAJOR ; putc(0x30+SW_MAJOR); rcall putc ldi u_data,0x30+SW_MINOR ; putc(0x30+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,S1200C ; putc(S1200C); 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,S8252 ; putc(S8252); 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 w5 ldi u_data,0x53 ; putc('S'); // serial programmer 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 commandsw7: cpi device,S1200C ; if ((device != S1200C) && breq w72 cpi device,S1200D ; (device != S1200D) && breq w72 cpi device,S8515A ; (device != S8515A) && breq w72 cpi device,S4414A ; (device != S4414A) && breq w72 cpi device,S2313A ; (device != S2313A) && breq w72 cpi device,S8252 ; (device != S8252) && breq w72 cpi device,S01838C ; (device != S01838C) && breq w72 cpi device,S01838D ; (device != S01838D) && breq w72 cpi device,S2323A ; (device != S2323A)) 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 cpi device,S8252 ; if (device == S8252) brne w81 ; { rjmp put_err ; goto err(); ; // (AT89 series have byte wide program memory !) ; }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 cpi device,S01838C ; invert data on 01838 rev C! brne w81b com u_dataw81b: mov s_data,u_data ; wrser(u_data); // SPI write (byte 4) rcall wrser cpi device,S01838C ; no delay for S01838 (Uses Page Write Mode instead) breq w82 cpi device,S01838D breq w82 ldi temp1,0x20 ; delay(0x20); // 24585 cycles delay rcall delay ; // Page mode requires no delay!w82: ldi temp1,0x01 ; Auto increment address !!!! clr temp2 add addrl,temp1 adc addrh,temp2 rjmp put_ret ; goto reply();;**** Write Program Memory, Low Byte ****w9: cpi u_data,0x63 ; 'c' Write program memory, low byte brne w12 rcall getc cpi device,S8252 ; if (device != S8252) breq w989 ; { ldi s_data,0x40 ; wrser(0x40); // SPI write (byte 1) rcall wrser mov s_data,addrh ; s_data = addrh; rjmp w91 ; } ; elsew989: ; { mov s_data,addrh ; s_data = (addrh << 3) | 0x02; rcall shift_s_data3 ori s_data,0x02w91: ; } rcall wrser ; wrser(s_data); // SPI write (byte 2) mov s_data,addrl ; wrser(addrl); // SPI write (byte 3) rcall wrser cpi device,S01838C ; invert data on 01838 rev C! brne w91b com u_dataw91b: mov s_data,u_data ; wrser(u_data); // SPI write (byte 4) rcall wrser cpi device,S01838C ; no delay for S01838 (Uses Page Write Mode instead) breq w92 cpi device,S01838D 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 ; cpi device,S8252 ; if (device != S8252) breq w1289 ; { ldi s_data,0x28 ; wrser(0x28); // SPI write (byte 1) rcall wrser mov s_data,addrh ; s_data = addrh; rjmp w121 ; } ; elsew1289: ; { mov s_data,addrh ; s_data = (addrh << 3) | 0x01; rcall shift_s_data3 ori s_data,0x01w121: ; } 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 cpi device,S8252 ; if (device == S8252) brne w122 ; { rjmp waitcmd ; goto waitcmd(); ; } ; elsew122: ; { 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 ldi temp1,0x01 ; Auto increment address !!!! clr temp2 add addrl,temp1 adc addrh,temp2 rjmp waitcmd ; goto waitcmd(); ; }shift_s_data3: lsl s_data lsl s_data lsl s_data ret;**** 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 cpi device,S8252 breq w1189 ldi s_data,0xc0 rcall wrser mov s_data,addrh rjmp w111w1189: mov s_data,addrh rcall shift_s_data3 ori s_data,0x06w111: rcall wrser mov s_data,addrl rcall wrser mov s_data,u_data rcall wrser ldi temp1,0x20 rcall delay rjmp put_ret;;**** Read Data Memory ****w13: cpi u_data,0x64 ; 'd' Read data memory brne w14 cpi device,S8252 ; if (device != S8252) breq w1389 ; { ldi s_data,0xa0 ; wrser(0xA0); // SPI write (byte 1) rcall wrser mov s_data,addrh ; s_data = addrh; rjmp w131 ; } ; elsew1389: ; { mov s_data,addrh ; s_data = (addrh << 3) | 0x05; rcall shift_s_data3 ori s_data,0x05w131: ; } 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 rjmp waitcmd ; goto waitcmd();;**** Leave Programming Mode ****w14: cpi u_data,0x4c ; 'L' Leave programming mode brne w15 ddrb_release cpi device,S8252 breq w141 set_reset ; set RESET = 1 rjmp put_retw141: clr_reset ; set RESET = 0 rjmp put_ret;**** Chip Erase ****w15: cpi u_data,0x65 ; 'e' Chip erase brne w16 ldi s_data,0xac rcall wrser cpi device,S8252 breq w1589 ldi s_data,0x80 rcall wrserw1589: 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 cpi device,S8252 breq w1689 andi s_data,0x06 ori s_data,0xe0 rcall wrser ldi s_data,0x00 rcall wrser rjmp w162w1689: andi s_data,0xe0 ori s_data,0x07 rcall wrserw162: 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 cpi device,S8252 brne w17begin rjmp put_errw17begin: ldi param1,0x02 rcall w17call ldi param1,0x01 rcall w17call ldi param1,0x00 rcall w17call rjmp waitcmdw17call: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 w99 rcall getc mov cmd1,u_data rcall getc mov cmd2,u_data rcall getc mov cmd3,u_data rcall universal ldi temp1,0xff ; delay(0xFF); // 0x20 = 24585 cycles delay rcall delay rjmp put_retuniversal: 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 rcall putc retw99:;**** 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;**** End of File ****
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -