2016-10-10 71 views
0

我有一个学校的任务,但即使是老师不知道该怎么做... 我们必须创建一个程序,让LED闪烁频率为1Hz。我们使用的芯片是3,6864 MHz的ATmega32A。 程序必须包含中断,以便主程序可以进入休眠状态。用中断切换LED灯ATMEGA32A

现在我的问题,我已经找到SEI和RETI功能,但我的理解正确,我必须编写2个汇编程序?

1与主循环来控制LED。

1生成2Hz中断来切换LED灯?

tnx提前

+0

参见[这个问题](http://stackoverflow.com/questions/16730519/assembly-how-to-set-frequency-of-interrupt) – Jester

回答

0

我已经拿到了代码工作的下面的代码是一个ATmega32A与3686400Hz晶体时钟

.org 0x000 
    rjmp reset 
.org 0x00E 
    rjmp tc0_ocm_isr 

.equ dirleds  =DDRB 
.equ leds  =PORTB 
.equ allout  =0b1111_1111 
.equ allin  =0b0000_0000 

.def temp = r16 
.def allon = r17 
.def ledtemp = r18 
.def bitlow = r20 
.def bithigh= r21 

    ldi  ledtemp,0x00 
    ldi  allon,0xff 
reset: 


    ldi  bithigh, 0x07  
    ldi  bitlow, 0x07 
    out  OCR1AH,bithigh 
    out  OCR1AL,bitlow 

    ldi  temp,0b00010000 
    out  TIMSK,temp 

    ldi  temp,0x0d 
    out  TCCR1B,temp 

    sei 



loop: 
    rjmp loop 


tc0_ocm_isr:  
    eor  ledtemp,allon 
    out  DDRB,ledtemp 
    reti 
0

不,您需要编写一个程序。你的老师要求你了解中断是如何工作的。我只用C语言编写过这种程序,所以你必须在别处寻找关于该主题的教程或等待另一个答案。

您的程序将设置控制某个时钟的寄存器,然后在进入一个循环之前使用SEI,该循环有一条使芯片进入休眠状态的指令。您必须选择正确的睡眠模式,以便时钟仍然运行并且中断仍然发生。

您还将编写一个永不会调用的子例程中断处理程序。相反,当时钟达到某个值时,您会巧妙地设置时钟来调用您的处理程序。由于芯片运行速度如此之快,处理器将在1秒之前被调用很多,所以你的例程将不得不做一些事情,比如增加一个计数器变量,直到达到某个值。如果达到该值,则重置计数器并切换LED。处理程序以RETI指令结束,让处理器知道返回中断的主循环。

您将需要研究处理器的手册。它可从Atmel网站获得。特别是,为您的中断处理程序选择一个时钟(中断之间将持续16位),并查看本章末尾的寄存器描述。您需要设置一个预分频器来减慢时钟计数器,并选择一个适当的比较值,以便很容易获得倍数达到1秒。

的中断处理程序的伪代码将是这样

add a number to the compare register to set up the next interrupt 

if counter < limit then increment counter (this is not the clock counter. It is a variable in memory you have declared) 
else reset the counter variable to 0 and toggle the LEDs 
rti