2016-10-10 68 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