Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Какой-то глюк с PIC в Proteus

Непрочитано 09.01.2009, 22:52  
Alexandr_Il
Частый гость
 
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexandr_Il на пути к лучшему
По умолчанию Какой-то глюк с 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.
Реклама:
Alexandr_Il вне форума  
Непрочитано 10.01.2009, 01:02  
lyk
Гражданин KAZUS.RUN
 
Регистрация: 20.05.2005
Сообщений: 658
Сказал спасибо: 40
Сказали Спасибо 187 раз(а) в 117 сообщении(ях)
lyk на пути к лучшему
По умолчанию Re: Какой-то глюк с PIC в Proteus

Сообщение от Alexandr_Il
Набросал схемку с PIC 12F675.
На GP3 у тебя что? К +5V через резюк ~ 10К подтяни, без него работать эти МК не хотят.
Еще не увидел где входы/выходы на цифру настраиваются, CMCON если память не изменяет.
lyk вне форума  
Непрочитано 10.01.2009, 01:07  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт или записать туда что-то для фиксации.
А еще лучше не использовать -какой -нибудь инт0 поюзать.
__________________
warez
urry вне форума  
Непрочитано 10.01.2009, 01:34  
Alexandr_Il
Частый гость
 
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexandr_Il на пути к лучшему
По умолчанию Re: Какой-то глюк с PIC в Proteus

Сообщение от lyk
Сообщение от Alexandr_Il
Набросал схемку с PIC 12F675.
На GP3 у тебя что? К +5V через резюк ~ 10К подтяни, без него работать эти МК не хотят.
Еще не увидел где входы/выходы на цифру настраиваются, CMCON если память не изменяет.
на GP3 пока ничего, хотел его как выход использовать. В конфигурации контроллера указал, что MCLRE выключен, то бишь, сброс подтягивать к + не надо. Да собственно, контроллер то работает, в прерывание заходит, один из выходов полностью повторяет входной сигнал..
На счет настройки входов/выходов на цифру. Вход у меня один GP5 - он по маналу GP5/T1CKI/OSC1/CLKIN, то бишь, как аналоговый вход использовать нельзя.. А остальные выходы у меня на выход переключены (правда не разобрался до конца, как GP3 правильно настроить на цифровой выход, но это потом..)
Alexandr_Il вне форума  
Непрочитано 10.01.2009, 01:38  
Alexandr_Il
Частый гость
 
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexandr_Il на пути к лучшему
По умолчанию

Сообщение от urry
Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт или записать туда что-то для фиксации.
А еще лучше не использовать -какой -нибудь инт0 поюзать.
Ну дык, я ж в конце процедуры прерывания пишу:
GPIF = 0, после чего он корректно выходит из прерывания и не заходит в него до следующего смены сигнала на входе.. вроде как..

Да и читаю я из порта GP5 сравнивая его с 0 или 1 в цикле проверок.. Или чтение из порта к этому не относится?
INT0 использовать не получится, нужно выдавать импульс в один канал, когда идет передний фронт входного сигнала, и импульс во второй канал, когда проходит задний фронт входного сигнала.
Alexandr_Il вне форума  
Непрочитано 10.01.2009, 01:42  
lyk
Гражданин KAZUS.RUN
 
Регистрация: 20.05.2005
Сообщений: 658
Сказал спасибо: 40
Сказали Спасибо 187 раз(а) в 117 сообщении(ях)
lyk на пути к лучшему
По умолчанию

Сообщение от urry
Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт
Что-то не совсем понял, имелось ввиду "прочитать" порт - это CLRF GPIO или можно как-то по другому?
lyk вне форума  
Непрочитано 10.01.2009, 01:46  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

Относится. Поэтому это прерывание и используется в основном для вывода из спячки. Еще раз - вместо GPIF = 0 temp=GPIO
__________________
warez
urry вне форума  
Непрочитано 10.01.2009, 01:50  
Alexandr_Il
Частый гость
 
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexandr_Il на пути к лучшему
По умолчанию

Чет фигня какая-то.. кажется до меня доходит.
Добавил в процедуру обработки прерывания следущие строчки ПОСЛЕ if - end if циклов:
GPIO.1 = 1
delay_ms (10)
GPIO.1 = 0
и он у меня стабильно стал выдавать импульсы шириной 10мсек по фронту и спаду входного сигнала по выходу GP1, но по остальным выходам перестал что-либо выдавать!

Такое ощущение, что команда "GPIO.номер порта" автоматом переводит все остальные выходы в 0! ничего не понимаю..
Alexandr_Il вне форума  
Непрочитано 10.01.2009, 01:54  
urry
Почётный гражданин KAZUS.RUN
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 107 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

выделите регистр и меняйте биты в нем, а потом его весь выдавайте в порт.
__________________
warez
urry вне форума  
Непрочитано 10.01.2009, 01:58  
Alexandr_Il
Частый гость
 
Регистрация: 09.11.2008
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Alexandr_Il на пути к лучшему
По умолчанию

Сообщение от urry
Относится. Поэтому это прерывание и используется в основном для вывода из спячки. Еще раз - вместо GPIF = 0 temp=GPIO
Неа.. с temp=GPIO он не сбрасывает флаг GPIF и тут же заходит обратно в прерывание.. Я ж вижу, что с GPIF = 0 он корректно выходит и заходит в прерывание.

Вот скриншот сигнала на выходах:
верхний сигнал - это входной сигнал, третий сверху, это как раз GP1, что добавил выше.

-- Прилагается рисунок: --

Alexandr_Il вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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, время: 12:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.