| Помогите с прерываниями | 
|  | 
| 
 
 
 
 | 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 |  
 | ![Hund]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 | ![Hund]()  
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Новенький
 
  
 Сообщений: 
 
 
 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 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 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 |  
 |   
 
 
 
 
  Группа:
  Модераторы
 
  Ранг: 
 
 Специалист
 
  
 Сообщений: 
 
 
 891
 
 
 Замечания: ± На сайте с 12.01.2009
 
 
 Статус: 
 Offline
 
 | Цитата (RN3AQW) А чем можно заменить паузу в прерывании?Ничем. Ставьте в прерывании флаг, что нужна пауза, а саму паузу делайте в другом месте.
 
 
 Цитата (RN3AQW) А что дает  "test = GPIOЧто бы сбросить флаг прерывания с GPIO, нужно сначала прочитать порт. Об этом записано в даташите.
 |  
 |  |  |  | 
| 
 
 
 
 | Vitali | Дата: Чт, 06.06.2013, 21:26  |                                                                                                                Сообщение # 25 |  
 | ![Vitali]()  
 
 
 
 
  
 
 
 
  Группа:
  Удаленные
 
  Ранг: 
 
 
 
  
 Сообщений: 
 
 
 
 
 
 
 
 
 Статус: 
 
 
 | Помогите разобраться с программой с использованием прерывания, все что было написано выше перечитал и попробовал внести изменения, но контроллер виснет, думал биты чип заменил другим, проблема осталась, грешил на программатор другие программы работают отлично, без сбоев, не могу понять что происходит. Задача: Мерить с помощью АЦП напряжение на порте А, и передвать его в СОМ порт и ЖКИ, как только от компьютера в СОМ порт придут данные, прервать выполнение основной программы и прочитать данные, затем передать их снова по окончании прерывания в СОМ порт и ЖКИ
 Порт 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 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Разобрался
 
  
 Сообщений: 
 
 
 545
 
 
 Замечания: ± На сайте с 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 |  
 | ![Vitali]()  
 
 
 
 
  
 
 
 
  Группа:
  Удаленные
 
  Ранг: 
 
 
 
  
 Сообщений: 
 
 
 
 
 
 
 
 
 Статус: 
 
 
 | Спасибо огромное, буду разбираться, простите что забыл указать тип кристалла - это PIC 16F876A, обычно самый распространненый для таких неспецефических задач и стоит относитьельно дешево и есть везде. Что касается протона, сейчас дополнительно хочу разобраться и с ним и с микробейсиком, но тут надо время и литературу, а задачи тоже как-то надо решать. Кстати есть проблема с ПРОТОНом, скачал его с вашего сайта, скачал MPASM установил, пишу простую прогу из примера (Медведев-Хилинский), но происходит ошибка компиляции наверное не видит Мпасма. Кстати в пикбейсике команда SERIN(OUT) позволяют использовать впринципе почти любой порт ввода вывода, поэтому и использовал RB.0
 |  
 |  |  |  | 
| 
 
 
 
 | MiXaS | Дата: Пт, 07.06.2013, 11:42  |                                                                                                                Сообщение # 28 |  
 |   
 
 
 
 
  Группа:
  Проверенные
 
  Ранг: 
 
 Разобрался
 
  
 Сообщений: 
 
 
 545
 
 
 Замечания: ± На сайте с 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 |  
 | ![Vitali]()  
 
 
 
 
  
 
 
 
  Группа:
  Удаленные
 
  Ранг: 
 
 
 
  
 Сообщений: 
 
 
 
 
 
 
 
 
 Статус: 
 
 
 | Уважаемый 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 Кстати, Вы меняете файлики в соответствующих папках программы?
 |  
 |  |  |  |