Страница 1 из 1

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

Добавлено: Ср мар 10, 2010 13:58:36
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 векторе.

Подскажите, где проблема ?

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

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

    .org    OVF1addr
    jmp    <метка>
OVF1addr - просто копируется, для исключения ошибок, из файла с описанием m2560def.inc, вектора там в самом конце описываются.

Добавлено: Ср мар 10, 2010 14:54:05
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" я наблюдаю этот самый переход.

Или я заблуждаюсь ?

Добавлено: Ср мар 10, 2010 15:00:25
GP1
Вы путаете адрес вектора с его номером.
Замени rjmp init на jmp init
Попробуй конструкцию как я написал выше, или после каждой заглушки RETI добавь по NOP и посмотри куда будешь брякаться :)))

Добавлено: Ср мар 10, 2010 15:12:49
Pooher
Не, ну сам же написал
Vector Program
No. Address
1 $0000
2 $0002
...
33 $0040
34 $0042
35 $0044
чего не понятного-то? 0000, 0002 ...? Что не вектор-то слово :)))

Добавлено: Ср мар 10, 2010 15:15:40
GP1
Pooher писал(а): чего не понятного-то? 0000, 0002 ...? Что не вектор-то слово :)))
Мяу, Pooher!
Я конечно дико извиняюсь, но только ... 2 слова :)))

Добавлено: Ср мар 10, 2010 15:16:38
Shockk
окок :)) Всё, понял .. Спасибо огромное :beer:

А то до этого игрался с Attiny2313 там переход через rjmp)

Добавлено: Ср мар 10, 2010 15:17:57
GP1
Дык там и памяти - кот наплакал :cry:

Добавлено: Ср мар 10, 2010 15:19:09
Pooher
ГЫ!