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

 
 
> Помогите новичку!, 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
Ответов (1 - 12)
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
Kuznec9999
сообщение Apr 29 2008, 16:41
Сообщение #7


Участник
*

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



Цитата(Vlad219i @ Apr 29 2008, 20:19) *
как-то так...


Спасибо огромное! Прекрасно работает (только изменил tccr0 в единицу на нулевом бите, чтобы стартовать таймер)

.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,1
out timsk,r16
out tccr0,r17

er:
rjmp er

xxx:
nop
reti


Скажите пожалуйста, что выполняют команды "cli" и .cseg?

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


Бывалый
***

Группа: Validating
Сообщений: 375
Регистрация: 19-10-05
Из: Kiev, UA
Пользователь №: 9 853



Цитата(Kuznec9999 @ Apr 29 2008, 19:41) *
Скажите пожалуйста, что выполняют команды "cli" и .cseg?

cli - запрет прерываний, а cseg - Code Segment - сегмент памяти, где должны располагаться команды процессора.


--------------------
Заходите кому надо на мой сайт
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Apr 29 2008, 16:51
Сообщение #9


Участник
*

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



Цитата(Kuznec9999 @ Apr 29 2008, 20:41) *
Скажите пожалуйста, что выполняют команды "cli" и .cseg?


cli - запрет всех прерываний.
.cseg - все что после этого написано, располагается в памяти программ (во флэше).

Вообще - AVRstudio->Help->Assembler help вам в помощь. :-)
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение Apr 29 2008, 17:01
Сообщение #10


Участник
*

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



Спасибо!
Убрал cli - это не страшно?.. Мне кажется, он здесь не обязателен. Или лучше обнулять? Можете сказать, что было принципиально неверно в моей старой программе (почему она не работала?).. А то я совсем запутался, где я накосячил.. Спасибо.

Это конечный вариант:
............................................

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

.cseg
.org 0
rjmp start

.org $0009
rjmp xxx

start:
ldi r30,low(ramend)
out spl,r30
ldi r30,high(ramend)
out sph,r30
sei
ldi r16,1
out timsk,r16
out tccr0,r16

er:
rjmp er

xxx:
nop
reti

.......................................
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 29 2008, 18:21
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



.org 9 разместил не там.

Компилятор по умолчанию начал генерить код с адреса 0. И нагенерил достаточно, а потом с адреса 9, портя предыдущий код начинается генерация нового участка
Go to the top of the page
 
+Quote Post
Kuznec9999
сообщение Apr 29 2008, 21:19
Сообщение #12


Участник
*

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



Цитата(SasaVitebsk @ Apr 29 2008, 22:21) *
.org 9 разместил не там.

Компилятор по умолчанию начал генерить код с адреса 0. И нагенерил достаточно, а потом с адреса 9, портя предыдущий код начинается генерация нового участка


Разобрался, большое спасибо!
Go to the top of the page
 
+Quote Post
Vlad219i
сообщение Apr 30 2008, 10:10
Сообщение #13


Участник
*

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



Цитата(Kuznec9999 @ Apr 29 2008, 21:01) *
Спасибо!
Убрал cli - это не страшно?.. Мне кажется, он здесь не обязателен.


В данном случае - не страшно.
Go to the top of the page
 
+Quote Post

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

 


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


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