приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Здесь обсуждаем устройства на МК и программы для них
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: приемник сигналов от ИК-пульта (PIC12F629)

Сообщение rhf-admin »

при нажатии и отпускании диод продолжает гореть или перестает?
Продолжает. Нажали и отпустили кнопку - диод загорелся и продолжает гореть, пока другую кнопку не нажмёшь. Так изначально было. Тут выше обсуждалось как сделать инверсию состояния: нажал - диод загорелся, нажал ещё раз - погас.
С уважением, администрация сайта.
sergejus
Читатель
Читатель
Сообщения: 23
Зарегистрирован: 09 дек 2012, 13:30

Re: приемник сигналов от ИК-пульта (PIC12F629)

Сообщение sergejus »

добрый день,

только учусь работать с микроконтроллерами и хотел сделать именно этот проект в proteus. начал собирать схему и заметил что в нём нет никаких ИК приёмников. так же не представляю как мне потом посылать сигналы. помогите пожалуйста :(
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: приемник сигналов от ИК-пульта (PIC12F629)

Сообщение rhf-admin »

Как нету, смотри внимательно, а ILMS5360 в левом нижнем углу схемы.
А посылать - пультом.
С уважением, администрация сайта.
sergejus
Читатель
Читатель
Сообщения: 23
Зарегистрирован: 09 дек 2012, 13:30

Re: приемник сигналов от ИК-пульта (PIC12F629)

Сообщение sergejus »

rhf-admin писал(а):Как нету, смотри внимательно, а ILMS5360 в левом нижнем углу схемы.
А посылать - пультом.
я имел ввиду что в протеусе не понимаю как сделать отправитель и приёмник :? мне для защиты курсовой хватает только в протеусе показать.
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Сообщение rhf-admin »

Тут есть три варианта:
1) Найти для протеуса модель фотоприёмника (для ИК-приёмника), соответственно ему на вход воткнуть сигнал с ИК-диода пульта.
2) Сделать самому модель фотоприёмника, дальше вариант 1.
3) Для протеуса прогу чуть подкорректировать - убрать несущую, заменить импульсы на частоте несущей постоянным сигналом (тогда заработает модель Санька).
С уважением, администрация сайта.
sergejus
Читатель
Читатель
Сообщения: 23
Зарегистрирован: 09 дек 2012, 13:30

Re: приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Сообщение sergejus »

rhf-admin писал(а):Тут есть три варианта:
1) Найти для протеуса модель фотоприёмника (для ИК-приёмника), соответственно ему на вход воткнуть сигнал с ИК-диода пульта.
2) Сделать самому модель фотоприёмника, дальше вариант 1.
3) Для протеуса прогу чуть подкорректировать - убрать несущую, заменить импульсы на частоте несущей постоянным сигналом (тогда заработает модель Санька).
спасибо, нашёл всётки в протеусе такую штуку ирлинк, подключил, использовал простую версии программы и всё работает :)

Изображение

ресил теперь собрать прибор настоящий :) спаял плату, но никак не могу разобраться как прошивать м.к. никогда не пробывал. у меня программатор pickit2. подключил я его как надо и что дальше? как сделать эти пункты?
1. Считываем текущую конфигурацию контроллера.
2. Записываем значение битов калибровки схемы BOR (12-й, 13-й биты слова конфигурации, они же bandgap)
3. Записываем значение последнего слова программного кода (слово по адресу 03FF) - биты калибровки генератора.
4. Открываем нашу прошивку в программе программатора, и меняем в ней биты калибровки схемы BOR и генератора на считанные и записанные значения.

вот вижу такое окно, куда что вводить и менять?

Изображение
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Сообщение rhf-admin »

На скрине, я так понимаю, то, что прочитано с чистого камня?
OSCCAL: 343C - это калибровочная константа генератора (её же можно увидеть, если прокрутить до конца вниз бегунок в большом окне, где много 3FFF, - она должна быть записана в самом последнем слове), BandGap: 1000 - это биты калибровки схемы BOR (вообще-то их по-моему два, то есть скорее всего это 10). Вот это всё записываешь (некоторые программаторы сами при попытке прошить камень сравнивают эти данные с тем, что зашито и спрашивают что делать, если они в прошивке отличаются от тех, что в камне, а некоторые нет, поэтому лучше записать).

Далее, выбираем меню File -> Import HEX и открываем Hex-файл с прошивкой, которую хотим залить.
Я не пользовался Pickit2 и не знаю спросит ли он, если в прошивке калибровочные биты будут отличаться от того, что в данный момент зашито в камень, а также позволяет ли Pickit2 редактировать загруженный hex и слово конфигурации. Если позволяет, то надо руками прописать в последнее слово памяти программ (окошечко с кучей 3FFF) значение OSCCAL (т.е. в твоём случае 343С) и в слово конфигурации биты BandGap.
После этого для записи прошивки в чип нужно нажать Write и всё.
С уважением, администрация сайта.
sergejus
Читатель
Читатель
Сообщения: 23
Зарегистрирован: 09 дек 2012, 13:30

Re: приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Сообщение sergejus »

изучаю эту программу и так как в контроллерах я мало что понимаю, (прочитал только основы) никак не могу разобраться в этих строчках:

T1 equ .212 ; задержка 1
T2 equ .2
TP equ .200 ; определяет задержку между приемом посылок
Tn equ .50 ; начальная задержка (ближе к середине полубита)
Sys equ .253 ; номер системы (29) + 2SB=1 + TB=1
CMD_1 equ .1 ; код команды 1
CMD_2 equ .2 ; код команды 2
CMD_3 equ .3 ; код команды 3
CMD_4 equ .4 ; код команды 4


Вот эти цифры .2, .200, .50. Что это значит? "Определяет задержку". Как понять что за задержка исходя из этих значений?

теперь вот это:
bcf Status,5 ; перейти в банк 0
clrf GPIO ; инициализация защелок
movlw .7 ; биты 0..2 поднять
movwf Cmcon ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых


не понимаю что за компаратор и что значит поднять 0..2 биты?

Scan btfss GPIO,5 ; если 5-й бит равен единице - данных нет, пропускаем
call priem
btfsc MBC,7 ; если start bit (7-й) в регистре MBC = 1,
; то была принята информация


Вот тут почему старт бит 7 по счёту и почему проверяем 5 бит?

movlw Tn
movwf Counter3
wait_n
nop
decfsz Counter3,1
goto wait_n


Вот тут вообще не ясно как это? я так понял тут получают паузу 400мкс? а как так её получить именно столько?

wait movlw T2
movwf Counter2
pause2 movlw T1
movwf Counter1
pause1 nop
decfsz Counter1,1
goto pause1
decfsz Counter2,1
goto pause2
return


и вот эту паузу то же не понимаю

простите за тупые вопросы но очень был бы рад получить ответы, хотя бы на первые вопросы, сам весь день пытаюсь разобратся и с трудом получается :( за ранее спасибо
Аватара пользователя
rhf-admin
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
администратор, спонсор, писатель, дизайнер, инженер, программист, идеолог
Сообщения: 3060
Зарегистрирован: 25 авг 2009, 23:19
Откуда: Уфа
Контактная информация:

Re: приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Сообщение rhf-admin »

Код: Выделить всё

T1    equ .212 ; задержка 1
T2    equ .2
TP    equ .200 ; определяет задержку между приемом посылок
Tn    equ .50 ; начальная задержка (ближе к середине полубита)
Sys   equ .253 ; номер системы (29) + 2SB=1 + TB=1
CMD_1 equ .1 ; код команды 1
CMD_2 equ .2 ; код команды 2
CMD_3 equ .3 ; код команды 3
CMD_4 equ .4 ; код команды 4
Директива equ - это сокращение от слова equivalent, она сообщает компилятору, что везде в тексте программы нужно заменить буквенные обозначения на соответствующее число. Точка перед числом - признак десятичной системы исчисления. То есть если компилятор встретит, например, запись movlw T1, то поймёт её так: movlw .212 и будет знать, что речь идёт о загрузке в регистр w числа 212.
Что это значит? "Определяет задержку".
Задержку можно организовать двумя способами: 1) Позаниматься нужное время чем-то бесполезным. Для этого в пиках даже есть специальная команда - nop, которая ничего не делает. Если нужно подольше - пишут несколько таких команд, если ещё больше, то организуют так называемые "пустые циклы" - когда контроллер занимается тем, что в цикле выполняет нужное количество таких команд (или даже просто весь цикл занимается тем, что изменяет значение счётчика и проверяет - не пора ли уже заканчивать с этим циклом). 2) Использовать таймер. Тут можно пока таймер работает позаниматься чем-то полезным или "поспать" (если железо позволяет просыпаться от таймера), а потом от таймера приходит прерывание и мы понимаем, что наша задержка закончилась.
В проге реализован первый способ (как самый простой) и числа T1, TP, Tn определяют сколько раз нужно в цикле выполнять nop.

Регистры у нас 8-ми битные, со счётчиком на таком регистре можно сделать максимум 255 циклов задержки. А что делать, если этого мало? А тогда можно сделать вложенный цикл (когда внутри одного цикла есть ещё один цикл), вот как здесь:

Код: Выделить всё

wait   movlw T2
       movwf Counter2
pause2 movlw T1                    <---
       movwf Counter1                  |
pause1        nop               <---   |
              decfsz Counter1,1     |  |
              goto pause1        ---   |
       decfsz Counter2,1               |
       goto pause2                  ---
     return
Внешний цикл со счётчиком в регистре Counter2 определяет сколько раз нужно выполнить внутренний цикл со счётчиком Counter1 (сами циклы выше стрелочками показаны). Команды movlw T2, movwf Counter2 записывают в регистр Counter2 число 2 (регистр Counter2 - это счётчик для внешнего цикла), команды decfsz Counter2,1, goto pause2 уменьшают значение счётчика на единицу и если оно не стало равным нулю, - выполняется переход на метку pause2 и цикл повторяется.
Как посчитать, - сколько на всё это затрачивается времени? Тут всё просто. Нужно посчитать за сколько тактов выполнятся все эти циклы и умножить на время выполнения одного такта. Время выполнения одного такта определяется тактовой частотой: T=1/f и для 4МГц составляет 0,25 мкс. В доке на контроллер (там, где описание команд) написано сколько тактов затрачивается на выполнение каждой команды (для пиков написано не количество тактов, а количество машинных циклов, 1 машинный цикл равен 4-м тактам).
Можно проще. В MPLab, во вкладке Windows есть пункт Stopwatch. Запускаешь пошаговое выполнение программы (F8), устанавливаешь указатель команд на метку Wait (Debug->Run->Change Program Counter), ресетишь Stopwatch, ставишь Breakpoint на команду return (правой кнопкой) и запускаешь выполнение (F9). Прога будет выполняться от метки Wait до того места, где установлен Breakpoint, а в окошке stopwatch посчитается сколько на это уйдёт времени и машинных циклов. Прибавишь к этому время выполнения команд Call и return - узнаешь общее время задержки.
не понимаю что за компаратор и что значит поднять 0..2 биты?
Поднять - значит записать туда единицу. Бит может быть либо нулём, либо единицей. Когда говорят "поднять бит" (или флаг, который обычно и является битом в каком-нибудь регистре), то это означает, что надо сделать этот бит равным единице. Когда говорят "сбросить бит" - значит его нужно сделать равным нулю. Теперь про компараторы. В контроллере обычно есть куча всякой периферии (всяких встроенных устройств), а выводов (то есть ножек) мало, и можно специальными флагами подключать к выводам ту или иную периферию, в зависимости от этого у ножек будут те или иные функции. При загрузке у нашего контроллера в регистре CMCON биты 0..2 сброшены, для контроллера это означает, что ноги GP0, GP1, GP2 подключены ко встроенным компараторам и используются как аналоговые входы этих компараторов. А если биты 0..2 в регистре CMCON поднять, то контроллер отключит от выводов компараторы и будет использовать эти ноги как цифровые входы/выходы (как входы или как выходы определяется битами в регистре TrisIO).
Вот тут почему старт бит 7 по счёту и почему проверяем 5 бит?
Если нога настроена на вход, то при чтении GPIO в пятом бите будет значение на входе GP5. GP5 - это у нас вход, к которому подключен фотоприёмник. Фотоприёмник у нас сигнал инвертирует. То есть когда он ничего не принимает - у него на выходе высокий уровень, то есть на входе контроллера висит 1. Когда он принимает импульсы на несущей частоте - у него на выходе низкий уровень, на входе контроллера получается ноль. Вот мы и проверяем эту ногу, пока она в ноль не упадёт. Как упала - значит появился старт-бит. Седьмым по счёту он окажется потому что мы так сигнал принимаем. Мы принимаем бит, сдвигаем все биты в приёмном регистре влево и потом младшим битом записываем этот принятый бит. Приняв таким образом в регистр 8 бит, самый первый принятый окажется самым старшим (то есть седьмым, биты же с нуля считаются).
С уважением, администрация сайта.
sergejus
Читатель
Читатель
Сообщения: 23
Зарегистрирован: 09 дек 2012, 13:30

Re: приемник сигналов от ИК-пульта (PIC12F629). Часть 1

Сообщение sergejus »

огромное спасибо за ответы, всё очень понятно объяснили, только запутался с задержками

Код: Выделить всё

;*** ПРИЕМ ДАННЫХ *****************************************
priem clrf   MBC
      clrf   LBC
;**********************************************************
      movlw  Tn
      movwf  Counter3
wait_n
      nop
      decfsz Counter3,1
      goto   wait_n
пробую посчитать время затраченное на паузу перед принятием кода. ставлю указатели и получаю вот такое число...
Изображение

а ведь судя по скринам в описании пауза должна быть 400мкс...

Код: Выделить всё

T1     equ  .212   ; задержка 1
T2     equ  .2
TP     equ  .200   ; определяет задержку между приемом посылок
Tn     equ  .50    ; начальная задержка (ближе к середине полубита)
с этими числами всё равно не понял как их понимать в секундах .200 это сколько?
Ответить

Вернуться в «Устройства на микроконтроллерах»