Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите новичку!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kuznec9999
Здравствуйте. Стал изучать ассемблер для 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. Спасибо
Dj.Shadow
Возрат из прерывания осуществляеться командой reti...
Дайте полный исходник, в том что вы написали я других ошибок не вижу.
Kuznec9999
Цитата(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
sysel
Стек не инициализирован.
Kuznec9999
Цитата(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
Vlad219i
Цитата(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


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

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


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

Вообще - AVRstudio->Help->Assembler help вам в помощь. :-)
Kuznec9999
Спасибо!
Убрал 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

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

Компилятор по умолчанию начал генерить код с адреса 0. И нагенерил достаточно, а потом с адреса 9, портя предыдущий код начинается генерация нового участка
Kuznec9999
Цитата(SasaVitebsk @ Apr 29 2008, 22:21) *
.org 9 разместил не там.

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


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


В данном случае - не страшно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.