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

📄 raingauge.lst

📁 ICCAVR Rainguage counter program
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0054 E5CF      LDI	R28,0x5F
    0055 E0D4      LDI	R29,4
    0056 BFCD      OUT	0x3D,R28
    0057 BFDE      OUT	0x3E,R29
    0058 51CE      SUBI	R28,0x1E
    0059 40D0      SBCI	R29,0
    005A EA0A      LDI	R16,0xAA
    005B 8308      STD	Y+0,R16
    005C 2400      CLR	R0
    005D EBE4      LDI	R30,0xB4
    005E E0F0      LDI	R31,0
    005F E010      LDI	R17,0
    0060 3FEC      CPI	R30,0xFC
    0061 07F1      CPC	R31,R17
    0062 F011      BEQ	0x0065
    0063 9201      ST	R0,Z+
    0064 CFFB      RJMP	0x0060
    0065 8300      STD	Z+0,R16
    0066 E5E4      LDI	R30,0x54
    0067 E0F0      LDI	R31,0
    0068 E6A0      LDI	R26,0x60
    0069 E0B0      LDI	R27,0
    006A E010      LDI	R17,0
    006B 3AE8      CPI	R30,0xA8
    006C 07F1      CPC	R31,R17
    006D F021      BEQ	0x0072
    006E 95C8      LPM
    006F 9631      ADIW	R30,1
    0070 920D      ST	R0,X+
    0071 CFF9      RJMP	0x006B
    0072 940E00F0  CALL	_main
_exit:
    0074 CFFF      RJMP	_exit
FILE: C:\RGauge\init.c
(0001) //ICC-AVR application builder : 14/3/2007 23:29:10
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include "config.h"
(0006) #include "predef.h"
(0007) 
(0008) #define BAUD_RATE 9600
(0009) #define BAUD_PRESCALE (((F_CPU / (BAUD_RATE * 16UL))) - 1)
(0010) 
(0011) void port_init(void)
(0012) {
(0013)  PORTA = 0x00;
_port_init:
    0075 2422      CLR	R2
    0076 BA2B      OUT	0x1B,R2
(0014)  DDRA  = 0x00;
    0077 BA2A      OUT	0x1A,R2
(0015)  PORTB = 0xFD;
    0078 EF8D      LDI	R24,0xFD
    0079 BB88      OUT	0x18,R24
(0016) DDRB  = 0xB0;
    007A EB80      LDI	R24,0xB0
    007B BB87      OUT	0x17,R24
(0017)  PORTC = 0x00; //m103 output only
    007C BA25      OUT	0x15,R2
(0018)  DDRC  = 0x00;
    007D BA24      OUT	0x14,R2
(0019)  PORTD = 0x00;
    007E BA22      OUT	0x12,R2
(0020)  DDRD  = 0x00;
    007F BA21      OUT	0x11,R2
    0080 9508      RET
(0021) }
(0022) 
(0023) //UART0 initialize
(0024) // desired baud rate: 
(0025) // actual: baud rate: (0.0%)
(0026) // char size: 8 bit
(0027) // parity: Disabled
(0028) void uart0_init(void)
(0029) {
(0030)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    0081 2422      CLR	R2
    0082 B82A      OUT	0x0A,R2
(0031)  UCSRA = 0x00;
    0083 B82B      OUT	0x0B,R2
(0032)  UCSRC = BIT(URSEL) | 0x06;  //Use 8-bit character sizes - URSEL bit set to select the UCRSC register 
    0084 E886      LDI	R24,0x86
    0085 BD80      OUT	0x20,R24
(0033)  UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register 
    0086 E28F      LDI	R24,0x2F
    0087 B989      OUT	0x09,R24
(0034) UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register 
    0088 BC20      OUT	0x20,R2
(0035)  UCSRB = 0xD8;
    0089 ED88      LDI	R24,0xD8
    008A B98A      OUT	0x0A,R24
    008B 9508      RET
_uart0_rx_isr:
  status               --> R22
  data                 --> R20
    008C 940E0271  CALL	push_lset
    008E 940E0258  CALL	push_gset2
(0036) }
(0037) 
(0038) extern int sendready=1;
(0039) #pragma interrupt_handler uart0_rx_isr:12
(0040) void uart0_rx_isr(void)
(0041) {
(0042)  //uart has received a character in UDR
(0043)  unsigned char status,data;
(0044)  status=UCSRA;  //get the usart status
    0090 B16B      IN	R22,0x0B
(0045)  data = UDR;  //put the received character to data variable
    0091 B14C      IN	R20,0x0C
(0046)  if(data == 'R') {
    0092 3542      CPI	R20,0x52
    0093 F431      BNE	0x009A
(0047)  sendready = 1;
    0094 E081      LDI	R24,1
    0095 E090      LDI	R25,0
    0096 93900061  STS	sendready+1,R25
    0098 93800060  STS	sendready,R24
(0048)  }
(0049)  
(0050)  if((status & (FRAMING_ERROR | DATA_OVERRUN))==0)
    009A 2F86      MOV	R24,R22
    009B 7188      ANDI	R24,0x18
    009C F419      BNE	0x00A0
(0051)   {
(0052)   uart_putc(data);
    009D 2F04      MOV	R16,R20
    009E 940E0162  CALL	_uart_putc
(0053)   }
    00A0 940E0249  CALL	pop_gset2
    00A2 940E0288  CALL	pop_lset
    00A4 9518      RETI
(0054) 	
(0055) }
(0056) 
(0057) #pragma interrupt_handler uart0_tx_isr:14
(0058) void uart0_tx_isr(void)
(0059) {
_uart0_tx_isr:
    00A5 9518      RETI
(0060)  //character has been transmitted
(0061) }
(0062) 
(0063) //SPI initialize
(0064) //Master mode
(0065) // clock rate: 460799hz
(0066) void spi_init(void)
(0067) {
(0068)  SPCR = 0x72; //setup SPI
_spi_init:
    00A6 E782      LDI	R24,0x72
    00A7 B98D      OUT	0x0D,R24
(0069)  SPSR = 0x00; //setup SPI
    00A8 2422      CLR	R2
    00A9 B82E      OUT	0x0E,R2
    00AA 9508      RET
(0070) }
(0071) 
(0072) #pragma interrupt_handler spi_stc_isr:11
(0073) void spi_stc_isr(void)
(0074) {
_spi_stc_isr:
    00AB 9518      RETI
(0075)  //byte in SPDR has been sent/received
(0076) }
(0077) 
(0078) 
(0079) //TIMER0 initialize - prescale:64
(0080) // WGM: Normal
(0081) // desired value: 1mSec
(0082) // actual value:  0.998mSec (0.2%)
(0083) void timer0_init(void)
(0084) {
(0085)  TCCR0 = 0x00; //stop
_timer0_init:
    00AC 2422      CLR	R2
    00AD BE23      OUT	0x33,R2
(0086)  TCNT0 = 0x8D; //set count
    00AE E88D      LDI	R24,0x8D
    00AF BF82      OUT	0x32,R24
(0087)  OCR0  = 0x73;  //set compare
    00B0 E783      LDI	R24,0x73
    00B1 BF8C      OUT	0x3C,R24
(0088)  TCCR0 = 0x03; //start timer
    00B2 E083      LDI	R24,3
    00B3 BF83      OUT	0x33,R24
    00B4 9508      RET
_timer0_ovf_isr:
    00B5 940E0271  CALL	push_lset
(0089) }
(0090) 
(0091) 
(0092) unsigned int count=0; //to count timer0
(0093) extern char buffer [33];
(0094) char uabuffer [33];
(0095) extern int rcount;
(0096) #pragma interrupt_handler timer0_ovf_isr:10
(0097) void timer0_ovf_isr(void)
(0098) {
(0099)  TCNT0 = 0x8D; //reload counter value
    00B7 E88D      LDI	R24,0x8D
    00B8 BF82      OUT	0x32,R24
(0100)  if (++count == 5000)  //1000 ms = 1 Sec
    00B9 91800062  LDS	R24,count
    00BB 91900063  LDS	R25,count+1
    00BD 9601      ADIW	R24,1
    00BE 93900063  STS	count+1,R25
    00C0 93800062  STS	count,R24
    00C2 3888      CPI	R24,0x88
    00C3 E1E3      LDI	R30,0x13
    00C4 079E      CPC	R25,R30
    00C5 F4D9      BNE	0x00E1
(0101)  {
(0102)  count = 0;
    00C6 2422      CLR	R2
    00C7 2433      CLR	R3
    00C8 92300063  STS	count+1,R3
    00CA 92200062  STS	count,R2
(0103)  if (sendready == 1) {
    00CC 91800060  LDS	R24,sendready
    00CE 91900061  LDS	R25,sendready+1
    00D0 3081      CPI	R24,1
    00D1 E0E0      LDI	R30,0
    00D2 079E      CPC	R25,R30
    00D3 F451      BNE	0x00DE
(0104)  uart_puts(buffer);  //put the buffer to the serial
    00D4 ED05      LDI	R16,0xD5
    00D5 E010      LDI	R17,0
    00D6 940E0166  CALL	_uart_puts
(0105)  sendready = 0;
    00D8 2422      CLR	R2
    00D9 2433      CLR	R3
    00DA 92300061  STS	sendready+1,R3
    00DC 92200060  STS	sendready,R2
(0106)  }
(0107)  else {
(0108)  //put to the queue buffer
(0109)  }
(0110)  //reset the counter 1
(0111)  TCNT1H=0x00;
    00DE 2422      CLR	R2
    00DF BC2D      OUT	0x2D,R2
(0112)  TCNT1L=0x00; 
    00E0 BC2C      OUT	0x2C,R2
(0113)  }
    00E1 940E0288  CALL	pop_lset
    00E3 9518      RETI
(0114)  
(0115) }
(0116) 
(0117) //call this routine to initialize all peripherals
(0118) void init_devices(void)
(0119) {
(0120)  //stop errant interrupts until set up
(0121)  CLI(); //disable all interrupts
_init_devices:
    00E4 94F8      BCLR	7
(0122)  port_init();
    00E5 DF8F      RCALL	_port_init
(0123)  uart0_init();
    00E6 DF9A      RCALL	_uart0_init
(0124)  spi_init();
    00E7 DFBE      RCALL	_spi_init
(0125)  timer0_init();
    00E8 DFC3      RCALL	_timer0_init
(0126) 
(0127)  MCUCR = 0x00;
    00E9 2422      CLR	R2
    00EA BE25      OUT	0x35,R2
(0128)  GICR  = 0x00;
    00EB BE2B      OUT	0x3B,R2
(0129)  TIMSK = 0x01; //timer interrupt sources
    00EC E081      LDI	R24,1
    00ED BF89      OUT	0x39,R24
(0130)  SEI(); //re-enable interrupts
    00EE 9478      BSET	7
    00EF 9508      RET
_main:
    00F0 9722      SBIW	R28,2
FILE: C:\RGauge\main.c
(0001) //ICC-AVR application builder : 14/3/2007 23:29:10
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) 
(0005) #include <stdio.h>
(0006) #include <STDLIB.h>
(0007) #include "config.h"
(0008) #include "predef.h"
(0009) #include "lcd.h"
(0010) 
(0011) unsigned int rcount;
(0012) unsigned char * lcdmsg1;
(0013) unsigned char * umsg;
(0014) char buffer [33];
(0015) 
(0016) //unsigned int count=0; //to count timer0
(0017) 
(0018) // INTERRUPT can be interrupted
(0019) // SIGNAL can't be interrupted
(0020) //for future use
(0021) /*
(0022) void SIGNAL (SIG_UART_RECV) { // USART RX interrupt
(0023) 	unsigned char c;
(0024) 	c = UDR;
(0025) 	uart_putc(c);
(0026) }
(0027) */
(0028) 
(0029) void main(void)
(0030) {
(0031) init_devices();
    00F1 940E00E4  CALL	_init_devices
(0032) 
(0033) //initialize the  counter 1 
(0034) TCCR1B=0x00;
    00F3 2422      CLR	R2
    00F4 BC2E      OUT	0x2E,R2
(0035) TCNT1H=0x00;
    00F5 BC2D      OUT	0x2D,R2
(0036) TCNT1L=0x00;
    00F6 BC2C      OUT	0x2C,R2
(0037) OCR1AH=0x00;
    00F7 BC2B      OUT	0x2B,R2
(0038) OCR1AL=0x00;
    00F8 BC2A      OUT	0x2A,R2
(0039) OCR1BH=0x00;
    00F9 BC29      OUT	0x29,R2
(0040) OCR1BL=0x00;
    00FA BC28      OUT	0x28,R2
(0041) TCCR1A=0x00;
    00FB BC2F      OUT	0x2F,R2
(0042) TCCR1B=0x06;
    00FC E086      LDI	R24,6
    00FD BD8E      OUT	0x2E,R24
(0043) 
(0044) 
(0045) //LCD DISPLAY 
(0046)  LCD_IO_INIT (); 
    00FE 940E01AF  CALL	_LCD_IO_INIT
(0047)  LCD_INIT (); 
    0100 940E01C3  CALL	_LCD_INIT
    0102 C042      RJMP	0x0145
(0048)    
(0049) while(1)
(0050) {
(0051) 
(0052) rcount = TCNT1H*256 + TCNT1L;
    0103 B52D      IN	R18,0x2D
    0104 2733      CLR	R19
    0105 E000      LDI	R16,0
    0106 E011      LDI	R17,1
    0107 940E0239  CALL	empy16s
    0109 0118      MOVW	R2,R16
    010A B44C      IN	R4,0x2C
    010B 2455      CLR	R5
    010C 0C24      ADD	R2,R4
    010D 1C35      ADC	R3,R5
    010E 923000FB  STS	rcount+1,R3
    0110 922000FA  STS	rcount,R2
(0053) utoa(buffer, rcount,10);  //integer convert to string  in base decimal
    0112 E08A      LDI	R24,0xA
    0113 E090      LDI	R25,0
    0114 8399      STD	Y+1,R25
    0115 8388      STD	Y+0,R24
    0116 0191      MOVW	R18,R2
    0117 ED05      LDI	R16,0xD5
    0118 E010      LDI	R17,0
    0119 940E029F  CALL	_utoa
(0054)  
(0055)   LCD_PutCmd (CLR_DSP);   //clear display
    011B E001      LDI	R16,1
    011C 940E01D8  CALL	_LCD_PutCmd
(0056)   LCD_Delay(500);  
    011E EF04      LDI	R16,0xF4
    011F E011      LDI	R17,1
    0120 E020      LDI	R18,0
    0121 E030      LDI	R19,0
    0122 940E017A  CALL	_LCD_Delay
(0057)   LCD_PutCmd (LINE1+0);
    0124 E800      LDI	R16,0x80
    0125 940E01D8  CALL	_LCD_PutCmd
(0058)   lcdmsg1 = "Current Dropcounts:";
    0127 E68B      LDI	R24,0x6B
    0128 E090      LDI	R25,0
    0129 939000F9  STS	lcdmsg1+1,R25
    012B 938000F8  STS	lcdmsg1,R24
(0059)   LCD_PutString (lcdmsg1);
    012D 018C      MOVW	R16,R24
    012E 940E01FF  CALL	_LCD_PutString
(0060)   LCD_PutCmd(LINE2+0);
    0130 EC00      LDI	R16,0xC0
    0131 940E01D8  CALL	_LCD_PutCmd
(0061)   LCD_PutString(buffer);
    0133 ED05      LDI	R16,0xD5
    0134 E010      LDI	R17,0
    0135 940E01FF  CALL	_LCD_PutString
(0062)   LCD_PutCmd(LINE2+4);
    0137 EC04      LDI	R16,0xC4
    0138 940E01D8  CALL	_LCD_PutCmd
(0063)   LCD_PutString("counts");
    013A E604      LDI	R16,0x64
    013B E010      LDI	R17,0
    013C 940E01FF  CALL	_LCD_PutString
(0064)   
(0065)   SPI_MasterTransmit('z');
    013E E70A      LDI	R16,0x7A
    013F 940E0176  CALL	_SPI_MasterTransmit
(0066)  
(0067) 
(0068) //format the message into the uabuffer 
(0069) //sprintf(uabuffer, "The count H: %d  L:%d \n",TCNT1H, TCNT1L);
(0070) //uart_puts(buffer);  //put the uabuffer to the serial 
(0071) //alternate method to print out in serial communication
(0072) //printf("The count is %d \n",rcount);
(0073) 
(0074) delay_ms(200);
    0141 EC08      LDI	R16,0xC8
    0142 E010      LDI	R17,0
    0143 940E0148  CALL	_delay_ms
    0145 CFBD      RJMP	0x0103
    0146 9622      ADIW	R28,2
    0147 9508      RET
_delay_ms:
  outer1               --> R20
  outer2               --> R22
  ms                   --> R16
    0148 940E0258  CALL	push_gset2
FILE: C:\RGauge\delay.c
(0001) 
(0002) 
(0003) void delay_ms(unsigned short ms) {
(0004) 	unsigned short outer1, outer2;
(0005) 	outer1 = 200; 
    014A EC48      LDI	R20,0xC8
    014B E050      LDI	R21,0
    014C C00F      RJMP	0x015C
(0006) 	while (outer1) {
(0007) 		outer2 = 1000;
    014D EE68      LDI	R22,0xE8
    014E E073      LDI	R23,3
    014F C007      RJMP	0x0157
(0008) 		while (outer2) {
(0009) 			while ( ms ) ms--;
    0150 5001      SUBI	R16,1
    0151 4010      SBCI	R17,0
    0152 3000      CPI	R16,0
    0153 0701      CPC	R16,R17
    0154 F7D9      BNE	0x0150
(0010) 			outer2--;
    0155 5061      SUBI	R22,1
    0156 4070      SBCI	R23,0
    0157 3060      CPI	R22,0
    0158 0767      CPC	R22,R23
    0159 F7C1      BNE	0x0152
(0011) 		}
(0012) 		outer1--;
    015A 5041      SUBI	R20,1
    015B 4050      SBCI	R21,0
    015C 3040      CPI	R20,0
    015D 0745      CPC	R20,R21
    015E F771      BNE	0x014D
    015F 940E0249  CALL	pop_gset2
    0161 9508      RET
FILE: C:\RGauge\functions.c
(0001) 
(0002) #include "config.h"

⌨️ 快捷键说明

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