AVR中断引起重启

发布者:心愿实现最新更新时间:2018-07-16 来源: eefocus关键字:AVR  中断  重启 手机看文章 扫描二维码
随时随地手机看文章

AVR中打开中断但没有相应的中断服务函数,会引起芯片重启,通过分析编译产生的汇编代码可以清楚的理解问题所在。


编译器使用 Atmel Atudio7.0


芯片:ATmega128A


由于没有找到产生汇编代码的方法,因此使用ReAVR进行反汇编。


以下为有ISR的情况


C语言


#include

#include "avr/interrupt.h"

 

void initTimer3();

 

int main(void)

{

initTimer3();

sei();

while(1)

{

 

}//while(1)

}

 

 

void initTimer3()

{

TCNT3=0x0000;

TCCR3B=0x01;

OCR3A=14745;

ETIMSK=0x10;

}

 

ISR(TIMER3_COMPA_vect)

{

TCNT3=0x0000;

}



汇编


; reassembly of "Electronic Counter.hex"

; created by ReAVR V3.5.0

; at 2016/02/28 - 16:42:14

; for Atmel AVR assembler

;---------------------------------------

; AVR_TYPE=

; FLASH_SIZE=8KB

; SRAM_START=0x60

;---------------------------------------

.cseg

.org 0x0000

;---------------------------------------

; byte constants:

;

.equ k01 = 0x01 ;

.equ k10 = 0x10 ;

.equ k39 = 0x39 ; '9'

.equ k99 = 0x99 ;

.equ kFF = 0xFF ; '˙'

;

; io register addresses:

;

.equ p3D = 0x3D

.equ p3E = 0x3E

.equ p3F = 0x3F

;

; bit numbers:

;

.equ b0 = 0x00

.equ b1 = 0x01

.equ b2 = 0x02

.equ b3 = 0x03

.equ b4 = 0x04

.equ b5 = 0x05

.equ b6 = 0x06

.equ b7 = 0x07

;---------------------------------------

;

L0000:

jmp _reset ; L0046

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0067   //向量号27 TIMER3_COMPA

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

;

_reset:

; L0046:

clr r1

out p3F,r1

ldi r28,kFF

ldi r29,k10

out p3E,r29

out p3D,r28

call L0063

jmp L0075

; ----------- jump on last line

L0050:  //默认中断服务函数,相当于触发reset中断

jmp L0000

; ----------- jump on last line

L0052:

sts D0089,r1

sts D0088,r1

ldi r24,k01

sts D008A,r24

ldi r24,k99

ldi r25,k39

sts D0087,r25

sts D0086,r24

ldi r24,k10

sts D007D,r24

ret

;----------------------*

; pc=0x63(0xC6)

;

L0063:

call L0052

sei

L0066:

rjmp L0066

; ----------- jump on last line

; pc=0x67(0xCE)

;

L0067:  //TIMER3_COMPA中断服务函数,正常

push r1

push r0

in r0,p3F

push r0

clr r1

sts D0089,r1

sts D0088,r1

pop r0

out p3F,r0

pop r0

pop r1

reti

;----------------------*

; pc=0x75(0xEA)

;

L0075:

cli

L0076:

rjmp L0076

; ----------- jump on last line

; pc=0x77(0xEE)

;

; last flash byte address = 0x00ED

; last flash word address = 0x0076

;---------------------------------------

.dseg

.org 0x007D

;

D007D:

.byte 9

D0086:

.byte 1

D0087:

.byte 1

D0088:

.byte 1

D0089:

.byte 1

D008A:

;

; last lds/sts data byte at 0x008A

;---------------------------------------

;





无ISR的汇编代码


; reassembly of "Electronic Counter.hex"

; created by ReAVR V3.5.0

; at 2016/02/28 - 16:40:21

; for Atmel AVR assembler

;---------------------------------------

; AVR_TYPE=

; FLASH_SIZE=8KB

; SRAM_START=0x60

;---------------------------------------

.cseg

.org 0x0000

;---------------------------------------

; byte constants:

;

.equ k01 = 0x01 ;

.equ k10 = 0x10 ;

.equ k39 = 0x39 ; '9'

.equ k99 = 0x99 ;

.equ kFF = 0xFF ; '˙'

;

; io register addresses:

;

.equ p3D = 0x3D

.equ p3E = 0x3E

.equ p3F = 0x3F

;

; bit numbers:

;

.equ b0 = 0x00

.equ b1 = 0x01

.equ b2 = 0x02

.equ b3 = 0x03

.equ b4 = 0x04

.equ b5 = 0x05

.equ b6 = 0x06

.equ b7 = 0x07

;---------------------------------------

;

L0000:

jmp _reset ; L0046

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050   //向量号27 TIMER3_COMPA

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

jmp L0050

; ----------- jump on last line

;

_reset:

; L0046:

clr r1

out p3F,r1

ldi r28,kFF

ldi r29,k10

out p3E,r29

out p3D,r28

call L0063

jmp L0067

; ----------- jump on last line

L0050:  //默认中断服务函数,相当于触发reset中断

jmp L0000

; ----------- jump on last line

L0052:

sts D0089,r1

sts D0088,r1

ldi r24,k01

sts D008A,r24

ldi r24,k99

ldi r25,k39

sts D0087,r25

sts D0086,r24

ldi r24,k10

sts D007D,r24

ret

;----------------------*

; pc=0x63(0xC6)

;

L0063:

call L0052

sei

L0066:

rjmp L0066

; ----------- jump on last line

; pc=0x67(0xCE)

;

L0067:

cli

L0068:

rjmp L0068

; ----------- jump on last line

; pc=0x69(0xD2)

;

; last flash byte address = 0x00D1

; last flash word address = 0x0068

;---------------------------------------

.dseg

.org 0x007D

;

D007D:

.byte 9

D0086:

.byte 1

D0087:

.byte 1

D0088:

.byte 1

D0089:

.byte 1

D008A:

;

; last lds/sts data byte at 0x008A

;---------------------------------------

;

关键字:AVR  中断  重启 引用地址:AVR中断引起重启

上一篇:Atmage16中断学习—外部中断
下一篇:在ATmega8中真实可用的ADC转换器写法

推荐阅读最新更新时间:2024-03-16 16:08

avr bootloader 开发笔记
折腾了差不多3天,终于调试成功了,不过是个初期的东西,以后还需要加强可靠性和易用性及安全性的考虑,好歹现在可以直接通过bootloader升级程序了,先整理下整个过程吧,方便自己以后查阅,也方便有需要的人,因为开发的过程中借鉴了好多别人的东西。 开发的缘由:公司的定制化软件比较多,用户拿到产品后又会有新的需求,其实很多就是纯软件的修改,现在就是工程师到现成开盖,拿下载器重新烧程序,会比较麻烦,因为产品的对外接口都有串口,而且Atmega 本身支持bootloader功能,于是想到了用串口升级程序这个法子J。 开发环境及工具:硬件平台:用的是公司Atmega128平台下的板子,AVR的一个并口下载器,软件:编译器:ICCAVR 7.
[单片机]
<font color='red'>avr</font> bootloader 开发笔记
S3C2440中的异常与中断
1、异常与中断的简单介绍与实现 S3C2440中一共有7种模式(如图1),其中异常模式有svc(管理模式)、abt(中止模式)、und(未定义指令模式)、irq(中断模式)和 fiq(快中断模式)5种,中止模式又分为指令预取中止和数据访问中止;usr(用户模式)不可直接切换到其他模式,而其他6种模式都可以通过修改CPSR 与其他模式进行切换(参考图3和图4)。 之所以会有这么多的异常模式是为了能更好地处理程序遇到的各种异常,在ARM状态下(S3C2440的CPU有ARM状态和THUMB状态之分)这些异常模式的差别如图2所示。在supervisor、abortt、iqr和undefine中,R0-R12 和 CPSR是通用的寄存器,
[单片机]
S3C2440中的异常与<font color='red'>中断</font>
S3C2440裸机------异常与中断__按键中断程序示例
1.中断处理流程 首先我们要对中断进行初始化,中断初始化主要分为下面三块: 设置中断,让它能够发出中断信号, 设置中断控制器,让它能够发出中断信号给CPU, 设置CPU,CPSR有I位,它是总开关。 然后中断的处理过程和之前说的异常处理过程类似,不一样的就是处理完成之后要清中断。 2 start.s 首先我们CPSR寄存器的bit7清零,这是中断的总开关,只有这一位设置为0才能相应中断。 mrs r0, cpsr /* 读出cpsr */ bic r0, r0, #(1 7) /* 清除I位, 使能中断 */ msr cpsr, r0 然后当发生中断时,程序会跳转到0x18的地方去执行程序,因此我们增加如下代码
[单片机]
S3C2440裸机------异常与<font color='red'>中断</font>__按键<font color='red'>中断</font>程序示例
基于CC2430的无线温度检测终端的设计
0 引 言 在现代工农业生产中,常常需要对环境温度进行检测。传统的方法往往费时、费力,效率低下,不便应用在对较大环境的温度检测中。本文设计了一种基于无线射频技术的温度检测终端,它以RF(射频)芯片CC2430为核心,在温度传感器DS1822的配合下,能够高效地完成对环境温度的无线检测。 1 CC2430芯片概述 CC2430芯片为Chipcon公司生产的2.4 GHz射频系统单芯片,其结构框图如图1所示。 该单芯片上整合了ZigBee RF前端,内存,微控制器。其主要特点如下:高性能和低功耗的8051微控制器核;集成符合IEEE 802.15.4标准的2.4 GHz的RF无线电收发机;优良的无线接收灵敏度和强大的抗干扰
[应用]
STM8 UART中断发,中断
STM8 UART 初始化 配置STM8 UART的几个常用寄存器分别为: UART1_CR1:控制寄存器1 UART1_CR3:控制寄存器3 UART1_BRR2:波特率寄存器2 UART1_BRR1:波特率寄存器1 利用控制寄存器1,2,3可以配置UART数据传输的具体帧格式,这里将UART配置为1个起始位,8个数据位,1个停止位,无校验位。具体操作代码如下: UART1_CR1=0x00; UART1_CR3=0x00; 在UART1_CR1中第4位,定义了数据字的长度,该位写0将设置UART为一个起始位,8个数据位,n个停止位,停止位n的数量可在UART1_CR3中设置。 UART1_CR
[单片机]
单片机中断学习心得
一开始接触单片机中断,或许大部分人不知道什么时候用的上,又该怎么样用。其实,中断的运用极大地提高了工作的效率,中断在自动化行业是时时刻刻都在用,就像我们的计算机,一开始按照内置程序运行,但是当我们敲打键盘或者是点击鼠标时,它就必须停下当前的工作来响应现在的工作。 学习中断,就必须了解中断的寄存器和中断的优先级及中断如何使用如何定义等一系列的问题。 一个简单的单片机中断初始化程序 TMOD=0x01;//工作方式选择,选用T0 设置初值 TH0=(65536-50000)/256;//高八位 TL0=(65536-50000)%256;//低八位 EA=1;//开总中断 ET0=1;//开定时器0中断 TR0=1;
[单片机]
AVR单片机I/O口使用的几个注意事项
简介:AVR单片机I/O口使用的几个注意事项 1.先正确设置DDRx方向寄存器,再进行I/O口的读写操作。 2.I/O口复位后的初始状态全部为输入工作方式,内部上拉电阻无效,外部引脚呈现三态高阻输入状态。 3.当I/O口工作在输入方式时,且要读取外部引脚上的电平时,应读取PINxn的值,而不是PORTxn的值。 4.当I/O工作在输入方式时,要根据实际情况使用或不使用内部的上拉电阻。 5.一旦将I/O口的工作方式由输出设置成输入方式后,必须等待1个时钟周期后才能正确读到外部引脚PINxn的值。
[单片机]
ICC错误集锦,看懂ICC AVR的报错
新手用ICC编程的时候,经常会出现一些错误,现在将常见的错误报告整理如下。这里的一些错误是我为了展示而故意制造的,欢迎你提供你遇到的错误。排名不分先后: 一、正常编译通过 CODE: C:\icc\bin\imakew -f main.mak iccavr -c -IC:\icc\include\ -e -DATMEGA -DATMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.c iccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved