2016-10-10 7 views
0

У меня есть школьная задача, но даже учитель не знает, как это сделать ... Нам нужно создать программу, которая позволяет светодиодам мигать с частотой 1 Гц. Чип, который мы используем, - ATmega32A на 3,6864 МГц. Программа должна содержать прерывания, поэтому основная программа может спать.Переключатели с прерываниями ATMEGA32A

теперь мой вопрос, я нашел SEI и функции RETI, но правильно ли я понимаю, что мне нужно написать 2 сборные программы?

1 с основным контуром для управления светодиодами.

1, который генерирует прерывание 2 Гц для переключения светодиодов?

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 секунды, поэтому ваша процедура должна будет сделать что-то вроде увеличения переменной счетчика до тех пор, пока не достигнет определенного значения. Если он достигнет значения, сбросьте счетчик и переключите светодиод. Обработчик заканчивается инструкцией 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 

 Смежные вопросы

  • Нет связанных вопросов^_^