我有学校的任务,但即使是老师也不知道该怎么做...... 我们必须创建一个程序,让LED以1Hz的频率闪烁。我们使用的芯片是3,6864 MHz的ATmega32A。 程序必须包含中断,以便主程序可以进入休眠状态。
现在我的问题我已经找到了SEI和RETI功能,但我是否正确理解我必须编写2个汇编程序?
1,主循环控制LED。
1产生2Hz中断以切换指示灯?
提前预订
答案 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