Помогите с прерываниями
|
|
mikhail09p |
Дата: Сб, 29.12.2012, 17:23 | Сообщение # 16 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
В железе?
А зачем два резистора последовательно светодиодам? Чтобы Протеусу было легше? Это чисто любопытство...
Сообщение отредактировал
mikhail09p - Сб, 29.12.2012, 17:25
|
|
|
|
anatol |
Дата: Сб, 29.12.2012, 20:19 | Сообщение # 17 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Hund, не хочется подсказывать. Где реально ваша программа и файл протеуса? На догадках причина может быть в прерываниях, ЧМЗ, в программе? Гадать шиммируем до нуля или нет? Или просто порт в третьем состоянии и приоткрывается полевик? нужны не куски кода, а прога компилируемая.
|
|
|
|
Hund |
Дата: Вс, 30.12.2012, 12:40 | Сообщение # 18 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
Да реальная плата собрана .Это будет вывеска в магазин. там куча цепочек по три светодиода. два резистора - это ограничение тока светодиодов , два чтобы поменьше грелись так как смд и питание 12в .
В протеусе просто отрисовал схему,моделировать там еще не умею.Программа полностью выложена в посте 12. Так и компилировал. общая задумка - ноги 28,27,26,25 - бегущий огонек,24,23 - два перемигивающихся св.диода. ноги 13,12 плавно(ШИМ) перемигивающиеся диоды. По сути -не до конца закрывается полевик при максимальной задержке переключения на реальном макете на любом из портов 23-28,шим тут ни причем.макет со светодиодами,подключенными к портам напрямую работает как задумано. А что насчет порта в 3м состоянии - подскажите если нетрудно когда оно образуется,или где про это почитать - похоже это оно так и есть.
Сообщение отредактировал
Hund - Вс, 30.12.2012, 12:41
|
|
|
|
anatol |
Дата: Вс, 30.12.2012, 15:01 | Сообщение # 19 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
У вас не определен тип процессора и не сделаны начальные установки. Т.е принимается все по умолчанию. Это может не соответствовать требуемому. Это раз. Второе при прерывании считывается не бит, а весь байт порта. и состояние аккумулятора после прерывания не известно какое. Это может влиять на последующую установку бит и запись в порт. Проверить просто. повесте диоды на порт "С", если вам так нужен "В0"
|
|
|
|
Hund |
Дата: Вс, 30.12.2012, 16:12 | Сообщение # 20 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
13
Замечания:
±
На сайте с 03.12.2012
Статус:
Offline
|
Спасибо,будем пробовать.
|
|
|
|
RN3AQW |
Дата: Чт, 04.04.2013, 16:21 | Сообщение # 21 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2013
Статус:
Offline
|
Приветствую всех! Решил разобраться с прерываниями в PIC Basic Pro. Использую 12F675. Прерывание по порту INT (GPIO.2)заработало, а вот по другим портам (например GPIO.0) не желает. Файлы прилагаю. Подскажите пожалуйста, где я чего не учел...
Код такой:
Symbol LED = GPIO.5
ADCON0 = %00000000 'выключаем АЦП ANSEL = %00000000 'Порт как цифровой вх/вых
TRISIO = %000101 ' gpio = 0 '
OPTION_REG = %11000000 'выкл подтяжка, по нараст фронту 'WPU = %00000001 '
INTCON = %10011000 'разреш прерывания IOC = %00000101 'прерывание от GPIO.2, GPIO.0 gosub main
on interrupt goto Led_f
Main: 'мигаем светодиодом 0.5 - 0.5 enable Led = 1 pause 500 Led = 0 pause 500 GoTo main
disable Led_f: ' if intcon.0 = 1 then Led = 1 'при прерывании зажигаем светодиод на 3 с Pause 3000 Led = 0 'гасим intcon.1 = 0 'обнуляем INTF intcon.0 = 0 'обнуляем GPIF endif resume
|
|
|
|
ivan_fd |
Дата: Пт, 05.04.2013, 15:23 | Сообщение # 22 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
INTCON = %11001000 'разреш прерывания от портов CMCON = %00000111
gosub main - не верно, надо goto main.
Код Led_f: 'При прерывании If INTCON.0 = 1 Then LED = 1 'зажигаем диод на 3с DelayMS 3000 ' это не есть хорошо, паузы в прерывании не делаются LED = 0 test = GPIO 'читаем GPIO снимаем несоответсвие INTCON.0 = 0 'сбрасываем флаг INTF EndIf Resume
Читайте внимательно даташит и все будет работать.!!!
|
|
|
|
RN3AQW |
Дата: Пн, 08.04.2013, 00:21 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2013
Статус:
Offline
|
ivan_fd, спасибо заработало! Про CMCON что-то я прошляпил... А чем можно заменить паузу в прерывании? Допустим если она там нужна? А что дает "test = GPIO 'читаем GPIO снимаем несоответсвие", про какое несоответствие идет речь? И сразу еще один вопрос в догонку,- по RCTIME и PULSIN... какое максимальное время они могут измерять при частоте генератора 4 Мгц и байтовой переменной?
|
|
|
|
ivan_fd |
Дата: Пн, 08.04.2013, 13:46 | Сообщение # 24 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата (RN3AQW) А чем можно заменить паузу в прерывании? Ничем. Ставьте в прерывании флаг, что нужна пауза, а саму паузу делайте в другом месте.
Цитата (RN3AQW) А что дает "test = GPIO Что бы сбросить флаг прерывания с GPIO, нужно сначала прочитать порт. Об этом записано в даташите.
|
|
|
|
Vitali |
Дата: Чт, 06.06.2013, 21:26 | Сообщение # 25 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
Помогите разобраться с программой с использованием прерывания, все что было написано выше перечитал и попробовал внести изменения, но контроллер виснет, думал биты чип заменил другим, проблема осталась, грешил на программатор другие программы работают отлично, без сбоев, не могу понять что происходит. Задача: Мерить с помощью АЦП напряжение на порте А, и передвать его в СОМ порт и ЖКИ, как только от компьютера в СОМ порт придут данные, прервать выполнение основной программы и прочитать данные, затем передать их снова по окончании прерывания в СОМ порт и ЖКИ Порт RX RB0/INT порт прерывания и чтения данных, прерывания по фронту Как только заливаю в процессор, до наступления прерывания работает нормально, с прерыванием зависает, и основная программа срабатывает после того как приходит следующий байт и снова виснет Вот код:
include "modedefs.bas" DEFINE LCD_DREG PORTB DEFINE LCD_DBIT 4 DEFINE LCD_RSREG PORTB DEFINE LCD_RSBIT 3 DEFINE LCD_EREG PORTB DEFINE LCD_EBIT 2 DEFINE LCD_BITS 4 DEFINE LCD_LINES 2 DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50
DEFINE ADC_BITS 8 DEFINE ADC_CLOCK 3 DEFINE ADC_SAMPLEUS 50
adval var byte
RX var byte
ON INTERRUPT GOTO inter
INTCON = %10010000
OPTION_REG = %10000000
TRISA = %11111111 ADCON1 =%00000010
Menu:
ADCIN 2, adval SEROUT PORTB.1, T2400, ["TEST", 10, 13] SEROUT PORTB.1, T2400, [#RX, 10, 13] SEROUT PORTB.1, T2400, [#adval, 10, 13] LCDOUT $fe, 1 LSDOUT $fe, 2 LCDOUT "TEST", RX, "an", adval
GOTO Menu
DISABLE
inter:
INTCON.1 = 1
SERIN PORTB.0, T2400, RX
INTCON.1 = 0
RESUME ENABLE
|
|
|
|
MiXaS |
Дата: Пт, 07.06.2013, 10:34 | Сообщение # 26 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
У меня есть к Вам вопрос. Какой камень используете? Цитата VitaliПорт RX RB0/INT порт прерывания и чтения данных Немогу найти такой камень пока. Ну если Вы используете АЦП, то скорее всего у Вас на борту есть модуль USART. Ну, да ладно. Сделайте проще. Вам не нужно использовать отдельный вывод RB0, чтобы обработать прерывание. Почитайте даташит на свой МК. Там есть,наверно, настройка прерываний от модуля USART, как по приемнику, так и по передатчику. Другими словами, когда комп шлет что-то в порт (uart), происходит прерывание, далее принимаете данные последовательно, заполняя массив. Когда данные закончатся, вам необходимо будет поднять флаг о том, что приняты новые данные и в основной программе проверять этот флаг. Я уже давно перешел на Протон, но попробую подсказать как это сделать в PBP.
ВО-первых INTCON.1 = 1 - это флаг, который должны не вы поднять, а поднимает МК. Вы его можете проверить, и если он 1, то действительно прерывание произошло по входу RB0.
Во-вторых у Вас МК не виснет, а скорее всего ждет приёма данных от компьютера. Так как Вы сначало вызываете прерывание, а потом слушаете порт, это может вызвать потерю бита, а может и не одного. Насколько я помню SERIN эта команда может долго висеть, пока не получит желаемое от UART (биты данных, старт и стоп биты). У меня были такие трудности.
Буквально недавно у меня была такая задача как у Вас.
Решение: '----------------------------------- Настройка прерываний--------------------- INTCON.6 = 1' разрешить прерывание от переферийных модулей. INTCON.7 = 1 ' Глобальное разрешение прерываний PIE1.5 = 1 ' Разрешить прерывание от приемника UART '-----------------------------------------------------------------------------------------
Далее Ваши настройки
И метка прерывания:
inter:
Умные люди рекомендуют прямо в метке обработки прерывания запрещать все прерывания, поэтому:
INTCON.6 = 0' INTCON.7 = 0
If RCSTA.1 = 1 Or RCSTA.2 = 1 Then ' Проверяем есть ли ошибки в буфере UART? если да, то сбрасываем. RCSTA.4 = 0 RCSTA.4 = 1 EndIf
К если у Вас несколько причин прерывания(таймер, АЦП, UART, int), то Вам необходимо проверять по какому признаку мы оказались в этой метке. Для полной информации, почитайте про регистры PIR и PIE в даташите.
If PIR1.5 = 1 Then Если прерывание произошло от модуля UART, то идем в цикл
While PIR1.5 = 1 Выволнять цикл, пока Флаг приемника UART/ Буфер полон
Array [a]= RCREG Прочитать буфер приемника и записать в массив
a =a + 1 'Инкремент переменной Wend
EndIf
NewFrame = 1 ' Поднять флаг нового Фрейма (пакета) INTCON.6 = 1 ' INTCON.7 = 1 ' PIE1.5 = 1 '
RESUME ENABLE
Эта конструкция точно работает.Добавлено (07.06.2013, 10:34) ---------------------------------------------
Цитата (MiXaS) Эта конструкция точно работает.
Правда в ПРОТОНЕ, но я думаю её изменить по PBP не сложно
Сообщение отредактировал
MiXaS - Пт, 07.06.2013, 10:30
|
|
|
|
Vitali |
Дата: Пт, 07.06.2013, 11:29 | Сообщение # 27 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
Спасибо огромное, буду разбираться, простите что забыл указать тип кристалла - это PIC 16F876A, обычно самый распространненый для таких неспецефических задач и стоит относитьельно дешево и есть везде. Что касается протона, сейчас дополнительно хочу разобраться и с ним и с микробейсиком, но тут надо время и литературу, а задачи тоже как-то надо решать. Кстати есть проблема с ПРОТОНом, скачал его с вашего сайта, скачал MPASM установил, пишу простую прогу из примера (Медведев-Хилинский), но происходит ошибка компиляции наверное не видит Мпасма. Кстати в пикбейсике команда SERIN(OUT) позволяют использовать впринципе почти любой порт ввода вывода, поэтому и использовал RB.0
|
|
|
|
MiXaS |
Дата: Пт, 07.06.2013, 11:42 | Сообщение # 28 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
549
Замечания:
±
На сайте с 02.10.2010
Статус:
Offline
|
Если PIC 16f876, тогда точно нужно использовать USART. Только посмотрите какие тоги RX TX. Литература по протону есть. Хорошая, на русском языке. По поводу ошибки протона - Вы пришлите ошибку, что он пишет. Протон может работать без MPLAB, точнее его не нужно ставить отдельно. Скорее всего вы таблетку не поставили. Добавлено (07.06.2013, 11:42) ---------------------------------------------
В протоне тоже есть подобная команда, но с этими командами есть определенные нюансы. Если вы передаете серьёзные данные, то лучше использовать аппаратные стредства.
Сообщение отредактировал
MiXaS - Пт, 07.06.2013, 11:40
|
|
|
|
Vitali |
Дата: Пн, 17.06.2013, 21:17 | Сообщение # 29 |
Группа:
Удаленные
Ранг:
Сообщений:
Статус:
|
Уважаемый MiXaS, извините что долго не мог Вам ответить какая ошибка возникает в ПРОТОНе, потом было некогда им заниматься, как впрочем и прерываниями, но вот решил разобраться, ошибка возникает следующая "Error: Missing securiti key" пробовал и переустанавливать и перезапускал кейген все равно не работет, с микрокоде проблем было меньше. ОС: Windows 7 Home Premium. Подскажите пожалуйства в чем ошибка и (или) если есть возможность вышлите исталлятор, заранее благодарю!
|
|
|
|
mikhail09p |
Дата: Вт, 18.06.2013, 22:22 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
481
Замечания:
±
На сайте с 04.05.2010
Статус:
Offline
|
Вот тот Протон, что я использую. Там новее и предыдущая версия, обе прекрасно работают. http://yadi.sk/d/hJz7yQLA5xgku Кстати, Вы меняете файлики в соответствующих папках программы?
|
|
|
|