📄 uart.s
字号:
.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 + -