Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Модератор форума: ivan_fd  
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите с прерываниями
Помогите с прерываниями
mikhail09p Дата: Сб, 29.12.2012, 17:23  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 481
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

В железе?

А зачем два резистора последовательно светодиодам? Чтобы Протеусу было легше? biggrin
Это чисто любопытство...

Сообщение отредактировал mikhail09p - Сб, 29.12.2012, 17:25
anatol Дата: Сб, 29.12.2012, 20:19  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Hund, не хочется подсказывать. Где реально ваша программа и файл протеуса?
На догадках причина может быть в прерываниях, ЧМЗ, в программе? Гадать шиммируем до нуля или нет?
Или просто порт в третьем состоянии и приоткрывается полевик? нужны не куски кода, а прога компилируемая.
Hund Дата: Вс, 30.12.2012, 12:40  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

У вас не определен тип процессора и не сделаны начальные установки. Т.е принимается все по умолчанию. Это может не соответствовать требуемому.
Это раз. Второе при прерывании считывается не бит, а весь байт порта. и состояние аккумулятора после прерывания не известно какое. Это может влиять на последующую установку бит и запись в порт. Проверить просто. повесте диоды на порт "С", если вам так нужен "В0"
Hund Дата: Вс, 30.12.2012, 16:12  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Новенький
Сообщений: 13
Репутация: 0   ±
Замечания:   ±
На сайте с 03.12.2012

Статус: Offline

Спасибо,будем пробовать.
RN3AQW Дата: Чт, 04.04.2013, 16:21  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Прикрепления: ButRCt.dsn (73.9 Kb) · ButRCt.pbp (1.7 Kb)
ЯНДЕКС Дата: 04.04.2013
ivan_fd Дата: Пт, 05.04.2013, 15:23  |                                                                                                                Сообщение # 22
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2013

Статус: Offline

ivan_fd, спасибо заработало!
Про CMCON что-то я прошляпил...
А чем можно заменить паузу в прерывании? Допустим если она там нужна? 
А что дает  "test = GPIO             'читаем GPIO снимаем несоответсвие", про какое несоответствие идет речь?
И сразу еще один вопрос в догонку,- по RCTIME и PULSIN... какое максимальное время они могут измерять при частоте генератора 4 Мгц и байтовой переменной?
ivan_fd Дата: Пн, 08.04.2013, 13:46  |                                                                                                                Сообщение # 24
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 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
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Если PIC 16f876, тогда точно нужно использовать USART. Только посмотрите какие тоги RX TX. Литература по протону есть. Хорошая, на русском языке. По поводу ошибки протона - Вы пришлите ошибку, что он пишет. Протон может работать без MPLAB, точнее его не нужно ставить отдельно. Скорее всего вы таблетку не поставили.

Добавлено (07.06.2013, 11:42)
---------------------------------------------

Цитата (MiXaS)
SERIN(OUT)


В протоне тоже есть подобная команда, но с этими командами есть определенные нюансы. Если вы передаете серьёзные данные, то лучше использовать аппаратные стредства.

Сообщение отредактировал 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
Репутация: 14   ±
Замечания:   ±
На сайте с 04.05.2010

Статус: Offline

Вот тот Протон, что я использую. Там новее и предыдущая версия, обе прекрасно работают. http://yadi.sk/d/hJz7yQLA5xgku
Кстати, Вы меняете файлики в соответствующих папках программы?
Форум Picbasic.ru » Программирование МК » PicBasicPro » Помогите с прерываниями
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск: