реклама на сайте
подробности

 
 
> Помогите новичку!, ATMega 8, вектора прерываний
Kuznec9999
сообщение Apr 29 2008, 15:33
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 29-04-08
Пользователь №: 37 157



Здравствуйте. Стал изучать ассемблер для ATMega8. Сразу появилась масса примитивных вопросов, тем не менее на них ответов я найти не могу sad.gif. Если возможно, подскажите мне. Итак, задача простейшая - запустить таймер, при его переполнении отработать прерывание. Адрес прерывания переполнения - $0009.

Программу написал следующую

...........................................................

.include "C:\asm\AvrAssembler2\Appnotes\m8def.inc"

ldi r20,0b10000000 ; Пишем в седьмой бит r20 единицу
out sreg,r20 ; В SREG записываем r20 (разрешаем прерывания)

ldi r16,0b00000001 ; Пишем в нулевой бит r16 едиицу
ldi r17,0 ; Очищаем r17
out timsk,r16 ; В бит 0 TIMSK записываем 1 (разрешить прерывания таймера)
out tccr0,r16 ; Запускаем таймер на тактовой частоте
er: ;*****ЦИКЛ ОЖИДАНИЯ ПРЕРЫВАНИЯ*****
rjmp er ;***** ------------------------------------ *****

.org $0009 ; По адресу $0009 (где вектор прерывания)...
rjmp xxx ; Находится прыжок к подпрограмме ххх

xxx: ; Подпрограмма ххх
ret ; Возврат из подпрограммы

..................................................

После первого флага переполнения (который вроде бы обрабатывается), программа начинает постоянно обрабатывать программу переполнения, а в счётчике таймера пишутся какие-то случайные значения... Обнуление счётчика/флага переполнения не помогает. Что не так? И правильно ли я указываю путь к прерыванию таймера (я не очень понимаю как надо это делать).. Заранее прошу извинения за возможный примитивизм smile.gif. Спасибо
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01381 секунд с 7
ELECTRONIX ©2004-2016