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

📄 can162.s

📁 Atmel mcu can interface design example
💻 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 + -