📄 main.s
字号:
out 0xb,R2
; UCSR0C = 0x06;
ldi R24,6
sts 149,R24
; UBRR0L = 0x07; //set baud rate lo
ldi R24,7
out 0x9,R24
; UBRR0H = 0x00; //set baud rate hi
sts 144,R2
; UCSR0B = 0x18;
ldi R24,24
out 0xa,R24
L56:
.dbline 0 ; func end
ret
.even
_init_devices::
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
; XDIV = 0x00; //xtal divider
clr R2
out 0x3c,R2
; XMCRA = 0x00; //external memory
sts 109,R2
; port_init(); //端口初始化
xcall _port_init
; led_init(); //所有灯灭
xcall _led_init
; T0_init();
xcall _T0_init
; T2_init();
xcall _T2_init
; T1_init();
xcall _T1_init
; T3_init();
xcall _T3_init
; CC1100_init(); //RF初始化
xcall _CC1100_init
; uart0_init(); //串口初始化
xcall _uart0_init
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
; EICRA = 0x00; //extended ext ints
sts 106,R2
; EICRB = 0x00; //extended ext ints
out 0x3a,R2
; EIMSK = 0x00;
out 0x39,R2
; TIMSK = 0x00; //timer interrupt sources
out 0x37,R2
; ETIMSK = 0x00; //extended timer interrupt sources
sts 125,R2
; SEI(); //re-enable interrupts
sei
L57:
.dbline 0 ; func end
ret
; i -> R20
.even
_T0_timeout::
xcall push_gset1
; //all peripherals are now initialized
; }
;
; void T0_timeout()
; {
; unsigned char i;
; //切换通道定时
; led1Toggle();
xcall _led1Toggle
; if(change_channel==0x0A)
lds R24,_change_channel
cpi R24,10
brne L59
; {
; halSpiWriteReg(CCxxx0_CHANNR, 2*LOCAL_GID-1+0xa); //切换到与node通信
ldi R18,13
ldi R16,10
xcall _halSpiWriteReg
; change_channel=2*LOCAL_GID-1+0xa;
ldi R24,13
sts _change_channel,R24
; // led1On();
; for(i=0;i<NODE_QUANTITY;i++)
clr R20
xjmp L64
L61:
ldi R24,<_flag
ldi R25,>_flag
mov R2,R20
clr R3
add R2,R24
adc R3,R25
movw R30,R2
ldd R24,z+0
subi R24,255 ; addi 1
std z+0,R24
L62:
inc R20
L64:
cpi R20,2
brlo L61
; flag[i]++;
; }
xjmp L60
L59:
; else
; {
; led0Toggle();
xcall _led0Toggle
; halSpiWriteReg(CCxxx0_CHANNR, 0x0A); //切换到与sink通信
ldi R18,10
ldi R16,10
xcall _halSpiWriteReg
; change_channel=0x0A;
ldi R24,10
sts _change_channel,R24
; //start_T3(0,3000*(LOCAL_GID-1)+3000);
; start_T3(0,LOCAL_GID*CHANGE_CHAN_INTVL/(CLUSTER_QUANTITY+2));
ldi R18,6000
ldi R19,23
clr R16
xcall _start_T3
; }
L60:
L58:
xcall pop_gset1
.dbline 0 ; func end
ret
; p -> R20,R21
; m -> R22,R23
; sync_cluster_node -> y+0
.even
_T1_timeout::
xcall push_gset2
sbiw R28,32
; //led2Toggle();
; }
;
; void T1_timeout() //负责同步
; {
; COMM_MSG sync_cluster_node;
; COMM_MSG *m;
; unsigned char *p;
;
; //if(!sync_Nflag)
; //{
; if(counter_sync<3)
lds R24,_counter_sync
cpi R24,3
brsh L66
; {
; counter_sync++;
subi R24,255 ; addi 1
sts _counter_sync,R24
;
; sync_cluster_node.len=COMM_MSG_LENGTH;
ldi R24,31
std y+0,R24
; //sync_cluster_node.ID=LOCAL_ID;
; sync_cluster_node.GID=LOCAL_GID;
ldi R24,2
std y+2,R24
; sync_cluster_node.DA=0xFFFF; //同步的目的地址
ldi R24,65535
ldi R25,255
std y+4,R25
std y+3,R24
; sync_cluster_node.type=CLUSTER_NODE_SYNC;
ldi R24,2
std y+5,R24
; sync_cluster_node.data[0]=counter_sync;
lds R2,_counter_sync
std y+6,R2
; led0Toggle();
xcall _led0Toggle
;
; m = &sync_cluster_node;
movw R22,R28
; p=(unsigned char*)m;
movw R20,R22
;
; CC1100_send(p,COMM_MSG_LENGTH+1);
ldi R18,32
movw R16,R20
xcall _CC1100_send
;
; start_T1(0,SYNC_INTVL); //500ms重发一次同步消息
ldi R18,500
ldi R19,1
clr R16
xcall _start_T1
; }
xjmp L67
L66:
;
; else //簇内同步结束,启动timer1
; {
; //sync_Nflag=1;
; counter_sync =0;
clr R2
sts _counter_sync,R2
; change_channel=2*LOCAL_GID-1+0xa;
ldi R24,13
sts _change_channel,R24
; start_T0(1,CHANGE_CHAN_INTVL); //每CHANGE_CHAN_INTVL切换一次通道
ldi R18,12000
ldi R19,46
ldi R16,1
xcall _start_T0
; //led0Toggle();
; }
L67:
; sync_count --;
lds R24,_sync_count
lds R25,_sync_count+1
sbiw R24,1
sts _sync_count+1,R25
sts _sync_count,R24
; if (sync_count ==0)
cpi R24,0
cpc R24,R25
brne L72
X7:
; {
; counter_sync =0;
clr R2
sts _counter_sync,R2
; start_T1(0,SYNC_INTVL);
ldi R18,500
ldi R19,1
clr R16
xcall _start_T1
; }
L72:
L65:
adiw R28,32
xcall pop_gset2
.dbline 0 ; func end
ret
; recv -> R20,R21
.even
_resend::
xcall push_gset1
; //}
; }
;
; void resend()
; {
; unsigned char *recv;
; recv=(unsigned char*)(&pre_trans.len);
ldi R20,<_pre_trans
ldi R21,>_pre_trans
; counter_data++;
lds R24,_counter_data
subi R24,255 ; addi 1
sts _counter_data,R24
; pre_trans.data[0]=counter_data;
mov R2,R24
sts _pre_trans+6,R2
; CC1100_send(recv,COMM_MSG_LENGTH+1);
ldi R18,32
movw R16,R20
xcall _CC1100_send
L74:
xcall pop_gset1
.dbline 0 ; func end
ret
.even
_T2_timeout::
; }
;
; void T2_timeout() //数据重发时钟
; {
; // unsigned char *recv;
; // recv=(unsigned char*)(&pre_trans.len);
; if(counter_data<3)
lds R24,_counter_data
cpi R24,3
brsh L77
; {
; // counter_data++;
; // pre_trans.SeqNO=counter_data;
; // CC1100_send(recv,COMM_MSG_LENGTH+1);
; post(resend);
ldi R16,<PL_resend
ldi R17,>PL_resend
xcall _post
; start_T2(0,DATA_TRANS_INTVL);
ldi R18,500
ldi R19,1
clr R16
xcall _start_T2
; }
xjmp L78
L77:
; else
; {counter_data=0; stop_T2();}
clr R2
sts _counter_data,R2
xcall _stop_T2
L78:
L76:
.dbline 0 ; func end
ret
; recv -> R22,R23
; i -> R20
.even
_T3_timeout::
xcall push_gset2
; // led0Toggle();
; }
;
; void T3_timeout() //发送簇内数据
; {
; unsigned char *recv;
; unsigned char i;
; for(i=0;i<NODE_QUANTITY;i++)
clr R20
xjmp L83
L80:
; {
; if(flag[i]==3)
ldi R24,<_flag
ldi R25,>_flag
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
cpi R24,3
brne L84
; {
; local_buff[4*i+1]=0;
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_local_buff+1
ldi R25,>_local_buff+1
add R30,R24
adc R31,R25
clr R2
std z+0,R2
; local_buff[4*i+2]=0;
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_local_buff+2
ldi R25,>_local_buff+2
add R30,R24
adc R31,R25
std z+0,R2
; local_buff[4*i+3]=0;
ldi R24,4
mul R24,R20
movw R30,R0
ldi R24,<_local_buff+3
ldi R25,>_local_buff+3
add R30,R24
adc R31,R25
std z+0,R2
; flag[i]=0;
ldi R24,<_flag
ldi R25,>_flag
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
; }
L84:
L81:
inc R20
L83:
cpi R20,2
brsh X8
xjmp L80
X8:
; }
; for(i=1;i<9;i++)
ldi R20,1
xjmp L92
L89:
ldi R24,<_local_buff-1
ldi R25,>_local_buff-1
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_pre_trans+6
ldi R25,>_pre_trans+6
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L90:
inc R20
L92:
cpi R20,9
brlo L89
; pre_trans.data[i]=local_buff[i-1];
; //pre_trans.data[1]=test;
; //test++;
;
; counter_data++;
lds R24,_counter_data
subi R24,255 ; addi 1
sts _counter_data,R24
; pre_trans.data[0]=counter_data;
mov R2,R24
sts _pre_trans+6,R2
;
; recv=(unsigned char*)(&pre_trans.len);
ldi R22,<_pre_trans
ldi R23,>_pre_trans
;
; CC1100_send(recv,COMM_MSG_LENGTH+1);
ldi R18,32
movw R16,R22
xcall _CC1100_send
; //printf("%d",pre_trans.data[1]);
; start_T2(0,DATA_TRANS_INTVL);//启动重发时钟,500ms未收到ack则重发
ldi R18,500
ldi R19,1
clr R16
xcall _start_T2
; led2Toggle();
xcall _led2Toggle
L79:
xcall pop_gset2
.dbline 0 ; func end
ret
; i -> R20,R21
; xtal -> R22,R23
.even
_delay_1ms::
xcall push_gset2
movw R22,R16
; }
;
;
; void delay_1ms(unsigned int xtal)
; {
; unsigned int i;
; for(i=1;i<(unsigned int)(xtal*143-2);i++)
ldi R20,1
ldi R21,0
xjmp L100
L97:
L98:
subi R20,255 ; offset = 1
sbci R21,255
L100:
ldi R16,143
ldi R17,0
movw R18,R22
xcall empy16s
movw R24,R16
sbiw R24,2
cp R20,R24
cpc R21,R25
brlo L97
L96:
xcall pop_gset2
.dbline 0 ; func end
ret
; i -> R20,R21
; n -> R22,R23
.even
_delay_x::
xcall push_gset2
movw R22,R16
; ;
; }
;
; void delay_x(unsigned int n)
; {
; unsigned int i=0;
clr R20
clr R21
; for(i=0;i<n;i++)
xjmp L105
L102:
ldi R16,7
ldi R17,0
xcall _delay_1ms
L103:
subi R20,255 ; offset = 1
sbci R21,255
L105:
cp R20,R22
cpc R21,R23
brlo L102
L101:
xcall pop_gset2
.dbline 0 ; func end
ret
.even
_main::
; delay_1ms(7);
; }
;
;
; void main()
; {
;
; init_devices();
xcall _init_devices
; sched_init();
xcall _sched_init
; identifier_init();
xcall _identifier_init
; CC1100_setInterrupt(0x01); //RF接收状态
ldi R16,1
xcall _CC1100_setInterrupt
xjmp L108
L107:
xcall _run_task
L108:
; //start_T3(1,2000);
; /*
; led0Toggle();
; delay(100);
; led1Toggle();
; delay(100);
; led2Toggle();
; */
; //halSpiWriteReg(CCxxx0_CHANNR, 0x0A);//初始化通道置为A
;
;
; /*my program*/
;
; //CC1100_send(a,4);
; //puts("hello\n");
;
; /*my program end*/
;
; /*schedule*/
; while(1)
xjmp L107
X9:
L106:
.dbline 0 ; func end
ret
.area bss(ram, con, rel)
_ackack::
.blkb 2
_change_channel::
.blkb 1
_counter_data::
.blkb 1
_counter_sync::
.blkb 1
_sync_Nflag::
.blkb 1
_sync_Cflag::
.blkb 1
_local_buff::
.blkb 8
_ack::
.blkb 12
_pre_trans::
.blkb 32
_recv::
.blkb 32
.area data(ram, con, rel)
L37:
.blkb 4
.area idata
.byte 37,'d,10,0
.area data(ram, con, rel)
L10:
.blkb 6
.area idata
.byte 'd,'o,'n,'e,10,0
.area data(ram, con, rel)
.area func_lit
PL_resend: .word `_resend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -