用中断切换LED ATMEGA32A

时间:2016-10-10 19:44:11

标签: assembly interrupt avr

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

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

1,主循环控制LED。

1产生2Hz中断以切换指示灯?

提前预订

2 个答案:

答案 0 :(得分:0)

不,你需要写一个程序。您的讲师要求您了解中断的工作原理。我只用C做过这种程序,所以你必须到别处寻找关于这个主题的教程或等待另一个答案。

您的程序将设置控制某个时钟的寄存器,然后在进入具有一条使芯片进入休眠状态的指令的循环之前使用public class MyInt { private int value; void setValue(int value) { //setter this.value = value; } int getValue() { //getter return this.value; } int square() { //square method int sqred = getValue() * getValue(); return sqred; } public MyInt(int value) { //constructor setValue(value); } public static void main(String[] args) { //main to run it MyInt testCase = new MyInt(3); System.out.println(testCase.square()); } } 。您必须选择正确的睡眠模式,以便时钟仍然运行并且仍然会发生中断。

您还将编写一个您从未调用的子例程中断处理程序。相反,当时钟达到某个值时,如果发生比较中断,您可以巧妙地设置时钟来调用处理程序。

由于芯片运行得如此之快,处理程序将在1秒之前被调用很多,所以你的例程必须做一些事情,比如递增计数器变量直到达到某个值。如果达到该值,请重置计数器并切换LED。处理程序以SEI指令结束,让处理器知道返回被中断的主循环。

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

中断处理程序的伪代码类似于

RETI

答案 1 :(得分:0)

我有代码工作,下面的代码是用于时钟为3686400Hz晶体的ATmega32A

.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