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

 
 
> Прерывания, Как их делать?..
Михалыч
сообщение Apr 20 2005, 11:22
Сообщение #1


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Народ, объясните, пожалуйста, в чем дело?!! Как работать с прерываниями и какие там есть тонкости? Вроде все по даташиту, прерывания разрешили, прописали и... программа умело их обходит. sad.gif
И как можно делать большие задержки? Например, надо запустить подпрограмму продолжительностью 10 с, не останавливая при этом основного цикла. Да и вообще, как организовать 1, 3, 5, 10-минутные задержки? a14.gif


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
sK0T
сообщение Apr 20 2005, 12:29
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 241
Регистрация: 22-12-04
Пользователь №: 1 610



Цитата(Михалыч @ Apr 20 2005, 15:22)
Народ, объясните, пожалуйста, в чем дело?!! Как работать с прерываниями и какие там есть тонкости? Вроде все по даташиту, прерывания разрешили, прописали и... программа умело их обходит. :(
И как можно делать большие задержки? Например, надо запустить подпрограмму продолжительностью 10 с, не останавливая при этом основного цикла. Да и вообще, как организовать 1, 3, 5, 10-минутные задержки? :a14:
*



Как я помню Вы пичками балуетесь? И вопрос про них? Рекомендую скачать компилятор c2c Павла Баранова, скомпилировать им разные интересующие Вас куски кода (например delay(10);) для просмотра полученного асм-кода. В работе с прерываниями никаких подводных камней нет. При внимательном чтении инструкции работают с первого раза. Опять-таки компилятор имеет поддержку прерываний, можно скомпилировать да посмотреть.

Сделать не прерывая основной цикл задержку можно например увеличивая в обработчике таймера какую-нибудь переменную. Переменными размером 16, 32 и так далее бит задержки можно сделать длительностью хоть в год! :-)
Go to the top of the page
 
+Quote Post
Alexandr
сообщение Apr 20 2005, 13:03
Сообщение #3


Знающий
****

Группа: Модераторы
Сообщений: 804
Регистрация: 1-12-04
Пользователь №: 1 283



Цитата
И как можно делать большие задержки? Например, надо запустить подпрограмму продолжительностью 10 с, не останавливая при этом основного цикла.

Не останавливая основной цикл не получится. Контроллер (общего назначения) не ПЛИС и параллельно работать не умеет.
Задержку действительно проще всего формировать таймером, расширенным за счет внешней переменной. Есть еще более дикий вариант - посчитать время работы одного прохода основного цикла, а дальше считать кличество таких проходов.


--------------------
Иван Сусанин - первый полупроводник
Go to the top of the page
 
+Quote Post
Михалыч
сообщение Apr 20 2005, 14:58
Сообщение #4


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Совершенно верно, вопрос про них, родимых.
Давайте разберемся с прерываниями. Вот мы пишем
---------------------------------------------------------
ORG 0 ;Начало программы.
GOTO BEGIN ;Переход к основному циклу

ORG 0x04 ;Начинаем прерывания
;Сама программа
RETFIE ;Завершили прерывания

BEGIN
;Инициализация портов
;Программа
----------------------------------------------------------------
Чего где добавляем? Надо ли ссылаться на прерывания в самой программе?


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
sK0T
сообщение Apr 20 2005, 15:34
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 241
Регистрация: 22-12-04
Пользователь №: 1 610



Цитата(Михалыч @ Apr 20 2005, 18:58)
Совершенно верно, вопрос про них, родимых.
Давайте разберемся с прерываниями. Вот мы пишем
---------------------------------------------------------
ORG 0            ;Начало программы.
GOTO    BEGIN      ;Переход к основному циклу

ORG 0x04            ;Начинаем прерывания
                            ;Сама программа
RETFIE          ;Завершили прерывания

BEGIN
;Инициализация портов
;Программа
----------------------------------------------------------------
Чего где добавляем? Надо ли ссылаться на прерывания в самой программе?
*


Нигде не увидел упоминания про конфигурацию INTCON. Вы точно хорошо документацию читали?
Go to the top of the page
 
+Quote Post
Algol
сообщение Apr 20 2005, 17:05
Сообщение #6


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

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Да, настройка INTCON нужна обязательно. А конкретно от чего ловите прерывания?
У меня например, не работало прерывание по заднему фронту на RB0,а всегда было прерывание по переднему, хотя вроде все правильно прописывал по инструкции, но вот незадача, выбор по заднему или переднему фронту на RB0 делается в регистре OPTION, который находиться в первой банке. Вот из-за того что я забыл поменять банку в одном месте проги у меня и не работал весь код. Так что советую, еще и на банки обратить внимание.

PS:да, кстати, попробуйте погонять в симуляторе мп-лаба
Go to the top of the page
 
+Quote Post
Михалыч
сообщение Apr 22 2005, 14:28
Сообщение #7


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Не, это я по-простому написал. Есть там INTCON, разрешение всех прерываний, сохранение констант и пр. Мне интересно, надо ли на прерывания ссылаться в программе (goto, call) или они сами выполняются?


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
sK0T
сообщение Apr 22 2005, 20:21
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 241
Регистрация: 22-12-04
Пользователь №: 1 610



Цитата(Михалыч @ Apr 22 2005, 18:28)
Не, это я по-простому написал. Есть там INTCON, разрешение всех прерываний, сохранение констант и пр. Мне интересно, надо ли на прерывания ссылаться в программе (goto, call) или они сами выполняются?
*


Нет, не надо на прерывания никаких goto. :-)

Может у Вас просто событие которое вызывает прервывание банально не наступает? Или watchdog какой раньше срабатывает?
Go to the top of the page
 
+Quote Post
Algol
сообщение Apr 23 2005, 06:00
Сообщение #9


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

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Тогда у вас все должно просто работать, если все настроено правильно...могу еще одно предположение сделать из области фантастика...посмотрите, можт вы как нить случайно забыли в основной программе в конце алгоритма поставить goto $, или goto back, чтоб зацыклить и ожидать прерывания...если прога не имеет вечного зацыкливания, то основной алгоритм может закончиться быстрее, чем наступит прерывание
Go to the top of the page
 
+Quote Post
Михалыч
сообщение Apr 24 2005, 16:08
Сообщение #10


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Ладна, прозвоню еще вечерком smile.gif


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
Algol
сообщение Apr 24 2005, 17:21
Сообщение #11


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

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Может выложите кусочек проги, вырезав оттуда все ненужное в данном контексте? а то трудно виртуально оценить почему же не работает.
Go to the top of the page
 
+Quote Post
Михалыч
сообщение Apr 25 2005, 12:55
Сообщение #12


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Вот выкладываю. Если что-то непонятно, спрашивайте!

ORG 0 ;Начало программы.
GOTO BEGIN
ORG 0x04
BCF INTCON,5
INCF INTCOUNT,1
MOVF INTCOUNT,0
SUBLW 0x15
BTFSC STATUS,C
CLRF INTCOUNT

INTERR1 BTFSS WIRE,6
GOTO INTERR2
BCF PORTA,0
BCF PORTA,1
BCF PORTA,2
BCF PORTA,3
BTFSC INTCOUNT,1
BSF PORTA,3
BCF PORTB,7

INTERR2 BTFSS WIRE,5
GOTO INTERR3
BCF PORTA,0
BCF PORTA,1
BCF PORTA,2
BCF PORTA,3
BTFSC INTCOUNT,2
BSF PORTA,3
BCF PORTB,7

INTERR3 BTFSS WIRE,0
GOTO INTERR4
BTFSS WIRE,2
GOTO INTERR4
BCF PORTA,0
BCF PORTA,1
BCF PORTA,2
BSF PORTA,3
SUBLW 0x04 ;0,5 с=1, 2 с=0
BTFSC STATUS,C
BCF PORTA,3
BCF PORTB,7

INTERR4 BTFSS WIRE,1
GOTO INTERR5
BTFSS WIRE,2
GOTO INTERR5
BSF PORTA,0
BSF PORTA,1
BCF PORTA,2
BSF PORTA,3
BCF PORTB,7

INTERR5 BTFSS WIRE,2
GOTO INTERR6
BCF PORTA,0
BTFSC INTCOUNT,3 ;0,5 Гц
BSF PORTA,0
BCF PORTA,1
MOVF INTCOUNT,0 ;2с=1, 1с=0
BSF PORTA,2
SUBLW 0x10
BTFSC STATUS,C
BCF PORTA,2
BCF PORTA,3
BTFSC INTCOUNT,3
BSF PORTA,3
BCF PORTB,7
BTFSC INTCOUNT,3
BSF PORTB,7

INTERR6 BTFSS WIRE,3
GOTO INTERR7
BCF PORTA,0
BTFSC INTCOUNT,3
BSF PORTA,0
BCF PORTA,1
BSF PORTA,2
BCF PORTA,3
BTFSC INTCOUNT,3
BSF PORTA,3
BCF PORTB,7
BTFSC INTCOUNT,3
BSF PORTB,7

INTERR7 BTFSS WIRE,7
GOTO INTERR8
MOVF INTCOUNT,0
BSF PORTA,0
SUBLW 0x5
BTFSC STATUS,C
BCF PORTA,0
BSF PORTA,1
MOVF INTCOUNT,0 ;1с=1, 2с=0
BSF PORTA,3
SUBLW 0x5
BTFSC STATUS,C
BCF PORTA,3

INTERR8 BTFSS WIRE,1
GOTO INTERR9
BTFSS WIRE,0
GOTO INTERR9
BCF PORTA,0
BTFSC INTCOUNT,2
BSF PORTA,0
BCF PORTA,1
BCF PORTA,2
BTFSC INTCOUNT,3
BSF PORTA,2
BCF PORTA,3
BTFSC INTCOUNT,2
BSF PORTA,3
BCF PORTB,7
BTFSC INTCOUNT,3
BSF PORTB,7

INTERR9 BTFSS WIRE,8
GOTO INTERR1
BCF PORTA,0
BTFSC INTCOUNT,2
BSF PORTA,0
BCF PORTA,1
BCF PORTA,2
BCF PORTA,3
BTFSC INTCOUNT,2
BSF PORTA,3
BCF PORTB,7
BTFSC INTCOUNT,3
BSF PORTB,7
BSF INTCON,5
RETFIE smile.gif


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
Algol
сообщение Apr 26 2005, 05:28
Сообщение #13


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

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Вообще честно говоря интересовал кусочек проги, сразу после BEGIN, где у вас идет настройка INTCON и ожидание прерыванияsmile.gif
Судя по этому куску обработки прерывания, в нем вроде бы все ок на первый взгляд, правда есть одно но...
Я не совсем понял от чего вы прерывания ловите, хотя по строкам
BSF INTCON,5
....................
BCF INTCON,5
рискну предположить что от TMR0. Флаг прерывания от TMR0 не сбрасывается аппаратно, а вот в подпрограмме я нигде не нашел строки которая бы программно сбрасывала флаг прерывания T0IF, нечто вроде
BCF INTCON,T0IF.

PS: еще одно но, что нашел в доках...прерывания от TMR0 не генерятся в SLEEP режиме.
Go to the top of the page
 
+Quote Post
Михалыч
сообщение Apr 26 2005, 16:11
Сообщение #14


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Совершенно верно, от TMR0 и ловлю smile.gif
BCF INTCON,T0IF - может быть, может быть! Переставлю сейчас же
А sleep-режим я пока не использую smile.gif


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
Михалыч
сообщение Apr 29 2005, 15:41
Сообщение #15


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Цитата(sK0T @ Apr 20 2005, 17:29)
Сделать не прерывая основной цикл задержку можно например увеличивая в обработчике таймера какую-нибудь переменную. Переменными размером 16, 32 и так далее бит задержки можно сделать длительностью хоть в год! :-)
*

Вот, давайте этот вопрос давить будем. Не совсем понятно, о чем речь smile3046.gif


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post
Algol
сообщение Apr 30 2005, 07:02
Сообщение #16


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

Группа: Свой
Сообщений: 140
Регистрация: 7-04-05
Из: Россия, Владимир
Пользователь №: 3 941



Т.е. например, вы используете таймер TMR1, для которого можно повесить часовой кварц, который работает независимо от вашего основного кварца. TMR1 будет вырабатывать прерывания через каждые полсекунды. В обработчике прерываний вы увеличиваете допустим переменную SEC, когда SEC будет равна 120 (т.е. у вас TMR1 переполнился 120 раз) то можно увеличить переменную MIN. Таким образом, выделяя дополнительные переменные (HOUR,DAY,MONTH,YEAR, etc.) и инкрементируя их, по достижении определенного значения предыдущей переменной, можно делать любые задержки.
Go to the top of the page
 
+Quote Post
Михалыч
сообщение May 3 2005, 15:50
Сообщение #17


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

Группа: Свой
Сообщений: 189
Регистрация: 27-01-05
Из: с Транссиба
Пользователь №: 2 235



Пасиба smile.gif Попробую...


--------------------
Советские микросхемы - самые большие микросхемы в мире
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 22:24
Рейтинг@Mail.ru


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