我有一個學校的任務,但即使是老師不知道該怎麼做... 我們必須創建一個程序,讓LED閃爍頻率爲1Hz。我們使用的芯片是3,6864 MHz的ATmega32A。 程序必須包含中斷,以便主程序可以進入休眠狀態。用中斷切換LED燈ATMEGA32A
現在我的問題,我已經找到SEI和RETI功能,但我的理解正確,我必須編寫2個彙編程序?
1與主循環來控制LED。
1生成2Hz中斷來切換LED燈?
tnx提前
我有一個學校的任務,但即使是老師不知道該怎麼做... 我們必須創建一個程序,讓LED閃爍頻率爲1Hz。我們使用的芯片是3,6864 MHz的ATmega32A。 程序必須包含中斷,以便主程序可以進入休眠狀態。用中斷切換LED燈ATMEGA32A
現在我的問題,我已經找到SEI和RETI功能,但我的理解正確,我必須編寫2個彙編程序?
1與主循環來控制LED。
1生成2Hz中斷來切換LED燈?
tnx提前
我已經拿到了代碼工作的下面的代碼是一個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
不,您需要編寫一個程序。你的老師要求你瞭解中斷是如何工作的。我只用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
參見[這個問題](http://stackoverflow.com/questions/16730519/assembly-how-to-set-frequency-of-interrupt) – Jester