📄 can162.s
字号:
.module CAN162.c
.area text(rom, con, rel)
.dbfile D:\candesignnow\CAN162.c
.dbfunc e delay_1ms _delay_1ms fV
; k -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 23
; //ICC-AVR application builder : 2007-7-21 15:11:59
; // Target : M162
; // Crystal: 16.000Mhz
;
; #include <iom162v.h>
; #include <macros.h>
; #include "can.h"
; //extern unsigned char RX_Buffer[13];
; //#define uchar unsigned char
; //#define uint unsigned int
; unsigned char TX_Buffer[13];
; unsigned char RX_Buffer[13];
; unsigned char timer_ok;
; unsigned char timer_count;
; unsigned char RevFlag;
; unsigned int count;
;
; /**********************************************************
; 软延时
; **********************************************************/
;
; void delay_1ms(void)
; {
.dbline 25
; unsigned int k;
; for(k = 0; k < (16*142 - 2); k++) // 定时1ms公式:xtal*142-2
clr R16
clr R17
xjmp L5
L2:
.dbline 26
L3:
.dbline 25
subi R16,255 ; offset = 1
sbci R17,255
L5:
.dbline 25
cpi R16,222
ldi R30,8
cpc R17,R30
brlo L2
.dbline -2
.dbline 28
; ;
; //for(k = 0; k < 2; k++);
; }
L1:
.dbline 0 ; func end
ret
.dbsym r k 16 i
.dbend
.dbfunc e Delay _Delay fV
; p -> R20,R21
; n -> R22,R23
.even
_Delay::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 30
; void Delay(unsigned int n)
; {
.dbline 32
; unsigned int p;
; for(p = 0; p < n; p++)
clr R20
clr R21
xjmp L10
L7:
.dbline 33
.dbline 34
xcall _delay_1ms
.dbline 35
L8:
.dbline 32
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 32
cp R20,R22
cpc R21,R23
brlo L7
.dbline -2
.dbline 36
; {
; delay_1ms();
; }
; }
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r p 20 i
.dbsym r n 22 i
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 39
;
; void port_init(void)
; {
.dbline 40
; PORTA = 0x00;
clr R2
out 0x1b,R2
.dbline 41
; DDRA = 0xFF;
ldi R24,255
out 0x1a,R24
.dbline 42
; PORTB = 0xF0;
ldi R24,240
out 0x18,R24
.dbline 43
; DDRB = 0x00;
out 0x17,R2
.dbline 44
; PORTC = 0x7F;
ldi R24,127
out 0x15,R24
.dbline 45
; DDRC = 0xFF;
ldi R24,255
out 0x14,R24
.dbline 46
; PORTD = 0x04;
ldi R24,4
out 0x12,R24
.dbline 47
; DDRD = 0xFA;
ldi R24,250
out 0x11,R24
.dbline 48
; PORTE = 0x07;
ldi R24,7
out 0x7,R24
.dbline 49
; DDRE = 0x07;
out 0x6,R24
.dbline -2
.dbline 50
; }
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e watchdog_init _watchdog_init fV
.even
_watchdog_init::
.dbline -1
.dbline 55
;
; //Watchdog initialisation
; // prescale: 2048K cycles
; void watchdog_init(void)
; {
.dbline 56
; WDR(); //this prevents a timout on enabling
wdr
.dbline 57
; WDTCR= 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
ldi R24,15
out 0x21,R24
.dbline -2
.dbline 58
; }
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 65
;
; //TIMER1 initialisation - prescale:256
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 50Hz
; // actual value: 50.000Hz (0.0%)
; void timer1_init(void)
; {
.dbline 66
; TCCR1B= 0x00; //stop
clr R2
out 0x2e,R2
.dbline 67
; TCNT1H= 0xFB; //setup
ldi R24,251
out 0x2d,R24
.dbline 68
; TCNT1L= 0x1E;
ldi R24,30
out 0x2c,R24
.dbline 69
; OCR1AH= 0x04;
ldi R24,4
out 0x2b,R24
.dbline 70
; OCR1AL= 0xE2;
ldi R24,226
out 0x2a,R24
.dbline 71
; OCR1BH= 0x04;
ldi R24,4
out 0x29,R24
.dbline 72
; OCR1BL= 0xE2;
ldi R24,226
out 0x28,R24
.dbline 73
; TCCR1A= 0x00;
out 0x2f,R2
.dbline 74
; TCCR1B= 0x04; //start Timer
ldi R24,4
out 0x2e,R24
.dbline -2
.dbline 75
; }
L13:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 60
jmp _timer1_ovf_isr
.area text(rom, con, rel)
.dbfile D:\candesignnow\CAN162.c
.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
.even
_timer1_ovf_isr::
st -y,R2
st -y,R3
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 79
.dbline 81
ldi R24,251
out 0x2d,R24
.dbline 82
ldi R24,30
out 0x2c,R24
.dbline 83
ldi R24,1
sts _timer_ok,R24
.dbline 84
lds R24,_count
lds R25,_count+1
adiw R24,1
sts _count+1,R25
sts _count,R24
.dbline 85
cpi R24,30
ldi R30,0
cpc R25,R30
brne L15
.dbline 86
.dbline 87
clr R2
clr R3
sts _count+1,R3
sts _count,R2
.dbline 88
ldi R24,16
in R2,0x12
eor R2,R24
out 0x12,R2
.dbline 89
L15:
.dbline -2
.dbline 91
;
; #pragma interrupt_handler timer1_ovf_isr:16
; void timer1_ovf_isr(void)
; {
; //TIMER1 has overflowed
; TCNT1H= 0xFB; //reload counter high value
; TCNT1L= 0x1E; //reload counter low value
; timer_ok = 1;
; count++;
; if(count == 30)
; {
; count = 0;
; PORTD ^= (1<<PD4); //程序在运行
; }
;
; }
L14:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 4
jmp _int0_isr
.area text(rom, con, rel)
.dbfile D:\candesignnow\CAN162.c
.dbfunc e int0_isr _int0_isr fV
; can_status -> R22
; reg -> R20
; CompCount -> R22
.even
_int0_isr::
xcall push_lset
xcall push_gset2
.dbline -1
.dbline 122
; /*
; //TIMER0 initialisation - prescale:256
; // WGM: Normal
; // desired value: 1000Hz
; // actual value: 1008.065Hz (0.8%)
; void timer0_init(void)
; {
; TCCR0= 0x00; //stop
; TCNT0= 0xFE; //set count
; OCR0= 0x3E; //set compare value
; TCCR0= 0x04; //start timer
; TIMSK = 0x02;
; }
;
; #pragma interrupt_handler timer0_ovf_isr:18
; void timer0_ovf_isr(void)
; {
; TCNT0= 0xFE; //reload counter value
; timer_ok = 1;
; count++;
; if(count == 1)
; {
; count = 0;
; PORTD ^= (1<<PD4); //程序在运行
; }
; }*/
;
; #pragma interrupt_handler int0_isr:2
; //中断处理可以考虑放外边
; void int0_isr(void)
; {
.dbline 126
; unsigned char reg;
; unsigned char CompCount;
; unsigned char can_status;
; CLI(); //关CPU中断
cli
.dbline 127
; RevFlag = 1;
ldi R24,1
sts _RevFlag,R24
.dbline 128
; reg = read_sja(IER); //保存SJA1000的中断允许状态
ldi R16,4
xcall _read_sja
mov R20,R16
.dbline 129
; write_sja(IER, 0x00); //重设中断允许状态为不允许任何中断
clr R18
ldi R16,4
xcall _write_sja
.dbline 130
; can_status = CanReceive(); //接收消息
xcall _CanReceive
mov R22,R16
.dbline 131
; if(can_status == 0x01)
cpi R16,1
brne L18
.dbline 132
; {
.dbline 133
; for(CompCount = 5; CompCount < 13; CompCount++) //检查接收到的数据是否正确
ldi R22,5
xjmp L23
L20:
.dbline 134
; {
.dbline 135
; if(RX_Buffer[CompCount] != TX_Buffer[CompCount])
ldi R24,<_TX_Buffer
ldi R25,>_TX_Buffer
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_RX_Buffer
ldi R25,>_RX_Buffer
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R3,z+0
cp R3,R2
breq L24
.dbline 136
; {
.dbline 137
; RevFlag = 0; //发现有不一致时,则清0标志位
clr R2
sts _RevFlag,R2
.dbline 138
; }
L24:
.dbline 139
L21:
.dbline 133
inc R22
L23:
.dbline 133
cpi R22,13
brlo L20
.dbline 140
; }
; }
xjmp L19
L18:
.dbline 142
; else
; Init_CAN(); //如果不是正确接收,则重新初始化
xcall _Init_CAN
L19:
.dbline 143
; write_sja(IER, reg); //重新写回中断允许模式
mov R18,R20
ldi R16,4
xcall _write_sja
.dbline 144
; SEI();
sei
.dbline -2
.dbline 145
; }
L17:
xcall pop_gset2
xcall pop_lset
.dbline 0 ; func end
reti
.dbsym r can_status 22 c
.dbsym r reg 20 c
.dbsym r CompCount 22 c
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 150
;
; // **Section [PCHINT1] not found**
; //call this routine to initialise all peripherals
; void init_devices(void)
; {
.dbline 152
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 153
; port_init();
xcall _port_init
.dbline 154
; watchdog_init();
xcall _watchdog_init
.dbline 157
; //timer1_init();
;
; MCUCR = 0x82;
ldi R24,130
out 0x35,R24
.dbline 158
; EMCUCR = 0x00;
clr R2
out 0x36,R2
.dbline 160
; //GIMSK= 0x00;
; TIMSK = 0x80; //timer interrupt sources
ldi R24,128
out 0x39,R24
.dbline 162
; //ETIMSK = 0x00;
; GICR = 0x40;
ldi R24,64
out 0x3b,R24
.dbline 165
; //PCMSK0 = 0x00;
; //PCMSK1 = 0x00;
; SEI(); //re-enable interrupts
sei
.dbline -2
.dbline 167
; //all peripherals are now initialised
; }
L26:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 170
;
; void main(void)
; {
.dbline 171
; init_devices();
xcall _init_devices
.dbline 172
; WDR();
wdr
.dbline 176
;
; //Delay(1000);
;
; Init_CAN(); //CAN初始化
xcall _Init_CAN
.dbline 177
; WDR();
wdr
.dbline 178
; timer1_init();
xcall _timer1_init
.dbline 179
; WDR();
wdr
xjmp L29
L28:
.dbline 182
;
; while(1)
; {
.dbline 183
; PORTD |= (1<<PD1);//初始化成功
sbi 0x12,1
.dbline 184
; WDR();
wdr
.dbline 185
; if(timer_ok == 1)
lds R24,_timer_ok
cpi R24,1
brne L31
.dbline 186
; {
.dbline 187
; timer_ok = 0;
clr R2
sts _timer_ok,R2
.dbline 188
; timer_count++;
lds R24,_timer_count
subi R24,255 ; addi 1
sts _timer_count,R24
.dbline 190
;
; if(timer_count == 60)
cpi R24,60
brne L33
.dbline 191
; {
.dbline 192
; timer_count = 0;
sts _timer_count,R2
.dbline 194
; //TCCR1B = 0x00;
; CanTransmit(); //发送数据
xcall _CanTransmit
.dbline 195
; PORTD ^= (1<<PD3);
ldi R24,8
in R2,0x12
eor R2,R24
out 0x12,R2
.dbline 197
; //TCCR1B = 0x04;
; }
L33:
.dbline 199
;
; }
L31:
.dbline 202
; //Delay(50);
; //Delay(100);
; WDR();
wdr
.dbline 203
; if(RevFlag == 1) //如果正确接收到数据
lds R24,_RevFlag
cpi R24,1
brne L35
.dbline 204
; {
.dbline 205
; RevFlag = 0;
clr R2
sts _RevFlag,R2
.dbline 206
; PORTD ^= (1<<PD5);
ldi R24,32
in R2,0x12
eor R2,R24
out 0x12,R2
.dbline 208
; //write_sja(CMR, 0x04);
; }
L35:
.dbline 210
L29:
.dbline 181
xjmp L28
X0:
.dbline -2
.dbline 211
;
; }
; }
L27:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile D:\candesignnow\CAN162.c
_count::
.blkb 2
.dbsym e count _count i
_RevFlag::
.blkb 1
.dbsym e RevFlag _RevFlag c
_timer_count::
.blkb 1
.dbsym e timer_count _timer_count c
_timer_ok::
.blkb 1
.dbsym e timer_ok _timer_ok c
_RX_Buffer::
.blkb 13
.dbsym e RX_Buffer _RX_Buffer A[13:13]c
_TX_Buffer::
.blkb 13
.dbsym e TX_Buffer _TX_Buffer A[13:13]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -