Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
09.01.2009, 22:52
|
#1
|
Частый гость
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Какой-то глюк с PIC в Proteus
Набросал схемку с PIC 12F675.
Суть: на вход GP5 поступает импульсный сигнал. На двух выходах (GP4 и GP2) должны появляться повторяющие сигналы, на одном в фазе, на другом в противофазе.
Сигнал обрабатывается в процедуре прерывания, которое возникает по изменению сигнала на входе GP5.
Суть глюка в том, что сигнал возникает только на одном выходе, который активируется во втором if - end if цикле (при GP5 = 1). Причем, когда этот цикл закоментируешь, начинает работать первый. Если циклы поменять местами, то все равно работает только второй цикл. Еще, иногда проскакивает один короткий импульс от первого цикла, но редко и очень короткий..
Это глюк протеуса или чего-то накосячил в программе?
Программа на mikrobasic.
Код:
|
Program Commutator
symbol GIE = INTCON.7 ' бит разрешения всех прерываний
symbol PEIE = INTCON.6 ' бит разрешения прерывания от периферийных устройств
symbol GPIE = INTCON.3 ' бит разрешения прерывания от смены сигнала на входах
symbol GPIF = INTCON.0 ' бит сигнализирующий, что произошло прерывание от изменения сигнала на входе, должен быть сброшен вручную
sub procedure interrupt ' Процедура прерывания
if GPIF = 1 then
if GPIO.5 = 0 then ' Если на входе 0, то это значит, что нужно подать импульс во второй канал
GPIO.4 = 1
else
GPIO.4 = 0 ' иначе подаем на выход второго канала 0
end if
if GPIO.5 = 1 then ' если на входе 1, то это значит, что нужно подать импульс на первый канал
GPIO.2 = 1
else
GPIO.2 = 0 ' иначе подаем на выход первого канала 0
end if
GPIF = 0 ' Сбрасываем бит прерывания от изменения сигнала на входе
end if
end sub
main:
OPTION_REG.7 = 0 ' Подтяжка резисторов к питанию индивидуальна для каждого порта
TRISIO = %00100000 ' 5 - вход, остальные выходы.
WPU = %00100000 ' Подтягиваем к питанию сигнальный вход
GPIO = 0 ' Устанавливаем все выходы в 0
GIE = 1 ' Разрешаем прерывания
PEIE = 0 ' Разрешаем прерывания от периферийных устройств
GPIE = 1 ' Разрешаем прерывание от смены сигнала на входах
IOC = %00100000 ' Разрешаем прерывания от смены сигнала на сигнальном входе
main_circle:
goto main_circle
end. |
|
|
|
|
10.01.2009, 01:02
|
#2
|
Гражданин KAZUS.RU
Регистрация: 20.05.2005
Сообщений: 659
Сказал спасибо: 40
Сказали Спасибо 186 раз(а) в 116 сообщении(ях)
|
Re: Какой-то глюк с PIC в Proteus
Сообщение от Alexandr_Il
|
Набросал схемку с PIC 12F675.
|
На GP3 у тебя что? К +5V через резюк ~ 10К подтяни, без него работать эти МК не хотят.
Еще не увидел где входы/выходы на цифру настраиваются, CMCON если память не изменяет.
|
|
|
|
10.01.2009, 01:07
|
#3
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт или записать туда что-то для фиксации.
А еще лучше не использовать -какой -нибудь инт0 поюзать.
|
|
|
|
10.01.2009, 01:34
|
#4
|
Частый гость
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Какой-то глюк с PIC в Proteus
Сообщение от lyk
|
Сообщение от Alexandr_Il
|
Набросал схемку с PIC 12F675.
|
На GP3 у тебя что? К +5V через резюк ~ 10К подтяни, без него работать эти МК не хотят.
Еще не увидел где входы/выходы на цифру настраиваются, CMCON если память не изменяет.
|
на GP3 пока ничего, хотел его как выход использовать. В конфигурации контроллера указал, что MCLRE выключен, то бишь, сброс подтягивать к + не надо. Да собственно, контроллер то работает, в прерывание заходит, один из выходов полностью повторяет входной сигнал..
На счет настройки входов/выходов на цифру. Вход у меня один GP5 - он по маналу GP5/T1CKI/OSC1/CLKIN, то бишь, как аналоговый вход использовать нельзя.. А остальные выходы у меня на выход переключены (правда не разобрался до конца, как GP3 правильно настроить на цифровой выход, но это потом..)
|
|
|
|
10.01.2009, 01:38
|
#5
|
Частый гость
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от urry
|
Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт или записать туда что-то для фиксации.
А еще лучше не использовать -какой -нибудь инт0 поюзать.
|
Ну дык, я ж в конце процедуры прерывания пишу:
GPIF = 0, после чего он корректно выходит из прерывания и не заходит в него до следующего смены сигнала на входе.. вроде как..
Да и читаю я из порта GP5 сравнивая его с 0 или 1 в цикле проверок.. Или чтение из порта к этому не относится?
INT0 использовать не получится, нужно выдавать импульс в один канал, когда идет передний фронт входного сигнала, и импульс во второй канал, когда проходит задний фронт входного сигнала.
|
|
|
|
10.01.2009, 01:42
|
#6
|
Гражданин KAZUS.RU
Регистрация: 20.05.2005
Сообщений: 659
Сказал спасибо: 40
Сказали Спасибо 186 раз(а) в 116 сообщении(ях)
|
Сообщение от urry
|
Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт
|
Что-то не совсем понял, имелось ввиду "прочитать" порт - это CLRF GPIO или можно как-то по другому?
|
|
|
|
10.01.2009, 01:46
|
#7
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
Относится. Поэтому это прерывание и используется в основном для вывода из спячки. Еще раз - вместо GPIF = 0 temp=GPIO
|
|
|
|
10.01.2009, 01:50
|
#8
|
Частый гость
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Чет фигня какая-то.. кажется до меня доходит.
Добавил в процедуру обработки прерывания следущие строчки ПОСЛЕ if - end if циклов:
GPIO.1 = 1
delay_ms (10)
GPIO.1 = 0
и он у меня стабильно стал выдавать импульсы шириной 10мсек по фронту и спаду входного сигнала по выходу GP1, но по остальным выходам перестал что-либо выдавать!
Такое ощущение, что команда "GPIO.номер порта" автоматом переводит все остальные выходы в 0! ничего не понимаю..
|
|
|
|
10.01.2009, 01:54
|
#9
|
Почётный гражданин KAZUS.RU
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
|
выделите регистр и меняйте биты в нем, а потом его весь выдавайте в порт.
|
|
|
|
10.01.2009, 01:58
|
#10
|
Частый гость
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от urry
|
Относится. Поэтому это прерывание и используется в основном для вывода из спячки. Еще раз - вместо GPIF = 0 temp=GPIO
|
Неа.. с temp=GPIO он не сбрасывает флаг GPIF и тут же заходит обратно в прерывание.. Я ж вижу, что с GPIF = 0 он корректно выходит и заходит в прерывание.
Вот скриншот сигнала на выходах:
верхний сигнал - это входной сигнал, третий сверху, это как раз GP1, что добавил выше.
-- Прилагается рисунок: --
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Симуляция частотомера на PIC в Proteus
|
oscill |
Микроконтроллеры, АЦП, память и т.д |
6 |
15.06.2009 19:26 |
глюк Proteus при работе с ATMEL ATTINY45
|
igoruha727 |
Микроконтроллеры, АЦП, память и т.д |
3 |
23.05.2009 01:00 |
PROTEUS глюк INT2 в ATMEGA16
|
TVMaster |
Микроконтроллеры, АЦП, память и т.д |
7 |
25.09.2008 21:14 |
unsigned long int. Глюк в Proteus-е
|
odn2003 |
Микроконтроллеры, АЦП, память и т.д |
2 |
11.05.2008 12:14 |
Вопрос по отладке в Proteus си-кода от PIC-C
|
vly67 |
Микроконтроллеры, АЦП, память и т.д |
1 |
10.10.2007 04:32 |
Часовой пояс GMT +4, время: 01:03.
|
|