Перейти к содержанию
    

если в момент обнуления TIMSK (в момент исполнения этой команды или за одну команду до неё)

начнёт обрабатываться запрос на прерывание по таймеру то он будет обработан

Вы для начала расскажите, чего вы хотите добиться в самом общем виде, а то непонятно зачем обнулять TIMSK да еще при этом делать общий запрет прерываний. Почему вы боитесь, что прерывание может выполниться сразу после обнуления TIMSK, но не боитесь, что оно выполнится за несколько команд до него.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Товарищи специалисты, у меня тоже есть вопрос относительно прерываний. Хочу предупредить я в этом деле ещё чайник.

 

Есть ATiny2313 и нужно организовать прерывание по совпадению таймера Т1, загружаю в регистры следующее:

 

TIMSK - 01000000 (Разрешить прерывания по совпадению канала А таймера Т1)

TCCR1B - 00001010 (Сброс таймера при совпадении, частота таймера 1/8 тактовой)

OCR1AL и OCR1AН некоторые числа

 

Провожу отладку симулятором AVR Studio, при совпадении значения таймера TCNT1 и OCR1A появляется флаг TIFR, сбрасывается значение TCNT1, но прерывание не происходит, можете мне сказать что я забыл сделать???

Изменено пользователем bekas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...можете мне сказать что я забыл сделать???
Разрешить прерывания глобально. Флаг I в SREG. Команды SEI, CLI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не помогает, следующеедействие после команды SEI это переход по адресу $001 при этом даже флаг TIFR не успевает установиться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не помогает, следующеедействие после команды SEI это переход по адресу $001 при этом даже флаг TIFR не успевает установиться

 

Вам эта таблица знакома? Там команда типа RJMP существует ?

 

 

Table 21. Reset and Interrupt Vectors

Vector

No.

Program

Address Source Interrupt Definition

1 0x0000 RESET External Pin, Power-on Reset, Brown-out Reset,

and Watchdog Reset

2 0x0001 INT0 External Interrupt Request 0

3 0x0002 INT1 External Interrupt Request 1

4 0x0003 TIMER1 CAPT Timer/Counter1 Capture Event

5 0x0004 TIMER1 COMPA Timer/Counter1 Compare Match A

6 0x0005 TIMER1 OVF Timer/Counter1 Overflow

7 0x0006 TIMER0 OVF Timer/Counter0 Overflow

8 0x0007 USART0, RX USART0, Rx Complete

9 0x0008 USART0, UDRE USART0 Data Register Empty

10 0x0009 USART0, TX USART0, Tx Complete

11 0x000A ANALOG COMP Analog Comparator

12 0x000B PCINT Pin Change Interrupt

13 0x000C TIMER1 COMPB Timer/Counter1 Compare Match B

14 0x000D TIMER0 COMPA Timer/Counter0 Compare Match A

15 0x000E TIMER0 COMPB Timer/Counter0 Compare Match B

16 0x000F USI START USI Start Condition

17 0x0010 USI OVERFLOW USI Overflow

18 0x0011 EE READY EEPROM Ready

19 0x0012 WDT OVERFLOW Watchdog Timer Overflow

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не помогает, следующеедействие после команды SEI это переход по адресу $001 при этом даже флаг TIFR не успевает установиться

Дык это похоже у вас еще и прерывания по фронту или спаду int0 включены, и событие по которому происходит прерывание уже произошло. Естественно флаг прерывания защелкнулся, поэтому как только Вы глобально разрешили прерывания происходит переход на обработчик. Наверное лучше бы Вам код выложить, может и подскажут что дельное.

 

Вот пока писал Вам уже предыдущий оратор правильную дорогу (к таблице векторов прерываний) показал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот пока писал Вам уже предыдущий оратор правильную дорогу (к таблице векторов прерываний) показал.

Это не главное , главное научиться ей пользоваться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, были разрешены внешние прерывания, по умолчанию на низкий уровень входа INT0 и при наладке я этот вход не использовал-отсюда скачёк по адресу $001.

Теперь вроде работает. Спасибо всем.

Изменено пользователем bekas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Появился ещё один вопрос: после обработки прерывания насколько мне кажется прогграмма должна продолжить выполняться с места вызова прерывания, а у меня она почемуто снова вызывает прерывание и выполняет его циклически. Как с этим бороться??

 

Для наглядности ниже текст программы:

 

 

; Начало программы
rjmp Init          ;$000 Первая выполняемая комманда
reti
reti
reti
rjmp Time

;======================================

Time:

  inc Book
  nop
  nop
  nop
  cli

reti;

;======================================
Init:

ldi temp, 0b01000000
out TIMSK, temp

ldi temp, 0b00001010     ; 
out TCCR1B,temp        

out OCR1AL, temp

ldi Book,0                 ; задаём начальное 
;====================================================================

Begine:

SEI

nop
nop
nop

CLI

rjmp Begine

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для наглядности ниже текст программы:

По тексту программы - для наглядности надо бы:

 

1. указать МК, для которого пишется программа .include "tn2313def.inc"

2. вместо веселых нечитаемых констант 0b0100000, пользовать осмысленные имена битов (1 << OCIE1A) чтобы было видно какие биты включаются.

3. поудалять бездумно натыканные команды CLI.

4. описать всю таблицу прерываний как в даташите.

5. вынести SEI за переделы основного цикла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...