📄 mainbd.s
字号:
.module MainBd.c
.area data(ram, con, rel)
_SendSbuf::
.blkb 10
.area idata
.byte 'C,'F,'C,'F,'C,'F,'M,'M,'x,0
.area data(ram, con, rel)
.blkb 10
.area idata
.byte 0,0,0,0,0,0,0,0,0,0
.area data(ram, con, rel)
.dbfile E:\AVR\P_TEST\MainBd.c
.dbsym e SendSbuf _SendSbuf A[20:20]c
.area lit(rom, con, rel)
_Call::
.byte 'C,'F,'C,'F,'C,'F,'M,'M,'x,0
.dbsym e Call _Call A[10:10]kc
_SET::
.byte 'S,'E,'T,45,0
.dbsym e SET _SET A[5:5]kc
_CF::
.byte 'C,'F,'M,'K,0
.dbsym e CF _CF A[5:5]kc
.area text(rom, con, rel)
.dbfile E:\AVR\P_TEST\MainBd.c
.dbfunc e main _main fV
; k -> <dead>
; test -> <dead>
; j -> <dead>
; i -> R20,R21
.even
_main::
.dbline -1
.dbline 92
; /*
; ******************************************************************************
; 无线数字传送程序
; v1.0
; write by Mr. pan
; All rights reversed
; ******************************************************************************
; */
;
; #include<iom8v.h>
; #include<macros.h>
; #include<eeprom.h>
;
;
; #define baud 9600
; #define fosc 3579545
;
; //--变量声明区---//
; unsigned char Sbufx;
; unsigned char SendSbuf[20]={"CFCFCFMMx"}; //中断发送用的缓冲,发送后清零
; unsigned char krec,ReceiveSbuf[20]; //接收缓冲
; unsigned char *SendPoint,Send_flag;
; unsigned char TimeForCall;
; unsigned int NowSend,TimeForSend;
; unsigned char ICRead;
;
; unsigned char const Call[]={"CFCFCFMMx"};
; //--TIMER0 USE
; unsigned char T0_Count;
; //=========函数声明区=====//
; void initialM8(void);
; void putchar(unsigned char c);
; unsigned char getchar(void);
; void ReadEEPROM();
; void PTR2K_SEND();
; void PTR2K_RECEIVE();
; void WRITEEEPROM();
;
; //========模拟I2C 定义===//
; //SDA-->PC1 ,SCL-->PC4, CS-->PC2 ,RST -->PC5
; //SDA-->PC1
; #define SDAH() (PORTC|=(1<<PC1))
; #define SDAL() (PORTC&=0XFD)
; // SCL-->PC4
; #define SCLH() (PORTC|=(1<<PC4))
; #define SCLL() (PORTC&=0XEF)
; // CS-->PC2
; #define CSL() (PORTC&=0XFB)
; #define CSH() (PORTC|=(1<<PC2))
; // RST -->PC5
; #define RSTL() (PORTC&=0XDF)
; #define RSTH() (PORTC|=(1<<PC5))
; //SDA --输入
; #define SDAIN() (DDRC&=0XDF)
; #define SDAOUT() (DDRC=0XFF)
; //========模拟I2C 函数声明===//
; void I2C_Write(unsigned char addr,unsigned char Wbyte); //1
; unsigned char I2C_Read(unsigned char addr); //2
; unsigned char I2C_ReadByte(); //3
; void I2C_WriteByte(unsigned char WriteByte); //4
; void I2C_NACK(); //6
; void I2C_CACK() ; //5
; void I2C_ACK(); //7
; void I2C_Stop(); //8
; void I2C_Start(); //9
; void sdelay(unsigned char k);
; void I2C_Reset();
;
; void IC_Num_Read();
;
;
; void I2C_CACK();
;
; void putstr(char *s);
; void Timer2_initial();
; unsigned char kr1,kr2;
; char const SET[]={"SET-"};//格式 :SET-001-015-0 Car NO+Dirver NO+CS=0/1
; char const CF[]={"CFMK"}; //接收主机命令
;
; struct node
; {
; char datax;
;
; };
;
; /*============================================================
; MAIN START
; ===========================================================
; */
;
; void main()
; {
.dbline 95
; unsigned int i,j;
; unsigned char test, k;
; initialM8();
rcall _initialM8
.dbline 97
;
; ReadEEPROM();
rcall _ReadEEPROM
.dbline 98
; I2C_Reset();
rcall _I2C_Reset
.dbline 99
; i=0;
clr R20
clr R21
.dbline 101
; //I2C_Write(0,0X40);// test use
; SDAIN();
in R24,0x14
andi R24,223
out 0x14,R24
.dbline 103
; //--主机设定--//
; DDRB=0X03;
ldi R24,3
out 0x17,R24
.dbline 104
; PORTB=0X02;
ldi R24,2
out 0x18,R24
.dbline 106
; // I2C_Write(0,0X33);
; sdelay(250);
ldi R16,250
rcall _sdelay
.dbline 107
; ICRead=0;
clr R2
sts _ICRead,R2
.dbline 109
;
; DDRB=0XFF;
ldi R24,255
out 0x17,R24
.dbline 110
; PORTB=0XFF;
out 0x18,R24
.dbline 114
; //-----------
;
; //--UART initial---//
; UCSRB=(1<<RXEN)|(1<<TXEN); // Enable send and receive
ldi R24,24
out 0xa,R24
.dbline 115
; UBRRL=(fosc/16/(baud+1))%256;
ldi R24,23
out 0x9,R24
.dbline 116
; UBRRH=(fosc/16/(baud+1))/256;
out 0x20,R2
.dbline 117
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
ldi R24,134
out 0x20,R24
.dbline 119
; //---接收中断使能---//
; UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
ldi R24,216
out 0xa,R24
.dbline 121
; //----------
; NowSend=1200;
ldi R24,1200
ldi R25,4
sts _NowSend+1,R25
sts _NowSend,R24
.dbline 122
; SEI();
sei
rjmp L3
L2:
.dbline 124
.dbline 127
ldi R16,250
rcall _sdelay
.dbline 130
ldi R16,<L5
ldi R17,>L5
rcall _SendString2
.dbline 133
clr R2
sts _T0_Count,R2
.dbline 135
ldi R16,250
rcall _sdelay
.dbline 138
ldi R16,250
rcall _sdelay
.dbline 141
L3:
.dbline 123
rjmp L2
X0:
.dbline -2
.dbline 142
; while(1)
; {
; //DDRC=0XFF;
;
; sdelay(250);
; //PORTC=0;
;
; SendString2("12345");
;
; // ----------------------------------------
; T0_Count=0;
;
; sdelay(250);
; //PORTC=0XFF;
;
; sdelay(250);
;
;
; }
; }
L1:
.dbline 0 ; func end
ret
.dbsym l k 1 c
.dbsym l test 1 c
.dbsym l j 1 i
.dbsym r i 20 i
.dbend
.dbfunc e initialM8 _initialM8 fV
.even
_initialM8::
.dbline -1
.dbline 147
; /*==========================================================================//
; END MAIN()
; ============================================================================*/
; void initialM8()
; {
.dbline 151
; //== initial Timer0 as timer ==//
;
; //--UART initial---//
; UCSRB=(1<<RXEN)|(1<<TXEN); // Enable send and receive
ldi R24,24
out 0xa,R24
.dbline 152
; UBRRL=(fosc/16/(baud+1))%256;
ldi R24,23
out 0x9,R24
.dbline 153
; UBRRH=(fosc/16/(baud+1))/256;
clr R2
out 0x20,R2
.dbline 154
; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
ldi R24,134
out 0x20,R24
.dbline 156
; //---接收中断使能---//
; UCSRB=(1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);
ldi R24,216
out 0xa,R24
.dbline 159
;
; //---定时器0初始化---//
; TCCR0=(1<<CS02)|(1<<CS00); // 分频率=fosc/1204
ldi R24,5
out 0x33,R24
.dbline 160
; TIMSK=(1<<TOIE0);
ldi R24,1
out 0x39,R24
.dbline 161
; TCNT0=256-(baud/1024)/20; //定时0.05s
ldi R24,256
ldi R25,1
out 0x32,R24
.dbline 162
; T0_Count=0;
sts _T0_Count,R2
.dbline 164
;
; TimeForCall=0;
sts _TimeForCall,R2
.dbline 166
; //--------------------//
; SEI();
sei
.dbline 167
; DDRC=0XFF;
ldi R24,255
out 0x14,R24
.dbline 168
; PORTC=0;
out 0x15,R2
.dbline 169
; Sbufx=0;
sts _Sbufx,R2
.dbline 171
; //===PTR2000+ CONTROL ==//
; DDRD|=0Xff;
in R24,0x11
ori R24,255
out 0x11,R24
.dbline 172
; PORTD|=0XF0;
in R24,0x12
ori R24,240
out 0x12,R24
.dbline 173
; PORTD&=0XEF;
in R24,0x12
andi R24,239
out 0x12,R24
.dbline 174
; PTR2K_RECEIVE(); //启动定为接收
rcall _PTR2K_RECEIVE
L7:
.dbline 175
L8:
.dbline 175
; while(T0_Count<10);
lds R24,_T0_Count
cpi R24,10
brlo L7
.dbline 176
; putstr("Start 00 \r\n");
ldi R16,<L10
ldi R17,>L10
rcall _putstr
.dbline 177
; PORTC=0;
clr R2
out 0x15,R2
.dbline 179
;
; Sbufx=0;
sts _Sbufx,R2
.dbline 180
; Send_flag=0;
sts _Send_flag,R2
.dbline 181
; Timer2_initial();
.dbline -2
.dbline 183
;
; }
L6:
.dbline 0 ; func end
rjmp _Timer2_initial
.dbend
.dbfunc e putchar _putchar fV
; C -> R16
.even
_putchar::
.dbline -1
.dbline 186
;
; void putchar(unsigned char C)
; {
L12:
.dbline 189
L13:
.dbline 189
; //---关中断发送使能---//
; //UCSRB&=0XDF;
; while(!(UCSRA&(1<<UDRE)));
sbis 0xb,5
rjmp L12
.dbline 190
; UDR=C;
out 0xc,R16
.dbline -2
.dbline 193
; //UCSRB|=0X40;
; //---开中断发送使能--//
; }
L11:
.dbline 0 ; func end
ret
.dbsym r C 16 c
.dbend
.dbfunc e getchar _getchar fc
.even
_getchar::
.dbline -1
.dbline 196
;
; unsigned char getchar(void)
; {
L16:
.dbline 197
L17:
.dbline 197
; while(!(UCSRA&(1<<RXC)));
sbis 0xb,7
rjmp L16
.dbline 198
; return UDR;
in R16,0xc
.dbline -2
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e putstr _putstr fV
; s -> R20,R21
.even
_putstr::
rcall push_gset1
mov R20,R16
mov R21,R17
.dbline -1
.dbline 202
; }
;
; void putstr(char *s)
; {
rjmp L21
L20:
.dbline 204
.dbline 205
mov R30,R20
mov R31,R21
ldd R16,z+0
rcall _putchar
.dbline 206
subi R20,255 ; offset = 1
sbci R21,255
.dbline 208
L21:
.dbline 203
; while(*s)
mov R30,R20
mov R31,R21
ldd R2,z+0
tst R2
brne L20
.dbline -2
.dbline 209
; {
; putchar(*s);
; s++;
;
; }
; }
L19:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r s 20 pc
.dbend
.area vector(rom, abs)
.org 26
rjmp _Send_using_interrupt
.area text(rom, con, rel)
.dbfile E:\AVR\P_TEST\MainBd.c
.dbfunc e Send_using_interrupt _Send_using_interrupt fV
.even
_Send_using_interrupt::
rcall push_lset
.dbline -1
.dbline 214
;
; ///--- 发送 结束中断--硬件自动清零TXC标志位//
; #pragma interrupt_handler Send_using_interrupt:iv_USART_TXC
; void Send_using_interrupt(void)
; {
.dbline 217
;
;
; if(*SendPoint)
lds R30,_SendPoint
lds R31,_SendPoint+1
ldd R2,z+0
tst R2
breq L24
.dbline 218
; {
.dbline 219
; UDR=*SendPoint;
out 0xc,R2
.dbline 220
; Send_flag=1; //用他的 BIT0 记录发送
ldi R24,1
sts _Send_flag,R24
.dbline 222
; //*SendPoint=0;// 清零表明已经发送
; SendPoint++;
mov R24,R30
mov R25,R31
adiw R24,1
sts _SendPoint+1,R25
sts _SendPoint,R24
.dbline 223
; return;
rjmp L23
L24:
.dbline 226
; }
; else
; { //--添加发送结束 标志的代码 here
.dbline 227
; Send_flag=0;
clr R2
sts _Send_flag,R2
.dbline 229
;
; PTR2K_RECEIVE(); //由发送改为接收
rcall _PTR2K_RECEIVE
.dbline 232
;
; //---------选择PC232 发送---PB1=1;-----//
; DDRB=0X03;
ldi R24,3
out 0x17,R24
.dbline 233
; PORTB|=(1<<PB0)|(1<<PB1);
in R24,0x18
ori R24,3
out 0x18,R24
.dbline 235
; //------------------------------
; }
.dbline -2
.dbline 237
;
; }
L23:
rcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e SendString2 _SendString2 fV
; p -> R20,R21
; str10 -> R16,R17
.even
_SendString2::
rcall push_gset1
.dbline -1
.dbline 240
; //--不能超过20个字符
; void SendString2(unsigned char *str10)
; {
.dbline 244
; unsigned char *p;
;
;
; SEI();
sei
L27:
.dbline 245
L28:
.dbline 245
; while(Send_flag>0);//等待中断发送结束
clr R2
lds R3,_Send_flag
cp R2,R3
brlo L27
.dbline 246
; p=SendSbuf;
ldi R20,<_SendSbuf
ldi R21,>_SendSbuf
rjmp L31
L30:
.dbline 248
.dbline 250
mov R30,R16
mov R31,R17
ldd R2,z+0
mov R30,R20
mov R31,R21
std z+0,R2
.dbline 251
subi R20,255 ; offset = 1
sbci R21,255
.dbline 252
subi R16,255 ; offset = 1
sbci R17,255
.dbline 255
L31:
.dbline 247
; while(*str10)
mov R30,R16
mov R31,R17
ldd R2,z+0
tst R2
brne L30
.dbline 258
; {
;
; *p=*str10;
; p++;
; str10++;
;
; //要有超时间判断,防止死循环====??????
; }
; //--开发送中断使能----//
;
; SendPoint=SendSbuf;
ldi R24,<_SendSbuf
ldi R25,>_SendSbuf
sts _SendPoint+1,R25
sts _SendPoint,R24
.dbline 259
; UDR=*SendPoint; //启动发送中断
mov R30,R24
mov R31,R25
ldd R2,z+0
out 0xc,R2
.dbline 260
; SendPoint++;
adiw R24,1
sts _SendPoint+1,R25
sts _SendPoint,R24
L33:
.dbline 261
L34:
.dbline 261
; while(!Send_flag);
lds R2,_Send_flag
tst R2
breq L33
.dbline -2
.dbline 262
; }
L26:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r p 20 pc
.dbsym r str10 16 pc
.dbend
.area vector(rom, abs)
.org 22
rjmp _Receive_using_interrupt
.area text(rom, con, rel)
.dbfile E:\AVR\P_TEST\MainBd.c
.dbfunc e Receive_using_interrupt _Receive_using_interrupt fV
.even
_Receive_using_interrupt::
st -y,R2
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R2,0x3f
st -y,R2
.dbline -1
.dbline 267
;
; //---接收中断--//
; #pragma interrupt_handler Receive_using_interrupt:iv_USART_RX
; void Receive_using_interrupt(void)
; {
.dbline 269
; //"SET- "-- AND --"CF"
; Sbufx=UDR;
in R2,0xc
sts _Sbufx,R2
.dbline 274
;
;
;
;
; if((Sbufx>9)&&(Sbufx<128))
ldi R24,9
cp R24,R2
brsh L37
mov R24,R2
cpi R24,128
brsh L37
.dbline 275
; {
.dbline 276
; if(krec<19) ReceiveSbuf[krec]=Sbufx;
lds R24,_krec
cpi R24,19
brsh L39
.dbline 276
ldi R24,<_ReceiveSbuf
ldi R25,>_ReceiveSbuf
lds R30,_krec
clr R31
add R30,R24
adc R31,R25
std z+0,R2
L39:
.dbline 277
; krec++;
lds R24,_krec
subi R24,255 ; addi 1
sts _krec,R24
.dbline 278
; UDR=Sbufx; ///把收到的马上发送给COMPUTER test only
lds R2,_Sbufx
out 0xc,R2
.dbline 279
; }
L37:
.dbline 281
lds R24,_Sbufx
cpi R24,77
brne L41
ldi R24,101
lds R2,_kr2
cp R24,R2
brsh L41
.dbline 282
.dbline 283
ldi R24,100
sts _kr2,R24
.dbline 284
clr R2
out 0x24,R2
.dbline 285
ldi R24,180
out 0x23,R24
.dbline 290
L41:
.dbline -2
.dbline 292
;
; if((Sbufx=='M')&&(kr2>101)) //--同步定时信号,T2
; {
; kr2=100;
; TCNT2=0;
; OCR2=180; //90;//0.2ms,
; // TimeForSend=0; //30<=>12ms
; // TCCR2=(1<<WGM21)|(1<<CS21); //8分频率 ,TCT比较输出MODE
; //--PTR2000 SEND MODE--//
; //PTR2K_SEND(); //启动发送
; }
;
; }
L36:
ld R2,y+
out 0x3f,R2
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 18
rjmp _Timer0_interrupt
.area text(rom, con, rel)
.dbfile E:\AVR\P_TEST\MainBd.c
.dbfunc e Timer0_interrupt _Timer0_interrupt fV
.even
_Timer0_interrupt::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 299
;
;
; ///====定时器0中断函数====//
; #pragma interrupt_handler Timer0_interrupt:iv_TIMER0_OVF
;
; void Timer0_interrupt(void)
; {
.dbline 300
; TCNT0=238;//256-(baud/1024)/200; //定时0.005s
ldi R24,238
out 0x32,R24
.dbline 301
; T0_Count++;
lds R24,_T0_Count
subi R24,255 ; addi 1
sts _T0_Count,R24
.dbline -2
.dbline 304
;
;
; }
L43:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Timer2_initial _Timer2_initial fV
.even
_Timer2_initial::
.dbline -1
.dbline 308
;
; //--定时器2精确定时用---//
; void Timer2_initial()
; {
.dbline 309
; OCR2=180;//90;//0.2ms--180=>0.4ms
ldi R24,180
out 0x23,R24
.dbline 311
; //=x1;
; TCNT2=0;
clr R2
out 0x24,R2
.dbline 312
; TIMSK|=(1<<OCIE2); //匹配中断使能
in R24,0x39
ori R24,128
out 0x39,R24
.dbline 313
; TCCR2=(1<<WGM21)|(1<<CS21); //8分频率 ,TCT比较输出MODE
ldi R24,10
out 0x25,R24
.dbline 314
; TimeForSend=0;
clr R3
sts _TimeForSend+1,R3
sts _TimeForSend,R2
.dbline -2
.dbline 315
; }
L44:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -