Непонятки с таймером ATmega2560

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 6
Зарегистрирован: Ср июл 01, 2009 15:29:04

Сообщение Shockk »

Добрый день!

Недавно начал осваивать МК и столкнулся с проблемой. Суть ее в том что прерывание по таймеру срабатывает не на том канале сравнения, т.е. активирую маску прерывания для OCIE3A, а прерывание происходит для канала "C" ( бряк срабатывает на 35 векторе, а не на 33. В описании это Timer/Counter3 Compare Match C и Timer/Counter3 Compare Match A ).

Вот код примера:

Код: Выделить всё

.include "m2560def.inc"

.def temp = R16
.equ kdel = 760

.cseg
.org    0
    
start:
        rjmp    init
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti	; (10)
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti	; (20)
        reti
        reti
        reti
        reti
        reti	; (25)
        reti
        reti
        reti
        reti
        reti	; (30)
        reti
        reti
        reti           ; (33) Compare match A
        reti
        reti	; (35) Compare match C
        reti
        reti	; (37)
        reti
        reti	; (39)
        reti	; (40)
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti
        reti	; (50)
        reti
        reti
        reti
        reti
        reti
        reti
        reti	; (57)

init:
        ldi     temp, low(RAMEND)
        out     SPL, temp

        ldi     temp, high(RAMEND)
        out     SPH, temp

        ldi     temp, 0x0D      ; режим таймера
        sts     TCCR1B, temp

        ldi     temp, high(kdel); старший полубайт кода совпадения
        sts     OCR1AH, temp

        ldi     temp, low(kdel) ; младший полубайт
        sts     OCR1AL, temp

        ldi     temp, 0b00000010
        sts     TIMSK1, temp

        ldi     temp, 0x80
        out     ACSR, temp

main:
        sei

m1:
        rjmp    m1

Код тестю как в AvrStudio путем установки бряка на все прерывания. Прерывание срабатывает на 35 векторе.

Подскажите, где проблема ?
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Пожалуй я Вас огорчу молодой человек.
Кто сказал Вам, что у меги2560 вектора прерываний однословные?
И прерывание у Вас брякается на векторе с адресом $18, т.е прерывание по WDT
Очень рекомендую для задания векторов прерываний использовать следующую конструкцию:

Код: Выделить всё

    .org    OVF1addr
    jmp    <метка>
OVF1addr - просто копируется, для исключения ошибок, из файла с описанием m2560def.inc, вектора там в самом конце описываются.
Последний раз редактировалось GP1 Ср мар 10, 2010 14:57:33, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Родился
Сообщения: 6
Зарегистрирован: Ср июл 01, 2009 15:29:04

Сообщение Shockk »

GP1 писал(а):Пожалуй я Вас огорчу молодой человек.
Кто сказал Вам, что у меги2560 вектора прерываний однословные?
И прерывание у Вас брякается на векторе с адресом $18, т.е прерывание по WDT
Я это подчеркнул из datasheet:


14.1 Interrupt Vectors in ATmega640/1280/1281/2560/2561

Vector Program
No. Address
1 $0000
2 $0002
...
33 $0040
34 $0042
35 $0044

В AVRStudio если я вместо reti ставлю rjmp на процедуру обработки прерывания 33, то по адресу $0040 через "Memory View" я наблюдаю этот самый переход.

Или я заблуждаюсь ?
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Вы путаете адрес вектора с его номером.
Замени rjmp init на jmp init
Попробуй конструкцию как я написал выше, или после каждой заглушки RETI добавь по NOP и посмотри куда будешь брякаться :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Не, ну сам же написал
Vector Program
No. Address
1 $0000
2 $0002
...
33 $0040
34 $0042
35 $0044
чего не понятного-то? 0000, 0002 ...? Что не вектор-то слово :)))
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Pooher писал(а): чего не понятного-то? 0000, 0002 ...? Что не вектор-то слово :)))
Мяу, Pooher!
Я конечно дико извиняюсь, но только ... 2 слова :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Родился
Сообщения: 6
Зарегистрирован: Ср июл 01, 2009 15:29:04

Сообщение Shockk »

окок :)) Всё, понял .. Спасибо огромное :beer:

А то до этого игрался с Attiny2313 там переход через rjmp)
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Дык там и памяти - кот наплакал :cry:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

ГЫ!
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»