📄 raingauge.lst
字号:
__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 + -