📄 uart.lst
字号:
__start:
__text_start:
0025 E5CF LDI R28,0x5F
0026 E0D4 LDI R29,4
0027 BFCD OUT 0x3D,R28
0028 BFDE OUT 0x3E,R29
0029 51C0 SUBI R28,0x10
002A 40D0 SBCI R29,0
002B EA0A LDI R16,0xAA
002C 8308 STD Y+0,R16
002D 2400 CLR R0
002E E6E3 LDI R30,0x63
002F E0F0 LDI R31,0
0030 E010 LDI R17,0
0031 3CE8 CPI R30,0xC8
0032 07F1 CPC R31,R17
0033 F011 BEQ 0x0036
0034 9201 ST R0,Z+
0035 CFFB RJMP 0x0031
0036 8300 STD Z+0,R16
0037 E4E6 LDI R30,0x46
0038 E0F0 LDI R31,0
0039 E6A0 LDI R26,0x60
003A E0B0 LDI R27,0
003B E010 LDI R17,0
003C 34E9 CPI R30,0x49
003D 07F1 CPC R31,R17
003E F021 BEQ 0x0043
003F 95C8 LPM
0040 9631 ADIW R30,1
0041 920D ST R0,X+
0042 CFF9 RJMP 0x003C
0043 D568 RCALL _main
_exit:
0044 CFFF RJMP _exit
FILE: C:\mk8\uart\uart.c
(0001) #include <iom8v.h>
(0002) #include "Includes.h"
(0003) #include"uart.h"
(0004) #define fosc 8000000 //晶振8.0000MHZ
(0005) #define baud 4800 //波特率
(0006) #define maxdata 20000 //采集的最大数值
(0007) #define voltagedata 0x01 //电压伏值 3个字节
(0008) #define currentdata 0x02 //电流伏值 3个字节
(0009) #define entercomm 0x56 //确认帧 0字节
(0010)
(0011) #define addressper 0x10 //本机地址
(0012) // LOCK status definitions
(0013) #define LOCK_NOK 0x00
(0014) #define LOCK_OK 0x01
(0015) #define LOCK_RECAL_OK 0x02
(0016) #define uchar unsigned char
(0017) // Maximum number of re-calibration attempts upon calibration failure
(0018) #define CAL_ATTEMPT_MAX 4
(0019) // Time-out values
(0020) #define CAL_TIMEOUT 0x7FFE
(0021) #define LOCK_TIMEOUT 0x7FFE
(0022) const unsigned char DefaultConfig433[32] =
(0023) {
(0024) 0x0F, // 0x01, INTERFACE
(0025) 0xFF, // 0x02, RESET
(0026) 0x8F, // 0x03, SEQUENCING
(0027)
(0028) 0x3A, // 0x04, FREQ_2A
(0029) 0x10, // 0x05, FREQ_1A
(0030) 0x01, // 0x06, FREQ_0A
(0031) 0x39, // 0x0B, CLOCK_A 19.2K
(0032)
(0033) 0x3A, // 0x08, FREQ_2B
(0034) 0x1A, // 0x09, FREQ_1B
(0035) 0xAB, // 0x0A, FREQ_0B
(0036) 0x39, // 0x0B, CLOCK_A 19.2K
(0037) 0x44, // 0x0C, VCO
(0038) 0x50, // 0x0D, MODEM
(0039) 0xbb, // 0x0E, DEVIATION
(0040) 0x46, // 0x0F, AFC_CONTROL
(0041) 0x25, // 0x10, FILTER
(0042) 0x61, // 0x11, VGA1
(0043) 0x55, // 0x12, VGA2
(0044) 0x2d, // 0x13, VGA3
(0045) 0x29, // 0x14, VGA4
(0046) 0x20, // 0x15, LOCK
(0047) 0x78, // 0x16, FRONTEND
(0048) 0x47, // 0x17, ANALOG, RX=47/TX=47
(0049) 0x14, // 0x18, BUFF_SWING
(0050) 0x22, // 0x19, BUFF_CURRENT
(0051) 0xAE, // 0x1A, PLL_BW
_Initial:
0045 2422 CLR R2
0046 9220007D STS Rx_Time,R2
(0052) 0x34, // 0x1B, CALIBRATE
0048 9508 RET
_watchdog_init:
0049 95A8 WDR
004A E08F LDI R24,0xF
(0053) 0x0f, // 0x1C, PA_POWER
004B BD81 OUT 0x21,R24
004C 9508 RET
(0054) 0x00, // 0x1D, MATCH
(0055) 0x00, // 0x1E, PHASE_COMP
_putchar:
c --> R16
004D 9B5D SBIS 0x0B,5
004E CFFE RJMP _putchar
004F B90C OUT 0x0C,R16
(0056) 0x00, // 0x1F, GAIN_COMP
(0057) 0x00 // 0x20, POWERDOWN
(0058) };
(0059) unsigned char boolval,retrn_val,looptmp;
(0060) char bool_val;
(0061) char PA_POWER=0xF0;
(0062) char RXANALOG=0x47;
(0063) char TXANALOG=0x47;
0050 9508 RET
(0064) uchar rcv1[50];
_timer0_init:
0051 2422 CLR R2
0052 BE23 OUT 0x33,R2
0053 E781 LDI R24,0x71
(0065) uchar rcvd1,rscnt11,rscnt12,rscnt13,rscnt01,xx0,xx1;
(0066)
(0067) uchar rsok00,rsok10,rsok20,rsok30,rsok40;
(0068) //extern unsigned char read_flash(unsigned int add);
(0069) uchar w1;
(0070) uchar databak[3],datawn2[3];
(0071)
0054 BF82 OUT 0x32,R24
0055 E084 LDI R24,4
(0072) /* 串口通讯变量定义 */
0056 BF83 OUT 0x33,R24
0057 9508 RET
(0073)
(0074) uchar Tx_Rx,Rx_Time;
(0075)
(0076) /*--------------------------------------------------------------------------------------------------
(0077) 变量定义
(0078) --------------------------------------------------------------------------------------------------*/
(0079)
(0080) //********量程切换********//
(0081) INT8U Rx_Time; // 通讯间隔时间
_timer0_ovf_isr:
0058 938A ST R24,-Y
0059 B78F IN R24,0x3F
(0082)
005A 938A ST R24,-Y
005B E781 LDI R24,0x71
(0083) /* 数字滤波 */
005C BF82 OUT 0x32,R24
005D 95A8 WDR
005E 9189 LD R24,Y+
005F BF8F OUT 0x3F,R24
0060 9189 LD R24,Y+
(0084) INT16U Vwn_Buf[13];
(0085) /*--------------------------------------------------------------------------------------------------
(0086) 函数定义
(0087) --------------------------------------------------------------------------------------------------*/
(0088) void Initial ( void )
(0089) {
(0090) Rx_Time = 0;// 通讯间隔时间
0061 9518 RETI
_timer1_init:
0062 2422 CLR R2
(0091) }
(0092)
0063 BC2E OUT 0x2E,R2
0064 BC2D OUT 0x2D,R2
0065 BC2C OUT 0x2C,R2
0066 BC2B OUT 0x2B,R2
0067 BC2A OUT 0x2A,R2
(0093)
(0094) //Watchdog initialize
(0095) // prescale: 2048K
(0096) void watchdog_init(void)
(0097) {
(0098) WDR(); //this prevents a timout on enabling
(0099) WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
(0100) }
(0101)
0068 BC29 OUT 0x29,R2
0069 BC28 OUT 0x28,R2
(0102)
006A BC27 OUT 0x27,R2
(0103) /* 字符输出函数 */
006B BC26 OUT 0x26,R2
(0104) void putchar(uchar c)
006C BC2F OUT 0x2F,R2
(0105) {
006D E086 LDI R24,6
(0106) while (!(UCSRA&(1<<UDRE)));
006E BD8E OUT 0x2E,R24
(0107) UDR=c;
006F 9508 RET
(0108) }
_timer2_init:
0070 2422 CLR R2
(0109)
0071 BC25 OUT 0x25,R2
(0110)
0072 BC22 OUT 0x22,R2
(0111) //TIMER0 initialize - prescale:256
0073 E18A LDI R24,0x1A
0074 BD84 OUT 0x24,R24
0075 EE86 LDI R24,0xE6
(0112) // desired value: 5mSec
(0113) // actual value: 4.965mSec (0.7%)
(0114) void timer0_init(void)
(0115) {
(0116) TCCR0 = 0x00; //stop
(0117) TCNT0 = 0x71; //set count
(0118) TCCR0 = 0x04; //start timer
(0119) }
(0120)
0076 BD83 OUT 0x23,R24
0077 E083 LDI R24,3
(0121)
0078 BD85 OUT 0x25,R24
(0122) #pragma interrupt_handler timer0_ovf_isr:10
0079 9508 RET
_timer2_ovf_isr:
007A 922A ST R2,-Y
(0123) void timer0_ovf_isr(void)
007B 938A ST R24,-Y
007C 939A ST R25,-Y
(0124) {
007D B62F IN R2,0x3F
007E 922A ST R2,-Y
007F E18A LDI R24,0x1A
0080 BD84 OUT 0x24,R24
0081 9020007E LDS R2,Tx_Rx
0083 2022 TST R2
0084 F509 BNE 0x00A6
0085 9180007D LDS R24,Rx_Time
(0125) TCNT0 = 0x71; //reload counter value
(0126) //AD转换
(0127) WDR();// 喂狗
(0128)
(0129) }
(0130)
0087 5F8F SUBI R24,0xFF
(0131) //TIMER1 initialize - prescale:Rising edge
(0132) // WGM: 0) Normal, TOP=0xFFFF
(0133) // desired value: 1Hz
0088 2E28 MOV R2,R24
0089 9220007D STS Rx_Time,R2
008B E288 LDI R24,0x28
(0134) // actual value: Out of range
(0135) void timer1_init(void)
008C 1582 CP R24,R2
008D F4C0 BCC 0x00A6
008E E082 LDI R24,2
008F 9380007E STS Tx_Rx,R24
(0136) {
(0137) TCCR1B = 0x00; //stop
(0138) TCNT1H = 0x00 /*INVALID SETTING*/; //setup
0091 2422 CLR R2
0092 9220007D STS Rx_Time,R2
0094 9220008A STS rsok00,R2
0096 92200089 STS rsok10,R2
(0139) TCNT1L = 0x00 /*INVALID SETTING*/;
(0140) OCR1AH = 0x00 /*INVALID SETTING*/;
0098 92200088 STS rsok20,R2
009A 92200087 STS rsok30,R2
009C 92200086 STS rsok40,R2
009E 9220008D STS rscnt01,R2
00A0 92200090 STS rscnt11,R2
00A2 9220008F STS rscnt12,R2
00A4 9220008E STS rscnt13,R2
00A6 9029 LD R2,Y+
(0141) OCR1AL = 0x00 /*INVALID SETTING*/;
(0142) OCR1BH = 0x00 /*INVALID SETTING*/;
00A7 BE2F OUT 0x3F,R2
00A8 9199 LD R25,Y+
00A9 9189 LD R24,Y+
(0143) OCR1BL = 0x00 /*INVALID SETTING*/;
00AA 9029 LD R2,Y+
00AB 9518 RETI
(0144) ICR1H = 0x00 /*INVALID SETTING*/;
(0145) ICR1L = 0x00 /*INVALID SETTING*/;
(0146) TCCR1A = 0x00;
(0147) TCCR1B = 0x06; //start Timer
_int1_isr:
00AC 9518 RETI
_init_devices:
00AD 94F8 BCLR 7
00AE DF9A RCALL _watchdog_init
00AF DFA1 RCALL _timer0_init
00B0 DFB1 RCALL _timer1_init
00B1 DFBE RCALL _timer2_init
00B2 E088 LDI R24,0x8
00B3 BF85 OUT 0x35,R24
(0148) }
(0149)
00B4 E880 LDI R24,0x80
00B5 BF8B OUT 0x3B,R24
00B6 E481 LDI R24,0x41
00B7 BF89 OUT 0x39,R24
00B8 9478 BSET 7
00B9 9508 RET
_uart0_rx_isr:
00BA 922A ST R2,-Y
00BB 923A ST R3,-Y
00BC 938A ST R24,-Y
(0150) //TIMER2 initialize - prescale:32
(0151) // WGM: Normal
(0152) // desired value: 1mSec
00BD 939A ST R25,-Y
00BE 93EA ST R30,-Y
(0153) // actual value: 0.998mSec (0.2%)
(0154) void timer2_init(void)
00BF 93FA ST R31,-Y
00C0 B62F IN R2,0x3F
00C1 922A ST R2,-Y
(0155) {
00C2 995F SBIC 0x0B,7
(0156) TCCR2 = 0x00; //stop
00C3 C001 RJMP 0x00C5
(0157) ASSR = 0x00; //set async mode
00C4 C0D2 RJMP 0x0197
00C5 9020008A LDS R2,rsok00
00C7 2022 TST R2
00C8 F531 BNE 0x00EF
00C9 B02C IN R2,0x0C
00CA 92200091 STS rcvd1,R2
00CC 2D82 MOV R24,R2
(0158) TCNT2 = 0x1A; //setup
(0159) OCR2 = 0xE6;
00CD 3585 CPI R24,0x55
00CE F431 BNE 0x00D5
00CF 9180008D LDS R24,rscnt01
(0160) TCCR2 = 0x03; //start
00D1 5F8F SUBI R24,0xFF
00D2 9380008D STS rscnt01,R24
00D4 C009 RJMP 0x00DE
00D5 91800091 LDS R24,rcvd1
00D7 3A8A CPI R24,0xAA
00D8 F429 BNE 0x00DE
00D9 9180008D LDS R24,rscnt01
(0161) }
(0162)
(0163) #pragma interrupt_handler timer2_ovf_isr:5
(0164) void timer2_ovf_isr(void)
(0165) {
(0166) TCNT2 = 0x1A; //reload counter value
(0167)
(0168) /* 通讯数据间隔判断*/
(0169)
(0170) if(Tx_Rx == 0) // 通讯
(0171) {
(0172) if(++Rx_Time > 40) // 间隔时间大于40ms后判断为接收超时
(0173) {
(0174) Tx_Rx = 2; // 接收结束;
(0175) Rx_Time = 0;
(0176) rsok00=0;
(0177) rsok10=0;
(0178) rsok20=0;
(0179) rsok30=0;
(0180) rsok40=0;
(0181) rscnt01=0;
(0182) rscnt11=0;
(0183) rscnt12=0x00;
(0184) rscnt13=0x00;
(0185) }
(0186) else
(0187) {}
(0188) }
(0189)
(0190) }
00DB 5F8F SUBI R24,0xFF
00DC 9380008D STS rscnt01,R24
00DE 91800091 LDS R24,rcvd1
00E0 3A8A CPI R24,0xAA
00E1 F009 BEQ 0x00E3
00E2 C0B4 RJMP 0x0197
00E3 9180008D LDS R24,rscnt01
(0191)
(0192)
00E5 3081 CPI R24,1
00E6 F408 BCC 0x00E8
00E7 C0AF RJMP 0x0197
(0193) #pragma interrupt_handler int1_isr:3
(0194) void int1_isr(void)
00E8 E081 LDI R24,1
00E9 9380008A STS rsok00,R24
00EB 2422 CLR R2
(0195) {
(0196) //external interupt on INT1
(0197) }
(0198)
(0199) //call this routine to initialize all peripherals
(0200) void init_devices(void)
(0201) {
00EC 9220008D STS rscnt01,R2
(0202) //stop errant interrupts until set up
00EE C0A8 RJMP 0x0197
(0203) CLI(); //disable all interrupts
(0204) watchdog_init();
00EF 90200089 LDS R2,rsok10
(0205) timer0_init();
00F1 2022 TST R2
00F2 F541 BNE 0x011B
(0206) timer1_init();
(0207) timer2_init();
00F3 B02C IN R2,0x0C
00F4 92200090 STS rscnt11,R2
(0208) MCUCR = 0x08; //INT1的下降沿产生中断
00F6 2D82 MOV R24,R2
(0209) GICR = 0x80; //BOOT区起始地址
00F7 3180 CPI R24,0x10
00F8 F4F1 BNE 0x0117
00F9 E081 LDI R24,1
00FA 93800089 STS rsok10,R24
00FC 2422 CLR R2
00FD 9220008C STS xx0,R2
00FF 9220008B STS xx1,R2
(0210) TIMSK = 0x41; //timer interrupt sources
(0211) SEI(); //re-enable interrupts
(0212) //all peripherals are now initialized
(0213) }
(0214)
(0215)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -