|
|
  |
Помогите новичку!, ATMega 8, вектора прерываний |
|
|
|
Apr 29 2008, 15:33
|
Участник

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

|
Здравствуйте. Стал изучать ассемблер для ATMega8. Сразу появилась масса примитивных вопросов, тем не менее на них ответов я найти не могу  . Если возможно, подскажите мне. Итак, задача простейшая - запустить таймер, при его переполнении отработать прерывание. Адрес прерывания переполнения - $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 ; Возврат из подпрограммы .................................................. После первого флага переполнения (который вроде бы обрабатывается), программа начинает постоянно обрабатывать программу переполнения, а в счётчике таймера пишутся какие-то случайные значения... Обнуление счётчика/флага переполнения не помогает. Что не так? И правильно ли я указываю путь к прерыванию таймера (я не очень понимаю как надо это делать).. Заранее прошу извинения за возможный примитивизм  . Спасибо
|
|
|
|
|
Apr 29 2008, 15:58
|
Участник

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

|
Возрат из прерывания осуществляеться командой reti... Дайте полный исходник, в том что вы написали я других ошибок не вижу.
Сообщение отредактировал Dj.Shadow - Apr 29 2008, 16:03
|
|
|
|
|
Apr 29 2008, 16:06
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 29 2008, 16:14
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 29 2008, 16:19
|

Участник

Группа: Свой
Сообщений: 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 как-то так...
|
|
|
|
|
Apr 29 2008, 16:41
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 29 2008, 16:51
|

Участник

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

|
Цитата(Kuznec9999 @ Apr 29 2008, 20:41)  Скажите пожалуйста, что выполняют команды "cli" и .cseg? cli - запрет всех прерываний. .cseg - все что после этого написано, располагается в памяти программ (во флэше). Вообще - AVRstudio->Help->Assembler help вам в помощь. :-)
|
|
|
|
|
Apr 29 2008, 17:01
|
Участник

Группа: Новичок
Сообщений: 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
.......................................
|
|
|
|
|
Apr 29 2008, 21:19
|
Участник

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

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

Участник

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

|
Цитата(Kuznec9999 @ Apr 29 2008, 21:01)  Спасибо! Убрал cli - это не страшно?.. Мне кажется, он здесь не обязателен. В данном случае - не страшно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|