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

 
 
> Помогите новичку!, 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
 
Start new topic
Ответов
Dj.Shadow
сообщение Apr 29 2008, 15:58
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 14-03-07
Пользователь №: 26 162



Возрат из прерывания осуществляеться командой reti...
Дайте полный исходник, в том что вы написали я других ошибок не вижу.

Сообщение отредактировал Dj.Shadow - Apr 29 2008, 16:03
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение Apr 29 2008, 16:06
Сообщение #3


Участник
*

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



Цитата(Dj.Shadow @ Apr 29 2008, 19:58) *
Возрат из прерывания осуществляеться командой reti...
Дайте полный исходник, в том что вы написали я других ошибок не вижу.


Спасибо за ответ. Команду изменил. Результат тот же. Зацикливаемся после переполнения. Reti выполняет переход на rjump xxx... И так до бесконечности

ldi r20,0b10000000
out sreg,r20

ldi r16,0b00000001
ldi r17,0
out timsk,r16
out tccr0,r16
er:
rjmp er

.org $0009
rjmp xxx

xxx:
nop
reti

Это уже полный исходник (тестовый, проверяю в пошаговом режиме)
Компилятор AVR Studio

Сообщение отредактировал Kuznec9999 - Apr 29 2008, 16:07
Go to the top of the page
 
+Quote Post
sysel
сообщение Apr 29 2008, 16:08
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 3-07-07
Пользователь №: 28 852



Стек не инициализирован.
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение Apr 29 2008, 16:14
Сообщение #5


Участник
*

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



Цитата(sysel @ Apr 29 2008, 20:08) *
Стек не инициализирован.


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


ldi r30,low(Ramend)
out spl,r30
ldi r30,high(ramend)
out spr,r30


ldi r20,0b10000000
out sreg,r20

ldi r16,0b00000001
ldi r17,0
out timsk,r16
out tccr0,r16

er:
rjmp er

.org $0009
rjmp xxx


xxx:
nop
reti

Теперь ошибка: C:\MYAVR\1\1.asm(21): error: Overlap in .cseg: addr=0x9 conflicts with 0x0:0xb
wacko.gif
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Apr 29 2008, 16:19
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 13-03-06
Из: Москва
Пользователь №: 15 204



Цитата(Kuznec9999 @ Apr 29 2008, 20:14) *
.include "C:\asm\AvrAssembler2\Appnotes\m8def.inc"

.cseg
.org 0
rjmp start

.org $0009
rjmp xxx

start:
cli
ldi r30,low(Ramend)
out spl,r30
ldi r30,high(ramend)
out sph,r30
;ldi r20,0b10000000
;out sreg,r20
sei

ldi r16,0b00000001
ldi r17,0
out timsk,r16
out tccr0,r17

er:
rjmp er

xxx:
nop
reti


как-то так...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:09
Рейтинг@Mail.ru


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