Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

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

Закрытая тема
Опции темы
Непрочитано 09.01.2009, 22:52   #1
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   #2
lyk
Гражданин KAZUS.RU
 
Регистрация: 20.05.2005
Сообщений: 659
Сказал спасибо: 40
Сказали Спасибо 186 раз(а) в 116 сообщении(ях)
lyk на пути к лучшему
По умолчанию Re: Какой-то глюк с PIC в Proteus

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

Прерывание от изменения сигнала на входе не сбрасывается "вручную" - нужно прочитать порт или записать туда что-то для фиксации.
А еще лучше не использовать -какой -нибудь инт0 поюзать.
__________________
warez
urry вне форума  
Непрочитано 10.01.2009, 01:34   #4
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   #5
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   #6
lyk
Гражданин KAZUS.RU
 
Регистрация: 20.05.2005
Сообщений: 659
Сказал спасибо: 40
Сказали Спасибо 186 раз(а) в 116 сообщении(ях)
lyk на пути к лучшему
По умолчанию

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

Относится. Поэтому это прерывание и используется в основном для вывода из спячки. Еще раз - вместо GPIF = 0 temp=GPIO
__________________
warez
urry вне форума  
Непрочитано 10.01.2009, 01:50   #8
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   #9
urry
Почётный гражданин KAZUS.RU
 
Аватар для urry
 
Регистрация: 06.02.2007
Сообщений: 1,340
Сказал спасибо: 3
Сказали Спасибо 106 раз(а) в 66 сообщении(ях)
urry на пути к лучшему
По умолчанию

выделите регистр и меняйте биты в нем, а потом его весь выдавайте в порт.
__________________
warez
urry вне форума  
Непрочитано 10.01.2009, 01:58   #10
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, время: 01:03.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot