Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 28
1

Внешнее прерывание вызывается только 1 раз

03.03.2016, 16:04. Просмотров 1793. Ответов 10
Метки нет (Все метки)


Не могу понять почему прерывание только 1 раз вызывается, хотя вроде все по схеме делал. Тестировал в proteus нажатием кнопки. Буду благодарен за любой совет.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
.include "m8def.inc"
.include "macro_delay_us.inc"
.def temp = r16
.cseg
.org 0
rjmp reset
.org $001
rjmp EXT_INT0
 
reset:
        ldi temp, high(RAMEND)
        out sph, temp
 
        ldi temp, low(RAMEND)
        out spl, temp
 
        ldi temp, 0b00000011
        out DDRB, temp
 
        ldi temp, 0b01000000
        out GICR, temp
        
        ldi temp, 0b00000011
        out MCUCR, temp
 
        sei
 
main:
    
rjmp main
 
EXT_INT0:
        cli
        BEGIN 1
        BEGIN 2
        reti
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2016, 16:04
Ответы с готовыми решениями:

Внешнее прерывание
Привет всем! Столкнулся с проблемой - при использовании внешнего прерывания по переднему фронту...

Не срабатывает внешнее прерывание
.divice atmega8 .nolist .include "m8def.yms" .list ;===================== .def temp= r16...

внешнее прерывание на tiny15
Проблема в следующем: На тини15 к выводу Int0 подключаю кнопку без фиксатора, через которую...

Внешнее прерывание на ATmega328p
Такой вот не замысловатый текст. Но ни INT0 ни INT1 не срабатывает. В AVR Studio на PORTD (если...

10
812 / 795 / 201
Регистрация: 21.09.2012
Сообщений: 2,652
03.03.2016, 17:34 2
cli в функциях прерывания делать не нужно, это делает сам микроконтроллер.
1
Модератор
Эксперт по электронике
8356 / 6202 / 834
Регистрация: 14.02.2011
Сообщений: 21,552
03.03.2016, 21:05 3
Цитата Сообщение от kolevan Посмотреть сообщение
cli
запретил прерывания, а кто разрешать будет
или ставь в конце прерывания sei, или как сказал Dolphin, выбрось эту строчку
1
953 / 582 / 97
Регистрация: 15.05.2012
Сообщений: 3,415
04.03.2016, 10:33 4
reti - выход из подпрограммы обработчика прерывания. Она сама по себе разрешает прерывания. Так что тут что есть cli, что нет его - без разницы. Бяка в другом.

Добавлено через 4 минуты
Assembler
1
2
BEGIN 1
BEGIN 2
Что это? И что за файл с делэями?
1
0 / 0 / 0
Регистрация: 12.06.2012
Сообщений: 28
04.03.2016, 22:44  [ТС] 5
Это макросы. Если в кратце они на протяжении 10мкс включают-выключают ножку с некоторыми задержками. В них проблема может быть? И еще вопрос, можно ли если выключить cli это же прерывание вызвать еще до завершения его обработки?
0
7 / 7 / 0
Регистрация: 03.04.2015
Сообщений: 45
04.03.2016, 22:56 6
По умолчанию при вызове вектора прерывания сбрасывается флаг глобального прерывания I (sei). Для разрешения глобальных прерываний необходимого их заново включить sei. В теории можно заново его вызвать, если разрешить глобальные прерывания + прерывания модуля, НО зачем это нужно? И это может привести к ошибке работы программы.
1
812 / 795 / 201
Регистрация: 21.09.2012
Сообщений: 2,652
04.03.2016, 22:59 7
Цитата Сообщение от 3050mAh Посмотреть сообщение
Для разрешения глобальных прерываний необходимого их заново включить sei.
В прерываниях, этот флаг восстанавливает сам микроконтроллер. Ничего там запрещать или разрешать не нужно
0
Модератор
Эксперт по электронике
8356 / 6202 / 834
Регистрация: 14.02.2011
Сообщений: 21,552
04.03.2016, 23:24 8
Цитата Сообщение от Dolphin Посмотреть сообщение
В прерываниях, этот флаг восстанавливает сам микроконтроллер.
не в прерываниях, а после обработки прерывания, во время обработки они запрещены
но иногда(очень редко) необходимо разрешить прерывания, чтобы обработать другое, это может привести к неправильной работе программы
1
Dolphin
05.03.2016, 00:14
  #9

Не по теме:

Не так видно понял

0
7 / 7 / 0
Регистрация: 03.04.2015
Сообщений: 45
05.03.2016, 00:23 10
Цитата Сообщение от Dolphin Посмотреть сообщение
В прерываниях, этот флаг восстанавливает сам микроконтроллер. Ничего там запрещать или разрешать не нужно
Вот и ответ.

Цитата Сообщение от ValeryS Посмотреть сообщение
не в прерываниях, а после обработки прерывания, во время обработки они запрещены
но иногда(очень редко) необходимо разрешить прерывания, чтобы обработать другое, это может привести к неправильной работе программы
Один раз, пол дня мучился, не мог понять, почему после захода в обработчик прерывания по изменению состояния пина, не вызывался обработчик таймера (была кнопка, результат которой определялся по длительности нажатия). После того как глянул в регистр CPU, сразу стало понятно, что при вызове вектора прерывания, флаг сбрасывается, и если нужно дополнительное прерывание от другого модуля, флаг глобальных прерываний, нужно установить в ручную.
1
953 / 582 / 97
Регистрация: 15.05.2012
Сообщений: 3,415
05.03.2016, 06:48 11
Лучший ответ Сообщение было отмечено kolevan как решение

Решение

Цитата Сообщение от Dolphin Посмотреть сообщение
В прерываниях, этот флаг восстанавливает сам микроконтроллер.
При запросе прерывания флаг I сбрасывается по железу, а взводится либо командой reti, либо sei (в очень редких случаях согласно разработанному программистом алгоритму, как верно указал ValeryS).
Цитата Сообщение от kolevan Посмотреть сообщение
можно ли если выключить cli
Можно всё, что угодно. Просчитайте стек и состояние переменных и всё будет в ажуре. Вообще говоря, работать с задержками в обработчике прерываний некрасиво. Взведите там флаг, мол было прерывание. А в теле программы по состоянию этого флага делайте то, что нужно.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2016, 06:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Внешнее прерывание Mega16 - [РЕШЕНО]
Код#include <avr/io.h> #include <avr/interrupt.h> ISR(INT0_vect) { DDRB = 0xFF; PORTB =...

внешнее прерывание INT0 ATtiny2313
Как изобразить прерывание в AtmelStdio7 ну хоть какое то хоть блин любое.... Сначала пробовал на...

Внешнее прерывание ATmega2560 в ASM
Добрый день! Не могу настроить прерывание по кнопке на INT0 у МК ATmega2560. Посмотрите...

Внешнее прерывание INT0. ATmega8
Я считаю что код правильный, но он не работает )))) Симуляция в Proteus показывает что прерывание...

Не работает внешнее прерывание в ATMega8 (CodeVisionAVR 3.10)
Среда CodeVisionAVR 3.10, вот код #include <mega8.h> interrupt void ext_int0_isr(void) {...

Использую внешнее прерывание, где глюк?
Соображаю тут на tiny13 программную обработку обмена по COM. Сделал следующим образом, по фронту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.