реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Прерывания AVR
777777
сообщение Nov 4 2009, 05:55
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Пришелец @ Nov 3 2009, 12:56) *
если в момент обнуления TIMSK (в момент исполнения этой команды или за одну команду до неё)
начнёт обрабатываться запрос на прерывание по таймеру то он будет обработан

Вы для начала расскажите, чего вы хотите добиться в самом общем виде, а то непонятно зачем обнулять TIMSK да еще при этом делать общий запрет прерываний. Почему вы боитесь, что прерывание может выполниться сразу после обнуления TIMSK, но не боитесь, что оно выполнится за несколько команд до него.
Go to the top of the page
 
+Quote Post
bekas
сообщение Nov 25 2009, 14:02
Сообщение #17





Группа: Участник
Сообщений: 4
Регистрация: 25-11-09
Пользователь №: 53 859



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

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

TIMSK - 01000000 (Разрешить прерывания по совпадению канала А таймера Т1)
TCCR1B - 00001010 (Сброс таймера при совпадении, частота таймера 1/8 тактовой)
OCR1AL и OCR1AН некоторые числа

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

Сообщение отредактировал bekas - Nov 25 2009, 14:07
Go to the top of the page
 
+Quote Post
SysRq
сообщение Nov 25 2009, 14:23
Сообщение #18


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(bekas @ Nov 25 2009, 17:02) *
...можете мне сказать что я забыл сделать???
Разрешить прерывания глобально. Флаг I в SREG. Команды SEI, CLI.
Go to the top of the page
 
+Quote Post
Duhas
сообщение Nov 25 2009, 14:24
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 227
Регистрация: 13-04-07
Пользователь №: 27 018



мб разрешить прерывания глобально? SEI...
Go to the top of the page
 
+Quote Post
bekas
сообщение Nov 25 2009, 21:06
Сообщение #20





Группа: Участник
Сообщений: 4
Регистрация: 25-11-09
Пользователь №: 53 859



не помогает, следующеедействие после команды SEI это переход по адресу $001 при этом даже флаг TIFR не успевает установиться
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 25 2009, 21:18
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(bekas @ Nov 26 2009, 00:06) *
не помогает, следующеедействие после команды 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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
smac
сообщение Nov 25 2009, 21:24
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(bekas @ Nov 26 2009, 00:06) *
не помогает, следующеедействие после команды SEI это переход по адресу $001 при этом даже флаг TIFR не успевает установиться

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

Вот пока писал Вам уже предыдущий оратор правильную дорогу (к таблице векторов прерываний) показал.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 25 2009, 21:36
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(smac @ Nov 26 2009, 00:24) *
Вот пока писал Вам уже предыдущий оратор правильную дорогу (к таблице векторов прерываний) показал.

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


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
bekas
сообщение Nov 25 2009, 22:02
Сообщение #24





Группа: Участник
Сообщений: 4
Регистрация: 25-11-09
Пользователь №: 53 859



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

Сообщение отредактировал bekas - Nov 25 2009, 22:06
Go to the top of the page
 
+Quote Post
bekas
сообщение Dec 11 2009, 14:52
Сообщение #25





Группа: Участник
Сообщений: 4
Регистрация: 25-11-09
Пользователь №: 53 859



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

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


Код
; Начало программы
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
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 11 2009, 15:04
Сообщение #26


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(bekas @ Dec 11 2009, 16:52) *
Для наглядности ниже текст программы:

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

1. указать МК, для которого пишется программа .include "tn2313def.inc"
2. вместо веселых нечитаемых констант 0b0100000, пользовать осмысленные имена битов (1 << OCIE1A) чтобы было видно какие биты включаются.
3. поудалять бездумно натыканные команды CLI.
4. описать всю таблицу прерываний как в даташите.
5. вынести SEI за переделы основного цикла.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 21:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016