📄 main.s
字号:
.module main.c
.area data(ram, con, rel)
_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
_sync_count::
.blkb 2
.area idata
.word 60
.area data(ram, con, rel)
.area text(rom, con, rel)
.even
_identifier_init::
; /*簇头1
; * main_frame:
; * init_device
; * init_port
; * init_led
; * init_timer
; * init_RF
; * init_uart
; * init_schedule
; * start_myprogram
; * main_schedule
; */
; //ICC-AVR application builder : 2006-9-26 20:14:28
; // Target : M128
; // Crystal: 7.3728Mhz
;
; #include <iom128v.h>
; #include <macros.h>
; #include <stdio.h>
; #include "../api/schedule.h"
; #include "../api/cc1100.h"
; #include "../api/led.h"
; #include "../api/timer.h"
; #include "../api/comm.h"
; #include "../api/cc1100_reg.h"
;
; #define SYNC_INTVL 500 //同步间隙50ms
; #define DATA_TRANS_INTVL 500 //重发数据间隙50ms
; #define CHANGE_CHAN_INTVL 12000
; #define COMM_MSG_LENGTH 31
; #define NODE_MSG_LENGTH 11 //node发送的包长度,ack长度
; #define LOCAL_GID 2
; #define LOCAL_ID 0 //簇头节点号为0
; #define CLUSTER_QUANTITY 2 //簇头总数
; #define NODE_QUANTITY 2 //一个簇内node总数
;
;
; //char a[4]={3,1,2,3};
; //unsigned char recvBuff[128];
; COMM_MSG recv,pre_trans; //存放簇内节点的信息
; NODE_MSG ack;
; unsigned char local_buff[8]; //本地存放所有节点的信息,节点号1byte+温度1byte+电压2byte
; unsigned char flag[NODE_QUANTITY]={0};
; unsigned char sync_Cflag; //cluster同步是否完成的标志
; unsigned char sync_Nflag; //cluster是否对本簇内node完成同步的标志
; unsigned char counter_sync; //cluster向node发送同步的次数
; unsigned char counter_data; //cluster向sink发送数据的次数
; unsigned char change_channel;
;
; unsigned int sync_count =60;
;
; unsigned char *ackack;
;
; //unsigned char test;
;
; void identifier_init()
; {
; sync_Cflag=0;
clr R2
sts _sync_Cflag,R2
; sync_Nflag=0;
sts _sync_Nflag,R2
; counter_sync=0;
sts _counter_sync,R2
; counter_data=0;
sts _counter_data,R2
; change_channel=0x0A;
ldi R24,10
sts _change_channel,R24
; pre_trans.len=COMM_MSG_LENGTH;
ldi R24,31
sts _pre_trans,R24
; pre_trans.ID=LOCAL_ID;
sts _pre_trans+1,R2
; pre_trans.GID=LOCAL_GID;
ldi R24,2
sts _pre_trans+2,R24
; pre_trans.DA=0;
clr R3
sts _pre_trans+3+1,R3
sts _pre_trans+3,R2
; pre_trans.type=CLUSTER_DATA;
ldi R24,60
sts _pre_trans+5,R24
L4:
.dbline 0 ; func end
ret
.even
_tras_ack::
;
; //test=0;
; //pre_trans.SeqNO=1;
; }
;
; void tras_ack()
; {
; CC1100_send(ackack,COMM_MSG_LENGTH+1);
ldi R18,32
lds R16,_ackack
lds R17,_ackack+1
xcall _CC1100_send
; printf("done\n");
ldi R16,<L10
ldi R17,>L10
xcall _printf
L9:
.dbline 0 ; func end
ret
; data -> R18,R19
; addr -> R16,R17
.even
_eeprom_write::
; }
;
; void eeprom_write(unsigned int addr,unsigned int data)
; {
L12:
L13:
; while(EECR&(1<<EEWE));
sbic 0x1c,1
rjmp L12
; EEAR=addr;
out 0x1f,R17
out 0x1e,R16
; EEDR=data;
out 0x1d,R18
; EECR|=(1<<EEMWE);
sbi 0x1c,2
; EECR|=(1<<EEWE);
sbi 0x1c,1
L11:
.dbline 0 ; func end
ret
; addr -> R16,R17
.even
_eeprom_read::
; }
;
; unsigned char eeprom_read(unsigned int addr)
; {
L16:
L17:
; while(EECR&(1<<EEWE));
sbic 0x1c,1
rjmp L16
; EEAR=addr;
out 0x1f,R17
out 0x1e,R16
; EECR|=(1<<EERE);
sbi 0x1c,0
; return EEDR;
in R16,0x1d
L15:
.dbline 0 ; func end
ret
.even
_CC1100_sendDone::
; }
;
;
; unsigned char CC1100_sendDone()
; {
L19:
.dbline 0 ; func end
ret
; nodeID -> R22
; msg -> R22,R23
; m -> R20,R21
.even
_CC1100_receive::
xcall push_gset2
; //led0Toggle();
; //printf("send ack\n");
; }
;
; extern unsigned char rxBuffer[32]; //接收缓冲区的大小
; void CC1100_receive()
; {
; unsigned char nodeID;
; unsigned char *msg = &rxBuffer[0];
ldi R22,<_rxBuffer
ldi R23,>_rxBuffer
; NODE_MSG *m;
;
; m=(NODE_MSG*)msg; //转化为COMM_MSG类型
movw R20,R22
; //printf("the received type is %d",m->type);
; switch(m->type)
movw R30,R20
ldd R22,z+5
clr R23
cpi R22,50
ldi R30,0
cpc R23,R30
brne X2
xjmp L36
X2:
ldi R24,50
ldi R25,0
cp R24,R22
cpc R25,R23
brlt L54
L53:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L24
cpi R22,3
ldi R30,0
cpc R23,R30
brne X3
xjmp L35
X3:
xjmp L20
L54:
cpi R22,60
ldi R30,0
cpc R23,R30
brne X4
xjmp L50
X4:
xjmp L20
X0:
; {
L24:
; /*case(SINK_INIT_NODE):
; LOCAL_ID = m->data[0];
; eeprom_write(0,LOCAL_ID);
; LOCAL_GID = m->data[1];
; eeprom_write(0,LOCAL_GID);
; T=m->data[2];
; eeprom_write(0,T);
; node_num =m->data[3];
; eeprom_write(0,node_num);
; ALARM_TMP = m->data[4];
; eeprom_write(0,ALARM_TMP);
; // work_channel = m->data[5];//根据节点组号判断就可以
; // 存储配置信息
; break;*/
;
; case(SINK_CLUSTER_SYNC):
; {
; switch(m->data[0])
movw R30,R20
ldd R22,z+6
clr R23
cpi R22,1
ldi R30,0
cpc R23,R30
breq L28
cpi R22,2
ldi R30,0
cpc R23,R30
breq L29
cpi R22,3
ldi R30,0
cpc R23,R30
breq L32
xjmp L20
X1:
; {
L28:
; case 1: //第一次同步消息,时间同步,设定定时器,并置标志位
; halSpiWriteReg(CCxxx0_CHANNR, 2*LOCAL_GID-1+0xa);
ldi R18,13
ldi R16,10
xcall _halSpiWriteReg
; start_T1(0,3*SYNC_INTVL+1000); //设定计时器,等待sink三次同步发送完毕,1s后发送同步
ldi R18,2500
ldi R19,9
clr R16
xcall _start_T1
; sync_Cflag=1;
ldi R24,1
sts _sync_Cflag,R24
; break;
xjmp L20
L29:
;
; case 2: //如果第一次没有同步,进行处理,否则,不处理
; if(sync_Cflag==0)
lds R2,_sync_Cflag
tst R2
breq X5
xjmp L20
X5:
; {
; halSpiWriteReg(CCxxx0_CHANNR, 2*LOCAL_GID-1+0xa);
ldi R18,13
ldi R16,10
xcall _halSpiWriteReg
; start_T1(0,2*SYNC_INTVL+1000);
ldi R18,2000
ldi R19,7
clr R16
xcall _start_T1
; sync_Cflag=1;
ldi R24,1
sts _sync_Cflag,R24
; }
; break;
xjmp L20
L32:
;
; case 3:
; if(sync_Cflag==0)
lds R2,_sync_Cflag
tst R2
breq X6
xjmp L20
X6:
; {
; halSpiWriteReg(CCxxx0_CHANNR, 2*LOCAL_GID-1+0xa);
ldi R18,13
ldi R16,10
xcall _halSpiWriteReg
; start_T1(0,SYNC_INTVL+1000);
ldi R18,1500
ldi R19,5
clr R16
xcall _start_T1
; sync_Cflag=1;
ldi R24,1
sts _sync_Cflag,R24
; }
; break;
; default:break;
; }
; }
; break;
xjmp L20
L35:
;
; case(CLUSTER_ACK): //收到sink的ack,取消重发
; stop_T2();
xcall _stop_T2
; counter_data=0;
clr R2
sts _counter_data,R2
; break;
xjmp L20
L36:
;
; case(NODE_DATA): //保存数据,并发送ACK
;
; //if(m->DA==0x0100)
; {
; //printf("%d\n",m->ID);
; //printf("%d\n",m->data[1]);
; //printf("%d\n",m->data[2]);
; //printf("%d\n",m->data[3]);
;
; nodeID=m->ID;
movw R30,R20
ldd R22,z+1
; printf("%d\n",nodeID);
mov R18,R22
clr R19
ldi R16,<L37
ldi R17,>L37
xcall _printf
; local_buff[4*(nodeID-1)]=m->ID;
ldi R24,4
mul R24,R22
movw R30,R0
ldi R24,<_local_buff-4
ldi R25,>_local_buff-4
add R30,R24
adc R31,R25
movw R26,R20
adiw R26,1
ld R2,x
std z+0,R2
; local_buff[4*(nodeID-1)+1]=m->data[1];
ldi R24,4
mul R24,R22
movw R30,R0
ldi R24,<_local_buff+1-4
ldi R25,>_local_buff+1-4
add R30,R24
adc R31,R25
movw R26,R20
adiw R26,7
ld R2,x
std z+0,R2
; local_buff[4*(nodeID-1)+2]=m->data[2];
ldi R24,4
mul R24,R22
movw R30,R0
ldi R24,<_local_buff+2-4
ldi R25,>_local_buff+2-4
add R30,R24
adc R31,R25
movw R26,R20
adiw R26,8
ld R2,x
std z+0,R2
; local_buff[4*(nodeID-1)+3]=m->data[3];
ldi R24,4
mul R24,R22
movw R30,R0
ldi R24,<_local_buff+3-4
ldi R25,>_local_buff+3-4
add R30,R24
adc R31,R25
movw R26,R20
adiw R26,9
ld R2,x
std z+0,R2
;
; flag[nodeID-1]=0;
ldi R24,<_flag-1
ldi R25,>_flag-1
mov R30,R22
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
;
; ack.len=NODE_MSG_LENGTH;
ldi R24,11
sts _ack,R24
; ack.ID=LOCAL_ID;
sts _ack+1,R2
; ack.GID=LOCAL_GID;
ldi R24,2
sts _ack+2,R24
; ack.DA=((LOCAL_GID <<8)&0xff00)+nodeID;
mov R24,R22
clr R25
subi R24,0 ; offset = 512
sbci R25,254
sts _ack+3+1,R25
sts _ack+3,R24
; ack.type=NODE_ACK;
ldi R24,4
sts _ack+5,R24
; //ack.data[0]=recv.data[0];
; ackack=(unsigned char*)(&ack.len); //强制转化
ldi R24,<_ack
ldi R25,>_ack
sts _ackack+1,R25
sts _ackack,R24
; CC1100_send(ackack,NODE_MSG_LENGTH+1);
ldi R18,12
movw R16,R24
xcall _CC1100_send
; }
; break;
xjmp L20
L50:
;
; case(CLUSTER_DATA): //未收到同步,根据收到的其他簇头信息进行同步
; if (!sync_Cflag)
lds R2,_sync_Cflag
tst R2
brne L20
; {
; //if(LOCAL_GID > m->GID) //下轮进行同步
; counter_sync =3;
ldi R24,3
sts _counter_sync,R24
; start_T1(0,CHANGE_CHAN_INTVL-(m->GID*3000)-(m->data[0]*DATA_TRANS_INTVL));
movw R30,R20
ldd R18,z+2
clr R19
ldi R16,3000
ldi R17,11
xcall empy16s
ldi R24,12000
ldi R25,46
sub R24,R16
sbc R25,R17
movw R30,R20
ldd R18,z+6
clr R19
ldi R16,500
ldi R17,1
xcall empy16s
sub R24,R16
sbc R25,R17
movw R18,R24
clr R16
xcall _start_T1
; sync_Cflag=1;
ldi R24,1
sts _sync_Cflag,R24
; //start_T0(0,CHANGE_CHAN_INTVL-(LOCAL_GID+1-m->GID)*3000);
; //else
; //start_T0(0,(CLUSTER_QUANTITY-m->GID+1)*3000+CHANGE_CHAN_INTVL);
; }
; break;
; default:break;
; }
; return ;
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.even
_port_init::
; }
;
;
; void port_init(void)
; {
; //cc1100
; /* IN G1 o
; GD0O D1 i
; CSN C2 o
; SCLK G0 o
; OUT C1 i
; */
; //led
; /* led0 C4 o
; led1 C5 o
; led2 C6 o
; */
;
; PORTA = 0x00;
clr R2
out 0x1b,R2
; DDRA = 0x00;
out 0x1a,R2
; PORTB = 0x00;
out 0x18,R2
; DDRB = 0x00;
out 0x17,R2
; PORTC = 0x00; //m103 output only
out 0x15,R2
; DDRC = 0x74;
ldi R24,116
out 0x14,R24
; PORTD = 0x00;
out 0x12,R2
; DDRD = 0x00;
out 0x11,R2
; PORTE = 0x00;
out 0x3,R2
; DDRE = 0x00;
out 0x2,R2
; PORTF = 0x00;
sts 98,R2
; DDRF = 0x00;
sts 97,R2
; PORTG = 0x00;
sts 101,R2
; DDRG = 0x03;
ldi R24,3
sts 100,R24
L55:
.dbline 0 ; func end
ret
.even
_uart0_init::
; }
;
;
;
; //UART0 initialize
; // desired baud rate: 57600
; // actual: baud rate:57600 (0.0%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
; UCSR0B = 0x00; //disable while setting baud rate
clr R2
out 0xa,R2
; UCSR0A = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -