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

📄 sof_usart.lst

📁 一个关于AVR单片机的例程
💻 LST
字号:
__start:
__text_start:
    0032 E5CF      LDI	R28,0x5F
    0033 E0D4      LDI	R29,4
    0034 BFCD      OUT	0x3D,R28
    0035 BFDE      OUT	0x3E,R29
    0036 51C0      SUBI	R28,0x10
    0037 40D0      SBCI	R29,0
    0038 EA0A      LDI	R16,0xAA
    0039 8308      STD	Y+0,R16
    003A 2400      CLR	R0
    003B E6E0      LDI	R30,0x60
    003C E0F0      LDI	R31,0
    003D E010      LDI	R17,0
    003E 36E0      CPI	R30,0x60
    003F 07F1      CPC	R31,R17
    0040 F011      BEQ	0x0043
    0041 9201      ST	R0,Z+
    0042 CFFB      RJMP	0x003E
    0043 8300      STD	Z+0,R16
    0044 E6E4      LDI	R30,0x64
    0045 E0F0      LDI	R31,0
    0046 E6A0      LDI	R26,0x60
    0047 E0B0      LDI	R27,0
    0048 E010      LDI	R17,0
    0049 36E4      CPI	R30,0x64
    004A 07F1      CPC	R31,R17
    004B F021      BEQ	0x0050
    004C 95C8      LPM
    004D 9631      ADIW	R30,1
    004E 920D      ST	R0,X+
    004F CFF9      RJMP	0x0049
    0050 940E0065  CALL	_main
_exit:
    0052 CFFF      RJMP	_exit
FILE: E:\avr\2.5.6\soft_test.c
(0001) // Test Soft-Uart : See Atmel Applicaton Note 305
(0002) // File: soft_test.c
(0003) // Target : mega16
(0004) // Crystal: 7.3728 Mhz
(0005) // Date 05/30/2007
(0006) // Written/adapted by Dipl.Ing.J.Zastrow
(0007) // for Imagecraft ICCAVR Ver. 6.31
(0008) // Usage : if you need more then one UART
(0009) // Tested with STK500 (Atmel)
(0010) // Customer settings : SEE soft_uart.s
(0011) // 
(0012) 
(0013) #include <iom16v.h>
(0014) #include <macros.h>
(0015) 
(0016) //function prototypes for soft_uart.s
(0017) //one byte return value in R16 !!!
(0018) extern unsigned char getit(void);
(0019) //one byte argument in R16 !!!
(0020) extern putit(register unsigned char key);
(0021) //initialise TxD,RxD port pins
(0022) extern void init_soft_uart(void);
(0023) 
(0024) 
(0025) void port_init(void)
(0026) {
(0027)  //default settings all inputs and pull up 
(0028)  PORTA = 0xFF;
_port_init:
    0053 EF8F      LDI	R24,0xFF
    0054 BB8B      OUT	0x1B,R24
(0029)  DDRA  = 0x00;
    0055 2422      CLR	R2
    0056 BA2A      OUT	0x1A,R2
(0030)  PORTB = 0xFF;
    0057 BB88      OUT	0x18,R24
(0031)  DDRB  = 0xFF;
    0058 BB87      OUT	0x17,R24
(0032)  PORTC = 0xFF;
    0059 BB85      OUT	0x15,R24
(0033)  DDRC  = 0x00;
    005A BA24      OUT	0x14,R2
(0034)  PORTD = 0xFF;
    005B BB82      OUT	0x12,R24
(0035)  DDRD  = 0x00;
    005C BA21      OUT	0x11,R2
    005D 9508      RET
(0036) }
(0037) 
(0038) //call this routine to initialise all peripherals
(0039) void init_devices(void)
(0040) {
(0041)  //stop errant interrupts until set up
(0042)  CLI(); //disable all interrupts
_init_devices:
    005E 94F8      BCLR	7
(0043)  port_init();
    005F DFF3      RCALL	_port_init
(0044)  MCUCR = 0x00;
    0060 2422      CLR	R2
    0061 BE25      OUT	0x35,R2
(0045)  TIMSK = 0x00;
    0062 BE29      OUT	0x39,R2
(0046)  SEI(); //re-enable interrupts
    0063 9478      BSET	7
    0064 9508      RET
_main:
  buf                  --> Y+0
  s                    --> R20
  i                    --> R22
    0065 9760      SBIW	R28,0x10
(0047)  //all peripherals are now initialised
(0048) }
(0049) 
(0050) //Simply connect RS232 SPARE to
(0051) //PC2 to receive and PC3 to transmitt
(0052)  
(0053) void main(void)
(0054) {
(0055)  unsigned char s=0,i=0;
    0066 2744      CLR	R20
    0067 2766      CLR	R22
(0056)  unsigned char buf[]="www.avrvi.com\r\n";
    0068 E584      LDI	R24,0x54
    0069 E090      LDI	R25,0
    006A 01FE      MOVW	R30,R28
    006B E100      LDI	R16,0x10
    006C E010      LDI	R17,0
    006D 93FA      ST	R31,-Y
    006E 93EA      ST	R30,-Y
    006F 939A      ST	R25,-Y
    0070 938A      ST	R24,-Y
    0071 940E00C7  CALL	asgncblk
(0057)  //defaul
(0058)  init_devices();
    0073 DFEA      RCALL	_init_devices
(0059)  
(0060)  //do custom settings in soft_uart.s !!!
(0061)  init_soft_uart();
    0074 940E00A0  CALL	_init_soft_uart
(0062)  for(i=0;i<16;i++)
    0076 C009      RJMP	0x0080
(0063)  {
(0064)   putit(buf[i]);
    0077 01CE      MOVW	R24,R28
    0078 2FE6      MOV	R30,R22
    0079 27FF      CLR	R31
    007A 0FE8      ADD	R30,R24
    007B 1FF9      ADC	R31,R25
    007C 8100      LDD	R16,Z+0
    007D 940E00A5  CALL	_putit
    007F 9563      INC	R22
    0080 3160      CPI	R22,0x10
    0081 F3A8      BCS	0x0077
    0082 C01A      RJMP	0x009D
(0065)  }
(0066)  while(1){
(0067)  putit('T'); //T
    0083 E504      LDI	R16,0x54
    0084 940E00A5  CALL	_putit
(0068)  putit('E'); //E
    0086 E405      LDI	R16,0x45
    0087 940E00A5  CALL	_putit
(0069)  putit('S'); //S
    0089 E503      LDI	R16,0x53
    008A 940E00A5  CALL	_putit
(0070)  putit('T'); //T
    008C E504      LDI	R16,0x54
    008D 940E00A5  CALL	_putit
(0071)  putit(':'); //:
    008F E30A      LDI	R16,0x3A
    0090 940E00A5  CALL	_putit
(0072)  s = getit();
    0092 940E00B8  CALL	_getit
    0094 2F40      MOV	R20,R16
(0073)  putit(s);
    0095 940E00A5  CALL	_putit
(0074)  putit(0x0D);//CR
    0097 E00D      LDI	R16,0xD
    0098 940E00A5  CALL	_putit
(0075)  putit(0x0A);//LF
    009A E00A      LDI	R16,0xA
    009B 940E00A5  CALL	_putit
    009D CFE5      RJMP	0x0083
    009E 9660      ADIW	R28,0x10
    009F 9508      RET
FILE: E:\avr\2.5.6\soft_uart.s
(0001) ;+++ Software Uart according to Atmel +++
(0002) ;+++ application note AVR 305         +++
(0003) ;+++ Adapted for Imagecraft ICCAVR    +++
(0004) 
(0005) .area text
(0006) 
(0007) ;include correct file here ................................ 
(0008) .include "aiom16.s"  ;see path磗,same directory as *.h !!!
(0009) ;..........................................................
(0010) 
(0011) ;volatile registers (not needed to restore)						   
(0012) .define bitcnt  R24 
(0013) .define temp    R25
(0014) .define txbyte  R26
(0015) .define rxbyte  R27
(0016) 
(0017) ; ****** Customizable settings BEGIN ******
(0018) ;change here if wanted/required !!!
(0019) 
(0020) .define out_port  PORTD ;PORTC is used for TxD here
(0021) .define dir       DDRD  ;DDRC is used here
(0022) .define in_port   PIND  ;PINC is used for RxD here 
(0023) TxD = 1	   		  		; Px7 pin is used for sending 
(0024) RxD = 0	   				; Px6 pin is used for receiving 
(0025) sb = 1	   				; 1 stop bit
(0026) FOSC = 7372800 			; Crystal frequency
(0027) BAUD = 9600    		    ; Serial bitrate in bps : 0.0% error
(0028)  
(0029) ; ****** Customizable settings END ******
(0030) 
(0031) ; The b value corresponds to the table on last page 
(0032) ; of Application Note AVR 305: Software UART
(0033) b = (((FOSC/BAUD)-22)/6) 
(0034) 
(0035) ;function to init PORTx and DDRx for sending and receiving
(0036) _init_soft_uart::
(0037) ;for sending
(0038) sbi out_port,TxD ;TxD is high 
_init_soft_uart:
    00A0 9A91      SBI	0x12,1
(0039) sbi dir,TxD      ;TxD is output
    00A1 9A89      SBI	0x11,1
(0040) ;for receiving
(0041) sbi out_port,RxD ;RxD is pull up 
    00A2 9A90      SBI	0x12,0
(0042) cbi dir,RxD      ;RxD is input
    00A3 9888      CBI	0x11,0
(0043) ret
    00A4 9508      RET
(0044) 
(0045) ;function to send a byte :first argument is in R16
(0046) _putit::    mov	txbyte,R16  	;given char to txbyte
_putit:
    00A5 2FA0      MOV	R26,R16
(0047)             ldi	bitcnt,9+sb	    ;1+8+sb (sb is # of stop bits)
    00A6 E08A      LDI	R24,0xA
(0048)             com	txbyte		    ;inverte everything
    00A7 95A0      COM	R26
(0049)             sec			        ;start bit
    00A8 9408      BSET	0
(0050) 
(0051) putchar0:	brcc	putchar1	;if carry set
    00A9 F410      BCC	0x00AC
(0052) 		    cbi	    out_port,TxD;send a '0'
    00AA 9891      CBI	0x12,1
(0053) 		    rjmp	putchar2	;else	
    00AB C002      RJMP	0x00AE
(0054) 
(0055) putchar1:	sbi	out_port,TxD	;send a '1'
    00AC 9A91      SBI	0x12,1
(0056) 		    nop
    00AD 0000      NOP
(0057) 
(0058) putchar2:	rcall UART_delay	;one bit delay
    00AE D005      RCALL	0x00B4
(0059) 		    rcall UART_delay
    00AF D004      RCALL	0x00B4
(0060) 
(0061) 		    lsr  txbyte		    ;get next bit
    00B0 95A6      LSR	R26
(0062) 		    dec	 bitcnt		    ;if not all bit sent
    00B1 958A      DEC	R24
(0063) 		    brne	putchar0    ;send next
    00B2 F7B1      BNE	0x00A9
(0064) 					            ;else
(0065) 		    ret			        ;done return
    00B3 9508      RET
(0066) 			
(0067) ;function for delay
(0068) UART_delay:	    ldi	temp,b
    00B4 E79C      LDI	R25,0x7C
(0069) UART_delay1:	dec	temp
    00B5 959A      DEC	R25
(0070) 		        brne	UART_delay1
    00B6 F7F1      BNE	0x00B5
(0071) 		        ret
    00B7 9508      RET
(0072) ;
(0073) 
(0074) ;function to receive a byte and return in R16
(0075) _getit::
(0076) 		    ldi 	bitcnt,9	;8 data bit + 1 stop bit
_getit:
    00B8 E089      LDI	R24,0x9
(0077) 
(0078) getchar1:	sbic 	in_port,RxD	;wait for start bit
    00B9 9980      SBIC	0x10,0
(0079) 		    rjmp 	getchar1
    00BA CFFE      RJMP	0x00B9
(0080)     		rcall UART_delay	;0.5 bit delay
    00BB DFF8      RCALL	0x00B4
(0081) 
(0082) getchar2:	rcall UART_delay	;1 bit delay
    00BC DFF7      RCALL	0x00B4
(0083) 		    rcall UART_delay		
    00BD DFF6      RCALL	0x00B4
(0084) 
(0085) 		    clc			        ;clear carry
    00BE 9488      BCLR	0
(0086) 		    sbic 	in_port,RxD	;if RX pin high
    00BF 9980      SBIC	0x10,0
(0087) 		    sec			        ;set carry flag in SREG
    00C0 9408      BSET	0
(0088) 
(0089) 		    dec 	bitcnt		;if bit is stop bit
    00C1 958A      DEC	R24
(0090) 		    breq 	getchar3	;return
    00C2 F011      BEQ	0x00C5
(0091) 					;else
(0092) 		    ror 	rxbyte		;shift bit into rxbyte
    00C3 95B7      ROR	R27
(0093) 		    rjmp 	getchar2	;go get next
    00C4 CFF7      RJMP	0x00BC
(0094) 
(0095) getchar3:	mov R16,rxbyte      ;move rxbyte to R16
    00C5 2F0B      MOV	R16,R27
(0096)             ret				    ;return from function call		  
FILE: <library>
    00C6 9508      RET
asgncblk:
    00C7 93AA      ST	R26,-Y
    00C8 93BA      ST	R27,-Y
    00C9 93EA      ST	R30,-Y
    00CA 93FA      ST	R31,-Y
    00CB 920A      ST	R0,-Y
    00CC 81AF      LDD	R26,Y+7
    00CD 85B8      LDD	R27,Y+8
    00CE 81ED      LDD	R30,Y+5
    00CF 81FE      LDD	R31,Y+6
    00D0 3000      CPI	R16,0
    00D1 0701      CPC	R16,R17
    00D2 F031      BEQ	0x00D9
    00D3 95C8      LPM
    00D4 920D      ST	R0,X+
    00D5 9631      ADIW	R30,1
    00D6 5001      SUBI	R16,1
    00D7 4010      SBCI	R17,0
    00D8 CFF7      RJMP	0x00D0
    00D9 9009      LD	R0,Y+
    00DA 91F9      LD	R31,Y+
    00DB 91E9      LD	R30,Y+
    00DC 91B9      LD	R27,Y+
    00DD 91A9      LD	R26,Y+
    00DE 9624      ADIW	R28,4
    00DF 9508      RET

⌨️ 快捷键说明

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