📄 main.s
字号:
; TempInt -> R20,R21
; i -> R22,R23
.even
_WriteFlash::
rcall push_gset2
;
; }
;
; /*****************************************************************************/
;
; void WriteFlash(void)
; {
; unsigned int i;
; unsigned int TempInt;
;
; for(i = 0 ; i < PageByte ; i += 2)
clr R22
clr R23
rjmp L35
L32:
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
movw R30,R22
adiw R30,1
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
movw R30,R22
add R30,R24
adc R31,R25
ldd R20,z+0
clr R21
add R20,R2
adc R21,R3
movw R18,R22
movw R16,R20
rcall _fill_temp_buffer
L33:
subi R22,254 ; offset = 2
sbci R23,255
L35:
cpi R22,64
ldi R30,0
cpc R23,R30
brlo L32
; {
; TempInt = PageBuffer[i] + (PageBuffer[i+1]<<8);
; fill_temp_buffer(TempInt,i); //call asm routine.
; }
; write_page(PageAddress,0x03); //Perform page ERASE
ldi R18,3
lds R16,_PageAddress
lds R17,_PageAddress+1
rcall _write_page
; write_page(PageAddress,0x05); //Perform page write
ldi R18,5
lds R16,_PageAddress
lds R17,_PageAddress+1
rcall _write_page
; enableRWW();
rcall _enableRWW
; WDR();
wdr
L31:
rcall pop_gset2
.dbline 0 ; func end
ret
; TempInt2 -> R22,R23
; TempInt -> R10,R11
; i -> R20,R21
.even
_CheckFlash::
rcall push_gset3
; }
;
; /*****************************************************************************/
;
; char CheckFlash(void)
; {
; unsigned int i;
; unsigned int TempInt;
; unsigned int TempInt2;
; WDR();
wdr
; for (i = 0 ; i < PageByte ; i += 2)
clr R20
clr R21
rjmp L40
L37:
; {
; TempInt = read_program_memory(PageAddress + i , 0x00);
clr R18
lds R16,_PageAddress
lds R17,_PageAddress+1
add R16,R20
adc R17,R21
rcall _read_program_memory
movw R10,R16
; TempInt2 = PageBuffer[i] +(PageBuffer[i+1] << 8);
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
movw R30,R20
adiw R30,1
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
movw R30,R20
add R30,R24
adc R31,R25
ldd R22,z+0
clr R23
add R22,R2
adc R23,R3
; if (TempInt != TempInt2) return 0;
cp R16,R22
cpc R17,R23
breq L41
clr R16
rjmp L36
L41:
L38:
subi R20,254 ; offset = 2
sbci R21,255
L40:
cpi R20,64
ldi R30,0
cpc R21,R30
brlo L37
; }
; return 1;
ldi R16,1
L36:
rcall pop_gset3
.dbline 0 ; func end
ret
; CheckSum -> R22
; Data -> R10
; ByteAddress -> R12,R13
; ByteAddressLow -> R22
; ByteAddressHigh -> R10
; LocalCheckSum -> R20
.even
_EEpromLoad::
rcall push_gset4
; }
;
; /*****************************************************************************/
; /* EEprom Programing Code */
; /*****************************************************************************/
;
; #ifdef EEPROM
; void EEpromLoad()
; {
; unsigned char ByteAddressHigh;
; unsigned char ByteAddressLow;
; unsigned int ByteAddress;
; unsigned char Data;
; unsigned char LocalCheckSum;
; unsigned char CheckSum;
;
; TxChar(')');
ldi R16,41
rcall _TxChar
; TxChar('!');
ldi R16,33
rcall _TxChar
rjmp L45
L44:
; while (1)
; {
; WDR();
wdr
; LocalCheckSum = 0;
clr R20
L47:
L48:
;
; while(!IsChar());
rcall _IsChar
tst R16
breq L47
; ByteAddressHigh = RxChar();
rcall _RxChar
mov R10,R16
; LocalCheckSum += ByteAddressHigh;
add R20,R16
L50:
L51:
;
; while(!IsChar());
rcall _IsChar
tst R16
breq L50
; ByteAddressLow = RxChar();
rcall _RxChar
mov R22,R16
; LocalCheckSum += ByteAddressLow;
add R20,R16
;
; ByteAddress = (ByteAddressHigh<<8)+ByteAddressLow;
mov R13,R10
mov R12,R22
;
; if (ByteAddress == 0xffff) return;
movw R24,R12
cpi R24,255
ldi R30,255
cpc R25,R30
brne L56
rjmp L43
L55:
L56:
;
; while(!IsChar());
rcall _IsChar
tst R16
breq L55
; Data = RxChar();
rcall _RxChar
mov R10,R16
; LocalCheckSum += Data;
add R20,R16
;
; WDR();
wdr
L58:
L59:
;
; while(!IsChar());
rcall _IsChar
tst R16
breq L58
; CheckSum = RxChar();
rcall _RxChar
mov R22,R16
;
; if (CheckSum == LocalCheckSum)
cp R16,R20
brne L61
; {
; EEPROMwrite(ByteAddress, Data);
mov R18,R10
movw R16,R12
rcall _EEPROMwrite
; if (EEPROMread(ByteAddress) == Data) TxChar('!');
movw R16,R12
rcall _EEPROMread
cp R16,R10
brne L63
ldi R16,33
rcall _TxChar
rjmp L62
L63:
; else TxChar('@');
ldi R16,64
rcall _TxChar
; }
rjmp L62
L61:
; else
; {
; TxChar('@');
ldi R16,64
rcall _TxChar
; }
L62:
L45:
rjmp L44
X2:
L43:
rcall pop_gset4
.dbline 0 ; func end
ret
; byte -> R18
; location -> R16,R17
.even
_EEPROMwrite::
; }
; }
; #endif
;
;
;
; #ifdef EEPROM
; void EEPROMwrite( int location, unsigned char byte)
; {
L66:
L67:
; while (EECR & 0x02); // Wait until any earlier write is done
sbic 0x1c,1
rjmp L66
; EEAR = location;
out 0x1f,R17
out 0x1e,R16
; EEDR = byte;
out 0x1d,R18
; EECR |= 0x04; // Set MASTER WRITE enable
sbi 0x1c,2
; EECR |= 0x02; // Set WRITE strobe
sbi 0x1c,1
; WDR();
wdr
L65:
.dbline 0 ; func end
ret
; location -> R16,R17
.even
_EEPROMread::
; }
; #endif
;
;
;
; #ifdef EEPROM
; unsigned char EEPROMread( int location)
; {
L70:
L71:
; //WDR();
; while (EECR & 0x02);
sbic 0x1c,1
rjmp L70
; EEAR = location;
out 0x1f,R17
out 0x1e,R16
; EECR |= 0x01; // Set READ strobe
sbi 0x1c,0
; return (EEDR); // Return byte
in R16,0x1d
L69:
.dbline 0 ; func end
ret
.even
_IsChar::
; }
; #endif
;
;
; /*****************************************************************************/
; /* LockBit Code */
; /*****************************************************************************/
;
;
; #ifdef LOCKBIT
; void LockBit(void)
; {
; unsigned char Byte;
; WDR();
; TxChar('%');
;
; while(!IsChar());
; Byte = RxChar();
;
; while(!IsChar());
; if (Byte == ~RxChar()) write_lock_bits(~Byte);
; }
; #endif
;
;
; /*****************************************************************************/
; /* Serial Port Code */
; /*****************************************************************************/
; unsigned char IsChar(void)
; {
; if(UCSRA & 0x80)
sbis 0xb,7
rjmp L74
; return 1;
ldi R16,1
rjmp L73
L74:
; else
; return 0;
clr R16
L73:
.dbline 0 ; func end
ret
.even
_RxChar::
; }
;
; /*****************************************************************************/
; unsigned char RxChar(void)
; {
; return UDR;
in R16,0xc
L76:
.dbline 0 ; func end
ret
; ch -> R16
.even
_TxChar::
; }
;
; /*****************************************************************************/
;
; void TxChar(char ch)
; {
L78:
L79:
; while(!(UCSRA & 0x20)); // wait for empty transmit buffer
sbis 0xb,5
rjmp L78
;
; RS485PORT |= RS485TXE;
sbi 0x12,4
; UDR = ch; // write char
out 0xc,R16
L81:
L82:
; while(!(UCSRA & 0x40));
sbis 0xb,6
rjmp L81
; UCSRA |= 0x40;
sbi 0xb,6
; RS485PORT &= ~RS485TXE;
cbi 0x12,4
; WDR();
wdr
L77:
.dbline 0 ; func end
ret
; i -> R16,R17
.even
_Wait::
; }
;
; /*****************************************************************************/
; /* Helpers Code */
; /*****************************************************************************/
; void Wait()
; {
ldi R16,-32000
ldi R17,-125
L85:
L86:
; int i;
; #ifdef LOW
; for (i=0;i<32000;i++);
; WDR();
; #endif
; #ifdef HIGH
; for (i=-32000;i<32000;i++);
subi R16,255 ; offset = 1
sbci R17,255
cpi R16,0
ldi R30,125
cpc R17,R30
brlt L85
; WDR();
wdr
L84:
.dbline 0 ; func end
ret
.even
_SendDeviceID::
; #endif
; }
;
; /*****************************************************************************/
;
; void SendDeviceID(void)
; {
;
; TxChar(DeviceID);
ldi R16,65
rcall _TxChar
; TxChar(FlashSize);
ldi R16,108
rcall _TxChar
; TxChar(BootSize);
ldi R16,100
rcall _TxChar
; TxChar(PageSize);
ldi R16,82
rcall _TxChar
; TxChar(EEpromSize);
ldi R16,49
rcall _TxChar
; RxChar();
rcall _RxChar
; WDR();
wdr
L89:
.dbline 0 ; func end
ret
.even
_ExecCode::
; }
;
; /*****************************************************************************/
;
; void ExecCode(void)
; {
; #ifdef RAMPZ_FLAG
; RAMPZ = 0;
; #endif
; INTVECREG = 0x01; // Enable interrupt vector select
ldi R24,1
out 0x3b,R24
; INTVECREG = 0x00; // Move interrupt vector to flash
clr R2
out 0x3b,R2
; asm("jmp 0x0000"); // Run application code
jmp 0x0000
L90:
.dbline 0 ; func end
ret
; i -> R20
.even
_main::
; }
;
;
;
; void main(void)
; {
; unsigned char i;
; CLI(); // disable all interrupts
cli
;
; WDTCR |= ( 1 << WDCE ) | ( 1 << WDE ) ;
in R24,0x21
ori R24,24
out 0x21,R24
; WDTCR = 0x07 ;
ldi R24,7
out 0x21,R24
;
; PULLUPPORT = PULLUPPIN; // Pull up on RX line
ldi R24,1
out 0x12,R24
;
; UCSRB = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
; UCSRA = 0x00;
out 0xb,R2
; UCSRC = 0x86; // Asyn,NoParity,1StopBit,8Bit,
ldi R24,134
out 0x20,R24
; UBRRH = 0; //set baud rate hi
out 0x20,R2
; UCSRB = 0x18; // Rx enable Tx Enable
ldi R24,24
out 0xa,R24
; #ifdef RS485DDR
; RS485DDR |= RS485TXE ;
sbi 0x11,4
; RS485PORT &= ~RS485TXE ;
cbi 0x12,4
; #endif
; #ifdef BAUDRATE
; {
; UBRRL = BAUDRATE;
; #else
; for (i = 7; i < 15; ++i)
ldi R20,7
rjmp L95
L92:
; {
; WDR();
wdr
; UBRRL = i;
out 0x9,R20
; #endif
;
; RxChar();
rcall _RxChar
; TxChar('>');
ldi R16,62
rcall _TxChar
; Wait();
rcall _Wait
; if (RxChar() == '<')
rcall _RxChar
cpi R16,60
brne L96
; {
; SendDeviceID();
rcall _SendDeviceID
; FlashLoad();
rcall _FlashLoad
; // Watchdog_Feed();
; #ifdef EEPROM
; EEpromLoad();
rcall _EEpromLoad
; // Watchdog_Feed();
; #endif
; #ifdef LOCKBIT
; LockBit();
; #endif
; ExecCode();
rcall _ExecCode
; }
L96:
L93:
inc R20
L95:
cpi R20,15
brlo L92
; }
; ExecCode();
rcall _ExecCode
L91:
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
_RealPageAddress::
.blkb 2
_PageAddress::
.blkb 2
_PageBuffer::
.blkb 64
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -