📄 isojtag_avr910_3.8.s
字号:
adiw ZL,1 // next char rjmp put_stringps_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_tablept_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=1c0_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 Counterspa_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 Romspo_end: ret //**************************************************************************//// FUNCTION// delay//// DESCRIPTION// Make delay 1mS (x temp1).////**************************************************************************delay: ldi temp2,40dl2: 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_datawrser: ldi temp1,8 // load bit counter ldi rd_s_data,0wrs0: rol s_data brcc wrs1 set_MOSI // MOSI = 1 rjmp wrs2wrs1: clr_MOSI // MOSI = 0wrs2: lsl rd_s_data sbic_MISO // read MISO ori rd_s_data,1 rcall 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 rsp2rsp1: mov s_data,addrh // s_data = (addrh << 3) | 0x01// rcall shift_s_data3 ori s_data,0x01rsp2: 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 datarsp3: 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 rsd2rsd1: 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,0x05rsd2: 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 retrsd3: 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,0x06eew2: 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 reteew3: 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 RegisterLEDloop: // 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 - done automatically by avr-gcc 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 rcall init_ports // Initialize ports rcall 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 ldi ZL,lo8(pm(Dev_M)) // low ldi ZH,hi8(pm(Dev_M)) // high lsl ZL
rol ZH
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 ldi ZL,lo8(pm(Dev_S)) // low ldi ZH,hi8(pm(Dev_S)) // high lsl ZL
rol ZH
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 ldi ZL,lo8(pm(ID_Str)) // low ldi ZH,hi8(pm(ID_Str)) // high lsl ZL
rol ZH
rcall put_string // put string "AVR ISP" rjmp waitcmd//====== 'V' - Return Software Version ======================================w1: cpi u_data,'V' // 'V' Return software version brne w2 //table SW_Ver ldi ZL,lo8(pm(SW_Ver)) // low ldi ZH,hi8(pm(SW_Ver)) // high lsl ZL
rol ZH
rcall put_string // put software version rjmp waitcmd//====== 'v' - Return Hardware Version ======================================w2: cpi u_data,'v' // 'v' Return hardware version brne w3 //table HW_Ver ldi ZL,lo8(pm(HW_Ver)) // low ldi ZH,hi8(pm(HW_Ver)) // high lsl ZL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -