Прерывания......... - Форум Picbasic.ru
Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: terrarus 
Форум Picbasic.ru » Программирование МК » Mikrobasic » Прерывания.........
Прерывания.........
Match Дата: Ср, 13.02.2008, 13:53  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 1
Репутация: 0   ±
Замечания:   ±
На сайте с 12.02.2008

Статус: Offline

Добрый день...
Помогите новичку пожалуйста, дайте отправную точку.... smile

Имеется задача построить нечто вроде реверсивного счетчика: PIC16F84 (или любой другой), на один из входов PORTA подаются тактовые импульсы произольной длины и частоты (от 1Гц до 3кГц), на другой вход PORTA подается логическая единица направления счета (0 - прямой счет, 1 - обратный).
В памяти ПИКа имеется массив из 8ми байтов и нужно по переднему фронту тактового импульса последовательно перебирать байты из этого массива (в том или ином направлении) и писать в PORTB...

(примерная схема в приложеной картинке)

Умом понимаю, что тут надо использовать внешнее прерывание, но не хватает грамоты....... sad
Может быть у кого-нить есть похожий готовый примерчик для МикроБасика?

Прикрепления: 8235197.jpg(20Kb)

Сообщение отредактировал Match - Ср, 13.02.2008, 13:54
ЯНДЕКС Дата: 13.02.2008
ADMIN Дата: Ср, 13.02.2008, 17:49  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1096
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Настраивай OPTION_REG для работы по переднему фронту на входе прерывания INT,тактовая для INT- внешняя.
Затем настраивай intcon для разрешения работы с прерыванием по PORTB.0 (INT)
А потом (в прерывании можно), в зависимости от состояния твоего PORTA(кнопка направления счета) прибавляешь или вычитаешь из переменной, которую потом посылаешь в PORTB, причем во время отображения числа на PORTB, выставляй PORTB.0 как цифровой выход, а прерывания запрещай. Думаю получится.
Yrok Дата: Ср, 13.02.2008, 18:14  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Привет smile

Внешние прерывания тут никак неполучаться--так как PIC может реагировать на внешние прерывания только по изменению PortB4-7, либо по входу INT --который так же находиться на PortB.0-так что отслеживать сигнал по PortA--проблематично00наверно придется тебе схему менять

ADMIN Дата: Ср, 13.02.2008, 19:15  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1096
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Да не надо ничего менять, почему не получится? Выше описано, как это можно организовать. Естественно вход импульсов будет на PORTB.
А если еще не мудрить, а поставить К561ИЕ11 или ИЕ14, то вообще никакого 16F84 не надо, он выполняет все вышеописанное, правда в двоично-десятичном формате
Yrok Дата: Чт, 14.02.2008, 09:27  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Quote
наверно придется тебе схему менять
--ну вообщето я и имел ввиду что нужно перенести входные импульсы на PortB
John_Connor Дата: Ср, 02.07.2008, 21:48  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Новенький
Сообщений: 1
Репутация: 0   ±
Замечания:   ±
На сайте с 02.07.2008

Статус: Offline

Здравствуйте всем. Немогли бы помочь? Тоже возникла проблема с прерываниями - так же необходимо сделать счетчик по прерываниям, но в написании программ опыта большого не имею. То, что получилось (отладочная версия, без кнопок сброса и предустановки):

Code
program schet

dim    j    as byte
dim    schet    as byte

sub function mask(dim num as byte) as byte    
     select case num                    
     case 0  result = $00
     case 1  result = $01
     case 2  result = $02
     case 3  result = $03
     case 4  result = $04
     case 5  result = $05
     case 6  result = $06
     case 7  result = $07
     case 8  result = $08
     case 9  result = $09
     end select
end sub

sub procedure interrupt
       INTCON = %00000000
       schet = schet +1
       INTCON = %10010000
      end sub
sub procedure ind (dim    schet    as byte)
         dim j as byte
   j = schet mod 10
   portb = mask(j) + %100000
   j = schet div 10 mod 10
   portb = mask(j) + %10000000
   j = schet div 100 mod 10
   portb = mask(j) + %1000000
end sub
main:
     TRISB = %00000001
     INTCON = %10010000
     label_3:
    ind(schet)
   goto label_3
   end.

При моделировании в Протеусе обнаруживаю две ошибки: 1) счет идет по каждому второму импульсу 2) счет идет до 50-ти, затем обнуляется, снова до 50-ти - потом сразу 100 и так далее...
Yrok Дата: Чт, 19.02.2009, 10:51  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 112
Репутация: 2   ±
Замечания:   ±
На сайте с 27.09.2007

Статус: Offline

Quote
label_3:
ind(schet)
goto label_3
--это очень неправильно--происходит переполнение стека после чего Pic перезагружается--нужно использовать
while true do
..
..
wend
MasterPic Дата: Чт, 19.02.2009, 17:49  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

это почему после переполнения стека пик перезагружается? не вводите в заблуждение человека. Но учитывая то, что человек был здесь в последний раз 2 июля, это не страшно. это было во-первых, во вторых команда goto не пишет в стек предыдущий адрес, в отличии от gosub, поэтому описанная конструкция не будет влиять на содержимое стека. другое дело, здесь нет смысла в метке label_3, поскольку в теле метки стоит (абстрактно) подпрограмма ind? которая, в свою очередь включает ПП mask. Какой смысл тогда в goto и процедуре mask? которую можно оформить в теле main? безо всяких там переходов?
Сообщение отредактировал MasterPic - Чт, 19.02.2009, 18:04
ГыГы Дата: Чт, 19.02.2009, 18:04  |                                                                                                                Сообщение # 9
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 17.02.2009

Статус: Offline

Quote
это почему после переполнения стека пик перезагружается?
Да потому. Берёт и ресетиться. У многих ПИКов такое происходит. Он же не сказал какой у него ПИК smile

Но в случае John_Connor'А переполнения стека не должно происходить.
Интересная у него процедура mask Значение маски соответствует выбираемому значению. Зачем это.......

Сообщение отредактировал ГыГы - Чт, 19.02.2009, 18:09
MasterPic Дата: Чт, 19.02.2009, 18:08  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

ресетится может только в том случае, если включен wdt. Программа виснет (ведет себя непредсказуемо), после чего собака может (не всегда, были случаи) сбрасывает пик. Аргументов в вашу пользу не вижу пока. А насчет процедуры mask, наверное свои соображения у автора, но мы их не узнаем.
Сообщение отредактировал MasterPic - Чт, 19.02.2009, 18:10
ГыГы Дата: Чт, 19.02.2009, 18:15  |                                                                                                                Сообщение # 11
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 17.02.2009

Статус: Offline

Аргументов нет, зато есть факты. Читаем внимательно, взял первый попавшийся ДШ.
Бит STVREN, по ум. - "1"

Quote
может (не всегда, были случаи) сбрасывает пик
Как это понять не всегда, но... ВДТ можно выключить smile
Прикрепления: 5115474.gif(68Kb)

Сообщение отредактировал ГыГы - Чт, 19.02.2009, 18:17
MasterPic Дата: Чт, 19.02.2009, 18:29  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Ах да, ну конечно, мы же про 18 пики говорим, а не про Ф84. Извините, был не прав...
А насчет "не всегда", извиняюсь, ошибся. Хотел сказать этим, что у меня были такие случаи (вдт обычно не использую, только в самых критических случаях), когда при переполнении стека пик иногда (не всегда), при прочих равных условиях перезагружался. То есть в одно включение работал неправильно, в другое - перегружался невпопад. Потом исправил, все пошло.
ГыГы Дата: Чт, 19.02.2009, 18:37  |                                                                                                                Сообщение # 13
Группа: Пользователи
Ранг:  Начал соображать
Сообщений: 20
Репутация: 0   ±
Замечания:   ±
На сайте с 17.02.2009

Статус: Offline

Quote
Ах да, ну конечно, мы же про 18 пики говорим, а не про Ф84.
Ещё раз хочу сказать - Джон Конор не сказал какой у него ПИК, и я прокоментировал Ваш пост по поводу переполнения стека.
Да и в 16 серии есть некоторые ПИКи которые сбрасываються при переполнении стека, пусть даже конфигов управления стеком у них нет.
Но у него проблема явно не в стеке.

Сообщение отредактировал ГыГы - Чт, 19.02.2009, 18:38
MasterPic Дата: Чт, 19.02.2009, 18:53  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 196
Репутация: 2   ±
Замечания:   ±
На сайте с 22.11.2008

Статус: Offline

Quote (ГыГы)
Но у него проблема явно не в стеке.

Я тоже так думаю.
Насчет 84 сделал вывод на основе интуиции, поскольку писал стьюдент, и, судя по всему, он не использовал 18 серию, а скорей всего 16Ф84 или что-то в этом роде. Но оба парня потерялись и смысла тянуть кота за яйца нет. Может кому пригодится.
Alexej79 Дата: Вс, 20.03.2011, 02:27  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 78
Репутация: 0   ±
Замечания:   ±
На сайте с 16.08.2010

Статус: Offline

Quote (ADMIN)
Настраивай OPTION_REG для работы по переднему фронту на входе прерывания INT,тактовая для INT- внешняя.

Как я понимаю настраивать надо шестой бит в OPTION_REG
Вопрос в том что 1 значит по переднему фронту, 0 по заднему. Что означают эти фронты?
Как я понимаю 1 это питание идёт 2 отсутствует.
И ещё тактовая для INT внешняя, вот тут я не могу понять тоже.
Буду рад помощи.
Форум Picbasic.ru » Программирование МК » Mikrobasic » Прерывания.........
Страница 1 из 212»
Поиск: