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

📄 uart.s

📁 cc1020 串口通讯
💻 S
📖 第 1 页 / 共 4 页
字号:
	.module uart.c
	.area lit(rom, con, rel)
_DefaultConfig433::
	.byte 15,255
	.byte 143,58
	.byte 16,1
	.byte 57,58
	.byte 26,171
	.byte 57,'D
	.byte 'P,187
	.byte 'F,37
	.byte 'a,'U
	.byte 45,41
	.byte 32,'x
	.byte 'G,20
	.byte 34,174
	.byte 52,15
	.byte 0,0
	.byte 0,0
	.area data(ram, con, rel)
_PA_POWER::
	.blkb 1
	.area idata
	.byte 240
	.area data(ram, con, rel)
_RXANALOG::
	.blkb 1
	.area idata
	.byte 71
	.area data(ram, con, rel)
_TXANALOG::
	.blkb 1
	.area idata
	.byte 71
	.area data(ram, con, rel)
	.area text(rom, con, rel)
	.even
_Initial::
; #include <iom8v.h>
; #include "Includes.h"
; #include"uart.h"
; #define fosc 8000000 //晶振8.0000MHZ
; #define baud 4800	 //波特率
; #define maxdata 20000  //采集的最大数值
; #define voltagedata		0x01	//电压伏值 3个字节
; #define currentdata		0x02	//电流伏值 3个字节
; #define entercomm		0x56    //确认帧 0字节
; 
; #define addressper		0x10	//本机地址
; // LOCK status definitions
; #define  LOCK_NOK         0x00
; #define  LOCK_OK          0x01
; #define  LOCK_RECAL_OK    0x02
; #define uchar			unsigned char
; // Maximum number of re-calibration attempts upon calibration failure
; #define CAL_ATTEMPT_MAX   4
; // Time-out values
; #define CAL_TIMEOUT    0x7FFE
; #define LOCK_TIMEOUT   0x7FFE
; const unsigned char DefaultConfig433[32] =
; {
;   0x0F,  // 0x01, INTERFACE
;   0xFF,  // 0x02, RESET
;   0x8F,  // 0x03, SEQUENCING
; 
;   0x3A,  // 0x04, FREQ_2A
;   0x10,  // 0x05, FREQ_1A
;   0x01, // 0x06, FREQ_0A
;   0x39,  // 0x0B, CLOCK_A 19.2K
; 
;   0x3A,  // 0x08, FREQ_2B
;   0x1A,  // 0x09, FREQ_1B
;   0xAB,  // 0x0A, FREQ_0B
;   0x39,  // 0x0B, CLOCK_A 19.2K
;   0x44,  // 0x0C, VCO
;   0x50,  // 0x0D, MODEM
;   0xbb, // 0x0E, DEVIATION
;   0x46,  // 0x0F, AFC_CONTROL
;   0x25,  // 0x10, FILTER
;   0x61,  // 0x11, VGA1
;   0x55,  // 0x12, VGA2
;   0x2d,  // 0x13, VGA3
;   0x29, // 0x14, VGA4
;   0x20,  // 0x15, LOCK
;   0x78,  // 0x16, FRONTEND
;   0x47,  // 0x17, ANALOG, RX=47/TX=47
;   0x14,  // 0x18, BUFF_SWING
;   0x22,  // 0x19, BUFF_CURRENT
;   0xAE,  // 0x1A, PLL_BW
;   0x34,  // 0x1B, CALIBRATE
;   0x0f, // 0x1C, PA_POWER
;   0x00,  // 0x1D, MATCH
;   0x00,  // 0x1E, PHASE_COMP
;   0x00,  // 0x1F, GAIN_COMP
;   0x00   // 0x20, POWERDOWN
;  };
; unsigned char boolval,retrn_val,looptmp;
; char bool_val;
; char PA_POWER=0xF0;
; char RXANALOG=0x47;
; char TXANALOG=0x47;	
; uchar rcv1[50];
; uchar rcvd1,rscnt11,rscnt12,rscnt13,rscnt01,xx0,xx1;
; 
; uchar rsok00,rsok10,rsok20,rsok30,rsok40;
; //extern unsigned char read_flash(unsigned int add);
; uchar w1;
; uchar databak[3],datawn2[3];
; 
; /* 串口通讯变量定义 */
; 
; uchar Tx_Rx,Rx_Time;
; 
; /*--------------------------------------------------------------------------------------------------
;                                             变量定义
; --------------------------------------------------------------------------------------------------*/ 
; 
; //********量程切换********//
; INT8U  	Rx_Time;                       		// 通讯间隔时间
; 
; /* 数字滤波 */
; INT16U Vwn_Buf[13];
; /*--------------------------------------------------------------------------------------------------
;                                             函数定义
; --------------------------------------------------------------------------------------------------*/ 
; void Initial ( void )
; {	
;   Rx_Time    	= 0;// 通讯间隔时间
	clr R2
	sts _Rx_Time,R2
L1:
	.dbline 0 ; func end
	ret
	.even
_watchdog_init::
; }
; 
; 
; //Watchdog initialize
; // prescale: 2048K
; void watchdog_init(void)
; {
;  	WDR(); //this prevents a timout on enabling
	wdr
;  	WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
	ldi R24,15
	out 0x21,R24
L2:
	.dbline 0 ; func end
	ret
;              c -> R16
	.even
_putchar::
; }
; 
; 
; /*  		字符输出函数 		 */
; void putchar(uchar c)
; {	 
L4:
L5:
;      while (!(UCSRA&(1<<UDRE)));
	sbis 0xb,5
	rjmp L4
; 	 UDR=c;    
	out 0xc,R16
L3:
	.dbline 0 ; func end
	ret
	.even
_timer0_init::
; }
; 
; 
; //TIMER0 initialize - prescale:256
; // desired value: 5mSec
; // actual value:  4.965mSec (0.7%)
; void timer0_init(void)
; {
;  	TCCR0 = 0x00; //stop
	clr R2
	out 0x33,R2
;  	TCNT0 = 0x71; //set count
	ldi R24,113
	out 0x32,R24
;  	TCCR0 = 0x04; //start timer
	ldi R24,4
	out 0x33,R24
L7:
	.dbline 0 ; func end
	ret
	.area vector(rom, abs)
	.org 18
	rjmp _timer0_ovf_isr
	.area text(rom, con, rel)
	.even
_timer0_ovf_isr::
	st -y,R24
	in R24,0x3f
	st -y,R24
; }
; 
; 
; #pragma interrupt_handler timer0_ovf_isr:10
; void timer0_ovf_isr(void)
; {
; 	TCNT0 = 0x71; 	//reload counter value
	ldi R24,113
	out 0x32,R24
; 	//AD转换 		
; 	WDR();// 喂狗                
	wdr
L8:
	ld R24,y+
	out 0x3f,R24
	ld R24,y+
	.dbline 0 ; func end
	reti
	.even
_timer1_init::
;  	
; }
; 
; //TIMER1 initialize - prescale:Rising edge
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 1Hz
; // actual value: Out of range
; void timer1_init(void)
; {
;  	TCCR1B = 0x00; //stop
	clr R2
	out 0x2e,R2
;  	TCNT1H = 0x00 /*INVALID SETTING*/; //setup
	out 0x2d,R2
;  	TCNT1L = 0x00 /*INVALID SETTING*/;
	out 0x2c,R2
;  	OCR1AH = 0x00 /*INVALID SETTING*/;
	out 0x2b,R2
;  	OCR1AL = 0x00 /*INVALID SETTING*/;
	out 0x2a,R2
;  	OCR1BH = 0x00 /*INVALID SETTING*/;
	out 0x29,R2
;  	OCR1BL = 0x00 /*INVALID SETTING*/;
	out 0x28,R2
;  	ICR1H  = 0x00 /*INVALID SETTING*/;
	out 0x27,R2
;  	ICR1L  = 0x00 /*INVALID SETTING*/;
	out 0x26,R2
;  	TCCR1A = 0x00;
	out 0x2f,R2
;  	TCCR1B = 0x06; //start Timer
	ldi R24,6
	out 0x2e,R24
L9:
	.dbline 0 ; func end
	ret
	.even
_timer2_init::
; }
; 
; //TIMER2 initialize - prescale:32
; // WGM: Normal
; // desired value: 1mSec
; // actual value:  0.998mSec (0.2%)
; void timer2_init(void)
; {
;  	TCCR2 = 0x00; //stop
	clr R2
	out 0x25,R2
;  	ASSR  = 0x00; //set async mode
	out 0x22,R2
;  	TCNT2 = 0x1A; //setup
	ldi R24,26
	out 0x24,R24
;  	OCR2  = 0xE6;
	ldi R24,230
	out 0x23,R24
;  	TCCR2 = 0x03; //start
	ldi R24,3
	out 0x25,R24
L10:
	.dbline 0 ; func end
	ret
	.area vector(rom, abs)
	.org 8
	rjmp _timer2_ovf_isr
	.area text(rom, con, rel)
	.even
_timer2_ovf_isr::
	st -y,R2
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
; }
; 
; #pragma interrupt_handler timer2_ovf_isr:5
; void timer2_ovf_isr(void)
; {
;  	TCNT2 = 0x1A; //reload counter value
	ldi R24,26
	out 0x24,R24
; 
; 	/* 通讯数据间隔判断*/
; 
; 	if(Tx_Rx == 0)			// 通讯
	lds R2,_Tx_Rx
	tst R2
	brne L12
; 	{
;     	if(++Rx_Time > 40)					// 间隔时间大于40ms后判断为接收超时
	lds R24,_Rx_Time
	subi R24,255    ; addi 1
	mov R2,R24
	sts _Rx_Time,R2
	ldi R24,40
	cp R24,R2
	brsh L14
;         {
;             	Tx_Rx       = 2;			// 接收结束;
	ldi R24,2
	sts _Tx_Rx,R24
;             	Rx_Time     = 0;
	clr R2
	sts _Rx_Time,R2
; 				rsok00=0;
	sts _rsok00,R2
; 				rsok10=0;
	sts _rsok10,R2
; 				rsok20=0;
	sts _rsok20,R2
; 				rsok30=0;
	sts _rsok30,R2
; 				rsok40=0;
	sts _rsok40,R2
; 				rscnt01=0;
	sts _rscnt01,R2
; 				rscnt11=0;	
	sts _rscnt11,R2
; 				rscnt12=0x00;
	sts _rscnt12,R2
;  				rscnt13=0x00;
	sts _rscnt13,R2
;         }
L14:
;        	else
;     	{}
L15:
; 	}
L12:
L11:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.area vector(rom, abs)
	.org 4
	rjmp _int1_isr
	.area text(rom, con, rel)
	.even
_int1_isr::
; 
; }
; 
; 
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void)
; {
L16:
	.dbline 0 ; func end
	reti
	.even
_init_devices::
;  	 //external interupt on INT1
; }
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
;  	//stop errant interrupts until set up
;  	CLI(); //disable all interrupts
	cli
; 	watchdog_init();
	rcall _watchdog_init
;  	timer0_init();
	rcall _timer0_init
;  	timer1_init();
	rcall _timer1_init
; 	timer2_init();
	rcall _timer2_init
;  	MCUCR  = 0x08;	//INT1的下降沿产生中断
	ldi R24,8
	out 0x35,R24
;  	GICR   = 0x80;	//BOOT区起始地址
	ldi R24,128
	out 0x3b,R24
;  	TIMSK  = 0x41; //timer interrupt sources
	ldi R24,65
	out 0x39,R24
;  	SEI(); //re-enable interrupts
	sei
L17:
	.dbline 0 ; func end
	ret
	.area vector(rom, abs)
	.org 22
	rjmp _uart0_rx_isr
	.area text(rom, con, rel)
	.even
_uart0_rx_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R2,0x3f
	st -y,R2
;  	//all peripherals are now initialized
; }
; 
; 
; 
; //串行接收中断服务程序
; #pragma interrupt_handler uart0_rx_isr:12
; void uart0_rx_isr(void)
; {
; 	if(!(UCSRA& (1<<RXC))) 
	sbic 0xb,7
	rjmp L19
; 		return;
	rjmp L18
L19:
; 	if(rsok00==0){
	lds R2,_rsok00
	tst R2
	brne L21
; 		rcvd1=UDR;
	in R2,0xc
	sts _rcvd1,R2
; 		if(rcvd1==0x55)rscnt01++;
	mov R24,R2
	cpi R24,85
	brne L23
	lds R24,_rscnt01
	subi R24,255    ; addi 1
	sts _rscnt01,R24
	rjmp L24
L23:
; 		else if(rcvd1==0xaa)rscnt01++;
	lds R24,_rcvd1
	cpi R24,170
	brne L25
	lds R24,_rscnt01
	subi R24,255    ; addi 1
	sts _rscnt01,R24
L25:
; 		else{}
L26:
L24:
; 		if((rcvd1==0xaa)&&(rscnt01>=1)){rsok00=1;
	lds R24,_rcvd1
	cpi R24,170
	breq X0
	rjmp L22
X0:
	lds R24,_rscnt01
	cpi R24,1
	brsh X1
	rjmp L22
X1:
	ldi R24,1
	sts _rsok00,R24
; 										rscnt01=0;										
	clr R2
	sts _rscnt01,R2
; 										}
; 				}
	rjmp L22
L21:
; 	else{
; 		if(rsok10==0){
	lds R2,_rsok10
	tst R2
	brne L29
; 
; 			rscnt11=UDR;
	in R2,0xc
	sts _rscnt11,R2
; //    if((rscnt11==addressper)||(rscnt11==0x00))
; 			if(rscnt11==addressper)
	mov R24,R2
	cpi R24,16
	brne L31
; 			{   rsok10=1;
	ldi R24,1
	sts _rsok10,R24
; 				xx0=0;xx1=0;
	clr R2
	sts _xx0,R2
	sts _xx1,R2
; 				xx0=xx0^0x55;
	ldi R24,85
	eor R2,R24
	sts _xx0,R2
; 				xx0=xx0^0xaa;
	ldi R24,170
	ldi R25,0
	clr R3
	eor R2,R24
	eor R3,R25
	sts _xx0,R2
; 				xx0=xx0^rscnt11;
	lds R2,_rscnt11
	lds R3,_xx0
	eor R3,R2
	sts _xx0,R3
; 				Tx_Rx=0;
	clr R2
	sts _Tx_Rx,R2
; 			}
	rjmp L30
L31:
; 			else { rsok00=0;}
	clr R2
	sts _rsok00,R2
; 	      	  		}
	rjmp L30
L29:
; 		else{
; 			if(rsok20==0){
	lds R2,_rsok20
	tst R2
	brne L33
; 				rscnt12=UDR;
	in R2,0xc
	sts _rscnt12,R2
; 				rsok20=1;
	ldi R24,1
	sts _rsok20,R24
; 				xx0=xx0^rscnt12;
	lds R3,_xx0
	eor R3,R2
	sts _xx0,R3
; 						}
	rjmp L34
L33:
; 			else {
; 				if(rsok30==0){
	lds R2,_rsok30
	tst R2
	brne L35
; 		   			rscnt13=UDR;
	in R2,0xc
	sts _rscnt13,R2
; 					rsok30=1;
	ldi R24,1
	sts _rsok30,R24
; 					xx0=xx0^rscnt13;
	lds R3,_xx0
	eor R3,R2
	sts _xx0,R3
; 							}
	rjmp L36
L35:
; 				else{		
; 					rcv1[rscnt01]=UDR;
	ldi R24,<_rcv1
	ldi R25,>_rcv1
	lds R30,_rscnt01
	clr R31
	add R30,R24
	adc R31,R25
	in R2,0xc
	std z+0,R2
; 	       			if(rscnt01<(rscnt13+1)){	xx0=xx0^rcv1[rscnt01];
	lds R24,_rscnt13
	subi R24,255    ; addi 1
	lds R2,_rscnt01
	cp R2,R24
	brsh L37
	ldi R24,<_rcv1
	ldi R25,>_rcv1
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_xx0
	eor R3,R2
	sts _xx0,R3
; 										xx1+=rcv1[rscnt01];
	lds R30,_rscnt01
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_xx1
	add R3,R2
	sts _xx1,R3
; 											}
L37:
; 					if(rscnt01==(rscnt13+1)){
	lds R24,_rscnt13
	subi R24,255    ; addi 1
	lds R2,_rscnt01
	cp R2,R24
	brne L39
; 						if(xx0==rcv1[rscnt01])
	ldi R24,<_rcv1
	ldi R25,>_rcv1
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	lds R3,_xx0
	cp R3,R2
	brne L41
; 						{	rsok40=1;	
	ldi R24,1
	sts _rsok40,R24
; 							Rx_Time	= 0;
	clr R2
	sts _Rx_Time,R2
; 							Tx_Rx   = 2;
	ldi R24,2
	sts _Tx_Rx,R24
; 						}
	rjmp L42
L41:
; 						else {
; 			//	 	   		 UCSRB=UCSRB|0x08;
;                              rsok00=0;
	clr R2
	sts _rsok00,R2
; 							 rsok10=0;
	sts _rsok10,R2
; 							 rsok20=0;
	sts _rsok20,R2
; 							 rsok30=0;
	sts _rsok30,R2
; 							 rsok40=0;
	sts _rsok40,R2
; 							 rscnt01=0;
	sts _rscnt01,R2
; 							 rscnt11=0;		
	sts _rscnt11,R2
; 							 Tx_Rx=2;
	ldi R24,2
	sts _Tx_Rx,R24
; 							 Rx_Time=0;
	sts _Rx_Time,R2
; 							 }
L42:
; 											}
L39:
; 					rscnt01++;
	lds R24,_rscnt01
	subi R24,255    ; addi 1
	sts _rscnt01,R24
; 					}
L36:
; 			}
L34:
; 		}
L30:
; 	}
L22:
L18:
	ld R2,y+
	out 0x3f,R2
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
;          loopi -> R10
;    delay_count -> y+10
	.even
_delay::
	rcall push_arg4
	rcall push_gset3
	sbiw R28,4
; }
; 
; void delay(unsigned long delay_count)
; {
	rjmp L45
L44:
;    unsigned char loopi;
;    while(delay_count-- != 0)
;    {
	clr R10
	rjmp L50
L47:
L48:
	inc R10
L50:
	mov R24,R10
	cpi R24,2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -