📄 12dog.lst
字号:
__text_start:
__start:
0046 EFCF LDI R28,0xFF
0047 E1D0 LDI R29,0x10
0048 BFCD OUT 0x3D,R28
0049 BFDE OUT 0x3E,R29
004A 51C0 SUBI R28,0x10
004B 40D0 SBCI R29,0
004C EA0A LDI R16,0xAA
004D 8308 STD Y+0,R16
004E 2400 CLR R0
004F E0E0 LDI R30,0
0050 E0F1 LDI R31,1
0051 E011 LDI R17,1
0052 30E0 CPI R30,0
0053 07F1 CPC R31,R17
0054 F011 BEQ 0x0057
0055 9201 ST R0,Z+
0056 CFFB RJMP 0x0052
0057 8300 STD Z+0,R16
0058 E8EC LDI R30,0x8C
0059 E0F0 LDI R31,0
005A E0A0 LDI R26,0
005B E0B1 LDI R27,1
005C E010 LDI R17,0
005D 38EC CPI R30,0x8C
005E 07F1 CPC R31,R17
005F F021 BEQ 0x0064
0060 95C8 LPM
0061 9631 ADIW R30,1
0062 920D ST R0,X+
0063 CFF9 RJMP 0x005D
0064 940E008B CALL _main
_exit:
0066 CFFF RJMP _exit
_delay_ms:
a --> R20
b --> R22
i --> R16
0067 940E00B9 CALL push_gset2
FILE: E:\ICCAVR\project\AVRMEG~3\icc\012-WATCHDOG\main.c
(0001) /*
(0002) 实验十二:
(0003) AVR内部看门口实验。
(0004) 1、看门口实验。在主程序中周期喂狗,通过按下按键让程序无限循环,从而启动看门狗。
(0005) 程序在启动时会检查启动方式,上电复位、掉电复位、外部复位、看门狗复位,显示出来。
(0006) 上电复位: PB0 正常的通电复位。
(0007) 外部复位: PB1 外部按键复位。
(0008) 掉电复位: PB2 工作过程中电压瞬间跌落,硬件保护,这个对系统可靠性非常重要。
(0009) 需要打开熔丝位里面的BOD功能才有效。
(0010) 看门狗复位: PB3 看门狗定时器复位,用于程序死机保护,软件保护。
(0011) JTAG复位: PB4 这个是仿真器复位,没什么大用外。
(0012) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0013) 3、进行此实验请插上LED短路块。
(0014) 4、通过此实验可了解看门狗的设置及看门狗的喂狗等,通过这个实验可以让你认识到复位功能和重要性。
(0015) 5、看门狗复位的输入信号是按键7,当它长时间按下时,就会产生看门狗复位。
(0016)
(0017) AVR mega128学习板
(0018) www.iccavr.com 阿发
(0019) 16:20 2007-10-19
(0020) */
(0021)
(0022) #include "iom128v.h"
(0023) #include <macros.h>
(0024)
(0025) /*延时函数*/
(0026) void delay_ms(unsigned char i) {
(0027)
(0028) unsigned char a, b;
(0029) for (a = 0; a < i; a++) {
0069 2744 CLR R20
006A C006 RJMP 0x0071
(0030) for (b = 1; b; b++);
006B E061 LDI R22,1
006C C001 RJMP 0x006E
006D 9563 INC R22
006E 2366 TST R22
006F F7E9 BNE 0x006D
0070 9543 INC R20
0071 1740 CP R20,R16
0072 F3C0 BCS 0x006B
0073 940E00B0 CALL pop_gset2
0075 9508 RET
(0031) }
(0032) }
(0033)
(0034) /*IO口初始化函数*/
(0035) void io_init(void) {
(0036)
(0037) DDRA = 0x00; /*方向输入*/
_io_init:
0076 2422 CLR R2
0077 BA2A OUT 0x1A,R2
(0038) PORTA = 0xFF; /*打开上拉*/
0078 EF8F LDI R24,0xFF
0079 BB8B OUT 0x1B,R24
(0039) DDRB = 0xFF; /*方向输出*/
007A BB87 OUT 0x17,R24
(0040) PORTB = 0xFF; /*输出高电平*/
007B BB88 OUT 0x18,R24
(0041) DDRC = 0x00; /*不用的IO口建议设置为输入带上拉*/
007C BA24 OUT 0x14,R2
(0042) PORTC = 0xFF;
007D BB85 OUT 0x15,R24
(0043) DDRD = 0x00;
007E BA21 OUT 0x11,R2
(0044) PORTD = 0xFF;
007F BB82 OUT 0x12,R24
(0045) DDRE = 0x00;
0080 B822 OUT 0x02,R2
(0046) PORTE = 0xFF;
0081 B983 OUT 0x03,R24
(0047) DDRF = 0x00;
0082 92200061 STS 0x61,R2
(0048) PORTF = 0xFF;
0084 93800062 STS 0x62,R24
(0049) DDRG = 0x00;
0086 92200064 STS 0x64,R2
(0050) PORTG = 0xFF;
0088 93800065 STS 0x65,R24
008A 9508 RET
(0051) }
(0052)
(0053) void main(void) {
(0054)
(0055) io_init();
_main:
008B DFEA RCALL _io_init
008C C006 RJMP 0x0093
(0056) while (PORTB) { /*启动指示*/
(0057) /*喂狗,看门狗复位时不会清除看门狗时间,所以这里要喂狗*/
(0058) WDR();
008D 95A8 WDR
(0059) PORTB <<= 1;
008E B228 IN R2,0x18
008F 0C22 LSL R2
0090 BA28 OUT 0x18,R2
(0060) delay_ms(250);
0091 EF0A LDI R16,0xFA
0092 DFD4 RCALL _delay_ms
0093 B228 IN R2,0x18
0094 2022 TST R2
0095 F7B9 BNE 0x008D
(0061) }
(0062)
(0063) PORTB = ~(MCUCSR & 0x1F); /*指示复位类型*/
0096 B784 IN R24,0x34
0097 718F ANDI R24,0x1F
0098 9580 COM R24
0099 BB88 OUT 0x18,R24
(0064) MCUCSR = 0x00; /*清除复位标志*/
009A 2422 CLR R2
009B BE24 OUT 0x34,R2
(0065)
(0066) WDTCR |= ((1 << WDCE) | (1 << WDE)); /*启动时序*/
009C B581 IN R24,0x21
009D 6188 ORI R24,0x18
009E BD81 OUT 0x21,R24
(0067) WDTCR = ((1<< WDE) | (1 << WDP2) | (1 <<WDP1)); /*设定周期为1S*/
009F E08E LDI R24,0xE
00A0 BD81 OUT 0x21,R24
00A1 C00C RJMP 0x00AE
(0068)
(0069) while (1) {
(0070) delay_ms(250);
00A2 EF0A LDI R16,0xFA
00A3 DFC3 RCALL _delay_ms
(0071) WDR(); /*喂狗*/
00A4 95A8 WDR
(0072) PORTB ^= (1 << PB7); /*PB7电平取反*/
00A5 E880 LDI R24,0x80
00A6 E090 LDI R25,0
00A7 B228 IN R2,0x18
00A8 2433 CLR R3
00A9 2628 EOR R2,R24
00AA 2639 EOR R3,R25
00AB BA28 OUT 0x18,R2
(0073) while(!(PINE & (1 << PE7))); /*检测按键*/
FILE: <library>
00AC 9B0F SBIS 0x01,7
00AD CFFE RJMP 0x00AC
00AE CFF3 RJMP 0x00A2
00AF 9508 RET
pop_gset2:
00B0 E0E2 LDI R30,2
00B1 940C00BF JMP pop
push_gset5:
00B3 92FA ST R15,-Y
00B4 92EA ST R14,-Y
push_gset4:
00B5 92DA ST R13,-Y
00B6 92CA ST R12,-Y
push_gset3:
00B7 92BA ST R11,-Y
00B8 92AA ST R10,-Y
push_gset2:
00B9 937A ST R23,-Y
00BA 936A ST R22,-Y
push_gset1:
00BB 935A ST R21,-Y
00BC 934A ST R20,-Y
00BD 9508 RET
pop_gset1:
00BE E0E1 LDI R30,1
pop:
00BF 9149 LD R20,Y+
00C0 9159 LD R21,Y+
00C1 FDE0 SBRC R30,0
00C2 9508 RET
00C3 9169 LD R22,Y+
00C4 9179 LD R23,Y+
00C5 FDE1 SBRC R30,1
00C6 9508 RET
00C7 90A9 LD R10,Y+
00C8 90B9 LD R11,Y+
00C9 FDE2 SBRC R30,2
00CA 9508 RET
00CB 90C9 LD R12,Y+
00CC 90D9 LD R13,Y+
00CD FDE3 SBRC R30,3
00CE 9508 RET
00CF 90E9 LD R14,Y+
00D0 90F9 LD R15,Y+
00D1 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -