fidor
|
|
1 | |
Нет прерывания от таймера 1.17.03.2013, 17:49. Показов 3712. Ответов 5
Метки нет (Все метки)
Помогите пожалуйста. При совпадении TCNT1 и OCR1A прерывание приходит на вектор "Переход на обработку при готовности ЭСППЗУ". Где неправильно?
.nolist .include "m128def.yms" .list list:.include "m128def.yms" ; @ 12 MHz .divice ATmega128 ;========================================= Псевдокоманды управления .def temp = r16 ;рабочая переменная .def temp1 = r17 ; .def temp2 = r18 ; .def temp3 = r19 ; .def temp4 = r20 ; .def temp5 = r21 ; .def temp6 = r22 ; .def temp7 = r23 ; .def temp8 = r24 ; .def temp9 = r25 ; ;.def rab=r26 ; определение рабочего регистра для команд сдвига .equ kdil=500 .equ kdil1=311 .cseg ;начало секции кода с нулевого адреса .org 0x0000 ;========================================= Переопределение векторов прерываний ; reti - функция выключена, jmp - функция включена jmp RESIT ; Переход на обработку сброса reti ; Переход на обработку запроса внешнего прерывания IRQ0 reti ; Переход на обработку запроса внешнего прерывания IRQ1 reti ; Переход на обработку запроса внешнего прерывания IRQ2 reti ; Переход на обработку запроса внешнего прерывания IRQ3 reti ; Переход на обработку запроса внешнего прерывания IRQ4 reti ; Переход на обработку запроса внешнего прерывания IRQ5 reti ; Переход на обработку запроса внешнего прерывания IRQ6 reti ; Переход на обработку запроса внешнего прерывания IRQ7 reti ; Переход на обработку при выполнении условия сравнения таймера - счетчика 2 reti ; Переход на обработку при переполнении таймера - счетчика 2 reti ; Переход на обработку при захвате фронта таймером - счетчика 1 jmp OC1A_addr ; Переход на обработку при срабатывании компаратора А таймера - счетчика 1 reti ; Переход на обработку при срабатывании компаратора В таймера - счетчика 1 reti ; Переход на обработку при переполнении таймера - счетчика 1 reti ; Переход на обработку при выполнения условия сравнения таймера - счетчика 0 reti ; Переход на обработку при переполнении таймера - счетчика 0 reti ; Переход на обработку при завершении передачи SPI reti ; Переход на обработку при завершении приема УСАПП0 reti ; Переход на обработку при освобождении регистра данных UDR УСАПП0 reti ; Переход на обработку при завершении передачи УСАПП0 reti ; Переход на обработку при завершении преобразования АЦП reti ; Переход на обработку при готовности ЭСППЗУ reti ; Переход на обработку при срабатывании аналогового компаратора reti ; Переход на обработку при срабатывании компаратора С таймера - счетчика 1 reti ; Переход на обработку при захвате фронта таймером - счетчика 3 reti ; Переход на обработку при срабатывании компаратора А таймера - счетчика 3 reti ; Переход на обработку при срабатывании компаратора В таймера - счетчика 3 reti ; Переход на обработку при срабатывании компаратора С таймера - счетчика 3 reti ; Переход на обработку при переполнении таймера - счетчика 3 reti ; Переход на обработку по завершении приема УСАПП1 reti ; Переход на обработку при освобождении регистра данных UDR УСАПП1 reti ; Переход на обработку при завершении передачи УСАПП1 reti ; Переход на обработку прерывания по двухпроводному последовательному интерфейсу reti ; Переход на обработку прерывания при готовности выполнения команды SPM Riset: ;========================================= Модуль инициализации стека ldi temp, high(ROMEND) out SPH, temp ldi temp, low (ROMEND) ;установка указателя стека в конце ОЗУ out SPL, temp ;========================================= Настройка портов ВВ ser temp ; устанавливает все биты регистра temp в 1 out DDRA,temp ; переводит все биты порта A на вывод out DDRB,temp ; переводит все биты порта B на вывод clr temp1 ; устанавливает все биты регистра temp1 в 0 out DDRD,temp1 ; переводит все биты порта D на ввод out PortA,temp1 ; отключает подтягивающие резисторы портов A out PortB,temp1 ; отключает подтягивающие резисторы портов B out PortD,temp ; включаем подтягивающие резисторы портов D ;========================================= Настройка прерываний ldi temp, 0b00000000 ;устанавливаем прер. INT1 по спаду out MCUCR,temp ;========================================= Инициализация таймера Т1 ldi Temp,0b00010000 ;разрешить прерывание компаратора out TIMSK,Temp ldi Temp,0b00000001 ;тактовый сигнал без предделителя out TCCR1B,Temp ldi Temp,0b00000000 ;инициализация компаратора out OCR1AH,Temp ldi Temp,0x0C out OCR1AL,Temp ldi Temp,0b00000000 ;обнуление таймера out TCNT1H,Temp out TCNT1L,Temp ldi Temp,0b00000000 out UCSR0A,Temp ldi temp,0b11111111 out TIFR,temp sei ;разрешить прерывания ;========================================= Основная программа m1: ldi temp1,0b00000000 ; записать в регистр temp4 out PortA,temp1 ; отправить в порт A ldi temp1,0b11111111 ; записать в регистр temp4 out PortA,temp1 ; отправить в порт A jmp m1 ; Возвращаемся к метке Cicle, зацикливаемся ;========================================= Обработка прерывания компаратора Т/С 1 OC1A_addr : ldi Temp,0 ;обнуление таймера out TCNT1H,Temp out TCNT1L,Temp ldi Temp1,0b00000001 ;загрузить значение out PortB,Temp1 ;вывод в порт reti ;выход из обработчика |
17.03.2013, 17:49 | |
Ответы с готовыми решениями:
5
Нет срабатывания прерывания Прерывания. Одновременно или нет? ATTiny13a нет прерывания с АЦП. Нет доступа к глобальной переменной в прерывании таймера |
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,283
|
|
17.03.2013, 18:00 | 2 |
RTFM
В м128 очень дофига памяти, поэтому чтобы из таблицы прерываний гарантированно допрыгнуть в любую точку (где там компилятору взбредет разместить обработчик), используются команда jmp. <Изображение удалено> Обратите внимание, что она занимает 2 слова (4 байта) - тут подробнее http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/jmp.htm А ваш reti занимает 1 слово (2 байта) - http://www.gaw.ru/html.cgi/txt/doc/micr ... m/reti.htm Поэтому естественно прыгает оно не туда - считает 2 ваших reri за один вектор. Решается нопами. Или JMP со всех ненужных векторов на один обработчик-заглушку
0
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
17.03.2013, 18:42 | 3 |
Сообщение от fidor
out MCUCR,temp ... ldi Temp,0b00000001 ;тактовый сигнал без предделителя out TCCR1B,Temp ... Ну не убеждают меня ваши комментарии к "нигическим" числам. А преобразовывать и лазить по даташиту не в масть. Используйте символьные обозначения битов.
0
|
fidor
|
|
17.03.2013, 18:50 | 4 |
Спасибо dsodir. Исправил так:
;========================================= Предопределение векторов прерываний jmp RESIT ; Riset Homdler .org OC1Aaddr jmp TYM1_COMPA ; Timer/Counter1 Compare Match A .org INT_VECTORS_SIZE Riset: |
fidor
|
|
17.03.2013, 18:59 | 5 |
Сообщение от omokost
out MCUCR,temp ... ldi Temp,0b00000001 ;тактовый сигнал без предделителя out TCCR1B,Temp ... Ну не убеждают меня ваши комментарии к "нигическим" числам. А преобразовывать и лазить по даташиту не в масть. Используйте символьные обозначения битов. Не понял |
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
17.03.2013, 19:27 | 6 |
Сообщение от fidor
Код
ldi temp, 0b00000000 ;устанавливаем прер. INT1 по спаду out MCUCR,temp Берем даташит ATmega48_88_168_328.pdf и читаем для MCUCR: Символьная запись битов в регистр TCCR1B: Код
ldi Temp,(1<<CS10) ;тактовый сигнал без предделителя out TCCR1B,Temp
0
|
17.03.2013, 19:27 | |
17.03.2013, 19:27 | |
Помогаю со студенческими работами здесь
6
Включение и отключение прерывания таймера у STM32F4 динамическое изменение периода срабатывания прерывания от таймера STM32l4xx Как настроить прерывания для каналов таймера по сравнению ? Прерывания таймера перестают работать после инициализации usart Внешние прерывания на регистре А работаю, а на D нет ( Libopencm3 usbhid то ли я дурак то ли железка нет прерывания Блок-схема пользовательского обработчика прерывания таймера Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |