⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.s

📁 mega128平台下
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -