Прерывания.........
|
|
Match |
Дата: Ср, 13.02.2008, 13:53 | Сообщение # 1 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
Добрый день... Помогите новичку пожалуйста, дайте отправную точку.... Имеется задача построить нечто вроде реверсивного счетчика: PIC16F84 (или любой другой), на один из входов PORTA подаются тактовые импульсы произольной длины и частоты (от 1Гц до 3кГц), на другой вход PORTA подается логическая единица направления счета (0 - прямой счет, 1 - обратный). В памяти ПИКа имеется массив из 8ми байтов и нужно по переднему фронту тактового импульса последовательно перебирать байты из этого массива (в том или ином направлении) и писать в PORTB... (примерная схема в приложеной картинке) Умом понимаю, что тут надо использовать внешнее прерывание, но не хватает грамоты....... Может быть у кого-нить есть похожий готовый примерчик для МикроБасика?
Сообщение отредактировал
Match - Ср, 13.02.2008, 13:54
|
|
|
|
ADMIN |
Дата: Ср, 13.02.2008, 17:49 | Сообщение # 2 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Привет Внешние прерывания тут никак неполучаться--так как PIC может реагировать на внешние прерывания только по изменению PortB4-7, либо по входу INT --который так же находиться на PortB.0-так что отслеживать сигнал по PortA--проблематично00наверно придется тебе схему менять
|
|
|
|
ADMIN |
Дата: Ср, 13.02.2008, 19:15 | Сообщение # 4 |
Администратор
Группа:
Администраторы
Ранг:
Специалист
Сообщений:
1086
Замечания:
±
На сайте с 20.08.2007
Статус:
Offline
|
Да не надо ничего менять, почему не получится? Выше описано, как это можно организовать. Естественно вход импульсов будет на PORTB. А если еще не мудрить, а поставить К561ИЕ11 или ИЕ14, то вообще никакого 16F84 не надо, он выполняет все вышеописанное, правда в двоично-десятичном формате
|
|
|
|
Yrok |
Дата: Чт, 14.02.2008, 09:27 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Продвинутый
Сообщений:
112
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Quote наверно придется тебе схему менять --ну вообщето я и имел ввиду что нужно перенести входные импульсы на PortB
|
|
|
|
John_Connor |
Дата: Ср, 02.07.2008, 21:48 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
1
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 27.09.2007
Статус:
Offline
|
Quote label_3: ind(schet) goto label_3 --это очень неправильно--происходит переполнение стека после чего Pic перезагружается--нужно использовать while true do .. .. wend
|
|
|
|
MasterPic |
Дата: Чт, 19.02.2009, 17:49 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 17.02.2009
Статус:
Offline
|
Quote это почему после переполнения стека пик перезагружается? Да потому. Берёт и ресетиться. У многих ПИКов такое происходит. Он же не сказал какой у него ПИК Но в случае John_Connor'А переполнения стека не должно происходить. Интересная у него процедура mask Значение маски соответствует выбираемому значению. Зачем это.......
Сообщение отредактировал
ГыГы - Чт, 19.02.2009, 18:09
|
|
|
|
MasterPic |
Дата: Чт, 19.02.2009, 18:08 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
ресетится может только в том случае, если включен wdt. Программа виснет (ведет себя непредсказуемо), после чего собака может (не всегда, были случаи) сбрасывает пик. Аргументов в вашу пользу не вижу пока. А насчет процедуры mask, наверное свои соображения у автора, но мы их не узнаем.
Сообщение отредактировал
MasterPic - Чт, 19.02.2009, 18:10
|
|
|
|
ГыГы |
Дата: Чт, 19.02.2009, 18:15 | Сообщение # 11 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
20
Замечания:
±
На сайте с 17.02.2009
Статус:
Offline
|
Аргументов нет, зато есть факты. Читаем внимательно, взял первый попавшийся ДШ. Бит STVREN, по ум. - "1" Quote может (не всегда, были случаи) сбрасывает пик Как это понять не всегда, но... ВДТ можно выключить
Сообщение отредактировал
ГыГы - Чт, 19.02.2009, 18:17
|
|
|
|
MasterPic |
Дата: Чт, 19.02.2009, 18:29 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Ах да, ну конечно, мы же про 18 пики говорим, а не про Ф84. Извините, был не прав... А насчет "не всегда", извиняюсь, ошибся. Хотел сказать этим, что у меня были такие случаи (вдт обычно не использую, только в самых критических случаях), когда при переполнении стека пик иногда (не всегда), при прочих равных условиях перезагружался. То есть в одно включение работал неправильно, в другое - перегружался невпопад. Потом исправил, все пошло.
|
|
|
|
ГыГы |
Дата: Чт, 19.02.2009, 18:37 | Сообщение # 13 |
Группа:
Пользователи
Ранг:
Начал соображать
Сообщений:
20
Замечания:
±
На сайте с 17.02.2009
Статус:
Offline
|
Quote Ах да, ну конечно, мы же про 18 пики говорим, а не про Ф84. Ещё раз хочу сказать - Джон Конор не сказал какой у него ПИК, и я прокоментировал Ваш пост по поводу переполнения стека. Да и в 16 серии есть некоторые ПИКи которые сбрасываються при переполнении стека, пусть даже конфигов управления стеком у них нет. Но у него проблема явно не в стеке.
Сообщение отредактировал
ГыГы - Чт, 19.02.2009, 18:38
|
|
|
|
MasterPic |
Дата: Чт, 19.02.2009, 18:53 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
186
Замечания:
±
На сайте с 22.11.2008
Статус:
Offline
|
Quote (ГыГы) Но у него проблема явно не в стеке. Я тоже так думаю. Насчет 84 сделал вывод на основе интуиции, поскольку писал стьюдент, и, судя по всему, он не использовал 18 серию, а скорей всего 16Ф84 или что-то в этом роде. Но оба парня потерялись и смысла тянуть кота за яйца нет. Может кому пригодится.
|
|
|
|
Alexej79 |
Дата: Вс, 20.03.2011, 02:27 | Сообщение # 15 |
Группа:
Проверенные
Ранг:
Понимаю
Сообщений:
71
Замечания:
±
На сайте с 16.08.2010
Статус:
Offline
|
Quote (ADMIN) Настраивай OPTION_REG для работы по переднему фронту на входе прерывания INT,тактовая для INT- внешняя. Как я понимаю настраивать надо шестой бит в OPTION_REG Вопрос в том что 1 значит по переднему фронту, 0 по заднему. Что означают эти фронты? Как я понимаю 1 это питание идёт 2 отсутствует. И ещё тактовая для INT внешняя, вот тут я не могу понять тоже. Буду рад помощи.
|
|
|
|