main.s
来自「文档里面的代码是可以正常使用的」· S 代码 · 共 3,673 行 · 第 1/5 页
S
3,673 行
.module main.c
.area text(rom, con, rel)
.dbfile E:\ICCAVR\icc\stk500\avrasp\main.c
.dbfunc e main _main fV
; i -> y+1
; msg_size -> R22,R23
; seq_num -> y+0
; checksum -> R12
; t -> R20
; state -> R14,R15
; rec_data -> R10,R11
.even
_main::
sbiw R28,3
.dbline -1
.dbline 49
; /** \file
; <b>USBisp main</b><br>
; Autor: Matthias Wei遝r<br>
; Copyright 2005: Matthias Wei遝r<br>
; License: QPL (see license.txt)
; <hr>
; */
; /*! \mainpage USBisp STK500 v2
;
; (c)2005 by Matthias Weisser
;
; This software is distributed under the QPL
; see license.txt for more information
;
; \section Compiler
; latest WINAVR
;
; \section version history version history
; <b>v1.0</b>
; <ul>
; <li>First release</li>
; </ul>
; */
; #include "stk500.h"
;
; //States used in the receive state machine
; #define ST_START 0xF000 /*消息开始0x1B */
; #define ST_GET_SEQ_NUM 0xF001 /*消息包号 */
; #define ST_MSG_SIZE_1 0xF002 /*消息长度 */
; #define ST_MSG_SIZE_2 0xF003 /*消息长度 */
; #define ST_GET_TOKEN 0xF004 /*消息记号0x0E */
; #define ST_GET_DATA 0xF005 /*消息数据 */
; #define ST_GET_CHECK 0xF006 /*消息校验 */
; #define ST_PROCESS 0xF007 /*消息 */
;
; void chip_init(void);
; unsigned char adc_get(char n);
; void process_command(unsigned char seq_num);
;
; //Some global variables
; unsigned char msg_buffer[300];
; unsigned char clock_speed;
; unsigned char reset_polarity;
; unsigned char param_controller_init;
; unsigned char prgmode;
;
; unsigned long address;
;
; void main(void) {
.dbline 51
;
; unsigned int i=0;
clr R0
clr R1
std y+2,R1
std y+1,R0
.dbline 53
;
; unsigned char seq_num=0;
std y+0,R0
.dbline 54
; unsigned int msg_size=0;
clr R22
clr R23
.dbline 55
; unsigned char checksum=0;
clr R12
.dbline 58
;
; /// next state
; unsigned int state=ST_START; /*应该是状态标志*/
ldi R24,61440
ldi R25,240
movw R14,R24
.dbline 63
;
; unsigned char t;
; signed int rec_data;
;
; chip_init();
rcall _chip_init
.dbline 64
; interface_init();
rcall _interface_init
.dbline 65
; spi_disable();
rcall _spi_disable
.dbline 68
;
; //clock_speed=eeprom_read_byte(&eeprom_sck_period);
; clock_speed=eeprom_sck_period;
lds R2,_eeprom_sck_period
sts _clock_speed,R2
.dbline 69
; if (clock_speed==0xFF) {
mov R24,R2
cpi R24,255
brne L3
.dbline 69
.dbline 70
; clock_speed=SPI_SPEED_125KHZ;
ldi R24,5
sts _clock_speed,R24
.dbline 71
; }
L3:
.dbline 72
; spi_set_speed(clock_speed);
lds R16,_clock_speed
rcall _spi_set_speed
.dbline 74
;
; SEI();
sei
.dbline 76
;
; LED_GN_OFF;
ldi R24,-2
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
.dbline 77
; LED_RT_ON;
sbi 0x5,1
.dbline 78
; wait_ms(2000);
ldi R16,2000
ldi R17,7
rcall _wait_ms
.dbline 79
; LED_GN_ON;
sbi 0x5,0
.dbline 80
; LED_RT_OFF;
ldi R24,-3
ldi R25,-1
in R2,0x5
and R2,R24
out 0x5,R2
rjmp L6
L5:
.dbline 82
;
; while(2) {
.dbline 83
; rec_data=interface_getc();
rcall _interface_getc
movw R10,R16
.dbline 85
; //if a byte has been received -> process it
; if(rec_data!=-1) {
movw R24,R10
cpi R16,255
ldi R30,255
cpc R17,R30
brne X1
rjmp L8
X1:
.dbline 85
.dbline 86
; t=rec_data&0xFF;
mov R20,R24
andi R21,0
.dbline 88
;
; if(state==ST_START) {
movw R24,R14
cpi R24,0
ldi R30,240
cpc R25,R30
brne L10
.dbline 88
.dbline 89
; if(t==MESSAGE_START) {
cpi R20,27
breq X2
rjmp L11
X2:
.dbline 89
.dbline 90
; state = ST_GET_SEQ_NUM;
ldi R24,61441
ldi R25,240
movw R14,R24
.dbline 91
; checksum = MESSAGE_START^0;
ldi R24,27
mov R12,R24
.dbline 92
; }
.dbline 93
; }
rjmp L11
L10:
.dbline 94
; else {
.dbline 95
; if(state==ST_GET_SEQ_NUM) {
movw R24,R14
cpi R24,1
ldi R30,240
cpc R25,R30
brne L14
.dbline 95
.dbline 96
; seq_num = t;
std y+0,R20
.dbline 97
; state = ST_MSG_SIZE_1;
ldi R24,61442
ldi R25,240
movw R14,R24
.dbline 98
; checksum ^= t;
eor R12,R20
.dbline 99
; }
rjmp L15
L14:
.dbline 100
; else {
.dbline 101
; if(state==ST_MSG_SIZE_1) {
movw R24,R14
cpi R24,2
ldi R30,240
cpc R25,R30
brne L16
.dbline 101
.dbline 102
; msg_size = t<<8;
mov R22,R20
clr R23
mov R23,R22
clr R22
.dbline 103
; state = ST_MSG_SIZE_2;
ldi R24,61443
ldi R25,240
movw R14,R24
.dbline 104
; checksum ^= t;
eor R12,R20
.dbline 105
; }
rjmp L17
L16:
.dbline 106
; else {
.dbline 107
; if(state==ST_MSG_SIZE_2) {
movw R24,R14
cpi R24,3
ldi R30,240
cpc R25,R30
brne L18
.dbline 107
.dbline 108
; msg_size |= t;
mov R2,R20
clr R3
or R22,R2
or R23,R3
.dbline 109
; state = ST_GET_TOKEN;
ldi R24,61444
ldi R25,240
movw R14,R24
.dbline 110
; checksum ^= t;
eor R12,R2
.dbline 111
; }
rjmp L19
L18:
.dbline 112
; else {
.dbline 113
; if(state==ST_GET_TOKEN) {
movw R24,R14
cpi R24,4
ldi R30,240
cpc R25,R30
brne L20
.dbline 113
.dbline 114
; if(t==TOKEN) {
cpi R20,14
brne L22
.dbline 114
.dbline 115
; state = ST_GET_DATA;
ldi R24,61445
ldi R25,240
movw R14,R24
.dbline 116
; checksum ^= t;
eor R12,R20
.dbline 117
; i=0;
clr R0
clr R1
std y+2,R1
std y+1,R0
.dbline 118
; }
rjmp L21
L22:
.dbline 119
; else {
.dbline 120
; state = ST_START;
ldi R24,61440
ldi R25,240
movw R14,R24
.dbline 121
; }
.dbline 122
; }
rjmp L21
L20:
.dbline 123
; else {
.dbline 124
; if(state==ST_GET_DATA) {
movw R24,R14
cpi R24,5
ldi R30,240
cpc R25,R30
brne L24
.dbline 124
.dbline 125
; msg_buffer[i++] = t;
ldd R2,y+1
ldd R3,y+2
movw R24,R2
adiw R24,1
std y+2,R25
std y+1,R24
ldi R24,<_msg_buffer
ldi R25,>_msg_buffer
movw R30,R2
add R30,R24
adc R31,R25
std z+0,R20
.dbline 126
; checksum ^= t;
eor R12,R20
.dbline 127
; if(i==msg_size) {
ldd R0,y+1
ldd R1,y+2
cp R0,R22
cpc R1,R23
brne L25
.dbline 127
.dbline 128
; state = ST_GET_CHECK;
ldi R24,61446
ldi R25,240
movw R14,R24
.dbline 129
; }
.dbline 130
; }
rjmp L25
L24:
.dbline 131
; else {
.dbline 132
; if(state==ST_GET_CHECK) {
movw R24,R14
cpi R24,6
ldi R30,240
cpc R25,R30
brne L28
.dbline 132
.dbline 133
; if(t==checksum) {
cp R20,R12
brne L30
.dbline 133
.dbline 134
; process_command(seq_num);
ldd R16,y+0
rcall _process_command
.dbline 135
; }
L30:
.dbline 136
; state = ST_START;
ldi R24,61440
ldi R25,240
movw R14,R24
.dbline 137
; }
L28:
.dbline 138
; }
L25:
.dbline 139
; }
L21:
.dbline 140
; }
L19:
.dbline 141
; }
L17:
.dbline 142
; }
L15:
.dbline 143
; }
L11:
.dbline 144
; }
L8:
.dbline 145
L6:
.dbline 82
rjmp L5
X0:
.dbline -2
L2:
adiw R28,3
.dbline 0 ; func end
ret
.dbsym l i 1 i
.dbsym r msg_size 22 i
.dbsym l seq_num 0 c
.dbsym r checksum 12 c
.dbsym r t 20 c
.dbsym r state 14 i
.dbsym r rec_data 10 I
.dbend
.dbfunc e adc_get _adc_get fc
; n -> R16
.even
_adc_get::
.dbline -1
.dbline 156
; }
; }
;
; /**
; Returns the value of the selected adc channel
;
; @param n Number of ADC channel
;
; @return Value of ADC channel
; */
; unsigned char adc_get(char n)
; {
.dbline 157
; ADMUX&=0xF0;
lds R24,124
andi R24,240
sts 124,R24
.dbline 158
; ADMUX|=n&0x7;
mov R24,R16
andi R24,7
lds R2,124
or R2,R24
sts 124,R2
L33:
.dbline 160
L34:
.dbline 160
;
; while(ADCSRA&0x40);
lds R2,122
sbrc R2,6
rjmp L33
.dbline 161
; ADCSRA|=(1<<ADSC);
lds R24,122
ori R24,64
sts 122,R24
L36:
.dbline 162
L37:
.dbline 162
; while(ADCSRA&0x40);
lds R2,122
sbrc R2,6
rjmp L36
.dbline 164
;
; return ADCH;
lds R16,121
.dbline -2
L32:
.dbline 0 ; func end
ret
.dbsym r n 16 c
.dbend
.dbfunc e process_command _process_command fV
; mode -> R14
; block_size -> R10,R11
; start_address -> y+6
; polling_address -> y+2
; tmp -> y+13
; cmd -> y+12
; num_bytes -> y+10
; i -> R12,R13
; seq_num -> y+24
.even
_process_command::
st -y,r17
st -y,r16
rcall push_gset5
sbiw R28,14
.dbline -1
.dbline 173
; }
;
; /**
; Processes a command packet received in main loop and located in the global buffer
;
; @param seq_num The sequence number of the command packet
; */
; void process_command(unsigned char seq_num)
; {
.dbline 175
; unsigned char cmd;
; unsigned char tmp=0;
clr R0
std y+13,R0
.dbline 179
; unsigned char mode;
; unsigned int block_size;
; unsigned int i;
; unsigned int num_bytes=0;
clr R1
std y+11,R1
std y+10,R0
.dbline 180
; unsigned long polling_address=0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+2,R20
std z+3,R21
std z+4,R22
std z+5,R23
.dbline 181
; unsigned long start_address = address;
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
movw R30,R28
std z+6,R2
std z+7,R3
std z+8,R4
std z+9,R5
.dbline 183
;
; cmd = msg_buffer[0];
lds R2,_msg_buffer
std y+12,R2
.dbline 188
;
; //////////////////////////////////////
; //CMD_SIGN_ON
; //////////////////////////////////////
; if(cmd==CMD_SIGN_ON)
mov R24,R2
cpi R24,1
brne L40
.dbline 189
; {
.dbline 190
; num_bytes = 11;
ldi R24,11
ldi R25,0
std y+11,R25
std y+10,R24
.dbline 191
; msg_buffer[0] = CMD_SIGN_ON;
ldi R24,1
sts _msg_buffer,R24
.dbline 192
; msg_buffer[1] = STATUS_CMD_OK;
clr R2
sts _msg_buffer+1,R2
.dbline 193
; msg_buffer[2] = 8;
ldi R24,8
sts _msg_buffer+2,R24
.dbline 194
; memcpy(msg_buffer+3,"AVRISP_2",8);
std y+1,R25
std y+0,R24
ldi R18,<L45
ldi R19,>L45
ldi R16,<_msg_buffer+3
ldi R17,>_msg_buffer+3
rcall _memcpy
.dbline 195
; }
rjmp L41
L40:
.dbline 199
; //////////////////////////////////////
; //CMD_SET_PARAMETER
; //////////////////////////////////////
; else if(cmd==CMD_SET_PARAMETER)
ldd R24,y+12
cpi R24,2
breq X7
rjmp L46
X7:
.dbline 200
; {
.dbline 201
; switch(msg_buffer[1])
lds R10,_msg_buffer+1
clr R11
movw R24,R10
cpi R24,152
ldi R30,0
cpc R25,R30
breq L52
cpi R24,152
ldi R30,0
cpc R25,R30
brge X8
rjmp L48
X8:
L77:
movw R24,R10
cpi R24,158
ldi R30,0
cpc R25,R30
brne X9
rjmp L73
X9:
cpi R24,159
ldi R30,0
cpc R25,R30
brne X10
rjmp L75
X10:
rjmp L48
X3:
.dbline 202
; {
L52:
.dbline 204
; case PARAM_SCK_DURATION:
; clock_speed=SPI_SPEED_2MHZ;
ldi R24,1
sts _clock_speed,R24
.dbline 205
; if((msg_buffer[2]) >= 1 ) clock_speed=SPI_SPEED_2MHZ;
lds R24,_msg_buffer+2
cpi R24,1
brlo L53
.dbline 205
ldi R24,1
sts _clock_speed,R24
L53:
.dbline 206
; if((msg_buffer[2]) >= 2 ) clock_speed=SPI_SPEED_1MHZ;
lds R24,_msg_buffer+2
cpi R24,2
brlo L56
.dbline 206
ldi R24,2
sts _clock_speed,R24
L56:
.dbline 207
; if((msg_buffer[2]) >= 4 ) clock_speed=SPI_SPEED_500KHZ;
lds R24,_msg_buffer+2
cpi R24,4
brlo L59
.dbline 207
ldi R24,3
sts _clock_speed,R24
L59:
.dbline 208
; if((msg_buffer[2]) >= 8 ) clock_speed=SPI_SPEED_250KHZ;
lds R24,_msg_buffer+2
cpi R24,8
brlo L62
.dbline 208
ldi R24,4
sts _clock_speed,R24
L62:
.dbline 209
; if((msg_buffer[2]) >= 16 ) clock_speed=SPI_SPEED_125KHZ;
lds R24,_msg_buffer+2
cpi R24,16
brlo L65
.dbline 209
ldi R24,5
sts _clock_speed,R24
L65:
.dbline 210
; if((msg_buffer[2]) >= 32 ) clock_speed=SPI_SPEED_62KHZ;
lds R24,_msg_buffer+2
cpi R24,32
brlo L68
.dbline 210
ldi R24,6
sts _clock_speed,R24
L68:
.dbline 212
; //if(eeprom_read_byte(&eeprom_sck_period)!=clock_speed) eeprom_write_byte(&eeprom_sck_period,clock_speed);
; if (eeprom_sck_period != clock_speed) {
lds R2,_clock_speed
lds R3,_eeprom_sck_period
cp R3,R2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?