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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Сигнализация
Сигнализация
sams Дата: Вт, 04.10.2011, 22:51  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 11.05.2011

Статус: Offline

Подскажите пожалуйста!я только начал изучать микроконтроллеры и решил с вейсика,так что не судите строго.
идея такова;имитации нажатия на кнопки(подключить к клаве телефона через оптроны)
с динамика снимать сигналы управления сигналкой,а через микрофон посылать сигналы сработавших зон
вибратор сигнализирует о вызове и поднятии трубки а также об отключении.
Проблема такая:
1.как реализовать опрос первых трех битов порта А и в зависимости от их состояния отправить соответствующий сигнал.К А0-А2 подключены датчики(концевик ворот,объемник и вибрации) значит 3 варианта посылаемого сигнала плюс их комбинация(ворота-объем,ворота-вибро и т.д) и один-когда все в норме,итого 8 сигналов.
2.как правильно написать пп main.
3.можно ли использовать TMR0 для больших временных задержек(минут так на 10)и как.
4.Правильно ли написана программа или можно было проще сделать?
5.хотел использовать прерывания по RB0,чтобы кнопкой вкл\выкл управлять из любой части программы,но,следуя алгоритму,ноебходимо было из пп прерывания переходить на другую пп,что не есть хорошо(наверное),поэтому пришлось где нужно ставить проверку флага прерывания.как это возможно сделать?
Заранее благодарен!!!

Config BOREN_ON, CP_OFF, DATA_CP_OFF, PWRTE_ON, WDT_OFF, LVP_OFF, MCLRE_ON, XT_OSC
Device 16F628A
Declare Xtal 4
INTCON.7=0
TRISA=%00000111
TRISB=%00000111
PORTB=0
Symbol intf=INTCON.1 'флаг прерывания по входу RB0
Symbol obiem=PORTA.0 'датчик объема
Symbol ydar=PORTA.1 'датчик удара
Symbol dver=PORTA.2 'концевик двери
Symbol signal=PORTA.3 'выход на сирену
Symbol cal=PORTB.5 'кнопка ВЫЗОВ
Symbol cle=PORTB.7 'кнопка СБРОС подключены к клаве телефона через оптроны
Symbol book=PORTB.6 'кнопка ТЕЛ КНИГА
Symbol but=PORTB.0 'кнопка вкл\выкл
Symbol led=PORTB.4 'светодиод(состояние)под охраной или нет
k con 250 'пауза нажатия кнопки
v con 500 'пауза между нажатиями кнопок
Symbol din=PORTB.2 'динамик
Symbol vibro=PORTB.1 'вибро
Symbol mic=PORTB.3 'микрофон
Dim sec2 As Word ' счетчик
Dim sec As Word ' счетчик
Dim cv As Byte 'счетчик вызовов
Dim stat As Byte '
Dim vibor As Byte 'переменная для выбора типа сигнала
Dim dtmf_in As Byte '
Dim t As Word
Clear
init: 'начало
cv=0
signal=0
led=1:DelayMS 700:led=0
'-----------------------------РЕЖИМ ОЖИДАНИЯ---------------------
start:
led=0
If intf=1 Then 'если нажата кнопка вкл\выкл,то на пп
intf=0 'задержка на выход
GoTo vait_vixod '
EndIf
If vibro=0 Then GoTo otvet 'если вибро вызов,то ответ на него
GoTo start
'----------------------------включение и опрос портов----------
Main:
signal=0
led=1 'включили диод
If intf=1 Then
intf=0 'если нажата кнопка вкл\выкл то выключить
GoTo start
EndIf
If obiem=1 And ydar=1 And dver=1 Then stat=0 'все в норме
If obiem=0 Then stat=1 'объем
If ydar=0 Then stat=2 'удар
If dver=0 Then stat=3 'дверь
If obiem=0 And ydar=0 Then stat=4 ' объем удар
If obiem=0 And dver=0 Then stat=5 ' объем дверь
If ydar=0 And dver=0 Then stat=6 ' удар дверь
If obiem=0 And ydar=0 And dver=0 Then stat=7 'объем удар дверь

Dim vibor As stat
If vibro=0 Then GoTo otvet 'если вибро вызов то снять трубку
If PORTA.0=0 Or PORTA.1=0 Or PORTA.2=0 Then GoTo vait_vx
GoTo Main
'----------------------задержка на выход 30 секунд--------------
vait_vixod:
sec=1
For sec=1 To 5
DelayMS 300
led=1
DelayMS 300
led=0
If intf=1 Then 'если нажата кнопка вкл\выкл то отменить постановку на охрану
intf=0
GoTo start
EndIf
Next
GoTo Main
'-----------------------задержка на вход 5 секунд--------------------
vait_vx:
sec=1
For sec=1 To 65535 '
For sec2=0 To 5 ' если втечение 5 сек кнопка вкл\выкл не нажата
If intf=1 Then ' то включить сирену и начать вызов
intf=0 '
GoTo start '
EndIf
Next
Next
signal=1
GoTo Vizov
'-------------------------подпрограмма вызова--------------------
Vizov:
DelayMS 300
cle=1 'нажатие кнопки сброс
DelayMS k
cle=0 'отпускание кнопки сброс
DelayMS v 'пауза между нажатиями кнопок
book=1 'нажатие кнопки тел книга
DelayMS k
book=0 'отпускание кнопки тел книга
DelayMS v
cal=1 'нажатие кнопки вызов
DelayMS k
cal=0 'отпускание кнопки вызов

Dozvon: 'пп ожидания снятия трубки
For sec=1 To 40
DelayMS 100
If vibro=0 Then 'если сняли трубку(сработал вибро)
cv=cv+1 'то сохранить количество дозвонов
GoTo send_dtmf 'и послать сигнал о сработавшей зоне(зонах)
EndIf
Next
GoTo sbros
'-------------------Посыл сигнала о сработавшей зоне(зонах)--------------------
send_dtmf:
DelayMS 300
Branch vibor,[dtmf_good,Dtmf_ob,Dtmf_yd,dtmf_dv,dtmf_ob_yd,dtmf_ob_dv,dtmf_yd_dv,dtmf_ob_yd_dv]
GoTo Main
dtmf_good:
DTMFOut mic,[1,5,8,6,7,8,1,9,1,4,5] ' любые сигналы,лишь бы
GoTo count_v ' отличались
Dtmf_ob: ' друг от друга
Sound mic,[100,300,0,40,100,300] '
GoTo count_v '
Dtmf_yd:
Sound mic,[100,300,0,40,100,300,0,40,100,300]
GoTo count_v
dtmf_dv:
Sound mic,[100,300]
GoTo count_v
dtmf_ob_yd:
Sound mic,[100,300,0,40,100,300]
GoTo count_v
dtmf_ob_dv:
Sound mic,[100,300,0,40,100,300,0,40,100,300]
GoTo count_v
dtmf_yd_dv:
Sound mic,[100,300,0,40,100,300,0,40,100,300,0,40,100,300]
GoTo count_v
dtmf_ob_yd_dv:
Sound mic,[100,300,0,40,100,300,0,40,100,300]
GoTo count_
'--------------------------Ответ на входящий вызов-------------------
otvet:
DelayMS 500
cal=1 'нажатие кнопки вызов '
DelayMS k ' ПРИНЯТИЕ ВЫЗОВА
cal=0 'отпускание кнопки вызов '
DelayMS 300
Sound mic,[100,20] 'короткий сигнал(готовность принимать команды)
Counter din,3000,dtmf_in 'счет DTMF сигналов с динамика
If dtmf_in=1 Then GoTo zapros 'если 1 dtmf то запрос статуса
If dtmf_in=2 Then GoTo vait_vixod '2 dtmf постановка на охрану
If dtmf_in=3 Then GoTo start '3 dtmf выключение(переход на пп ожидания)
If dtmf_in=0 Then GoTo prosl 'если нет сигналов то прослушка помещения
prosl: '-------------прослушивание помещения--------------------
DelayMS 100
If vibro=0 Then
DelayMS 300 'если не стояла на охране то на пп start"ожидание"
GoSub sbros 'если стояла то обратно на main
If led=1 Then GoTo Main '
GoTo start '
EndIf
GoTo prosl

sbros: '----------пп сброса----------------
DelayMS 300
cle=1
DelayMS k
cle=0
Return
GoTo Main
zapros : 'запрос состояния системы
GoSub sbros
DelayMS 100
GoTo Vizov
'----------------------счет количества вызовов--------------------
count_v:
GoSub sbros
If cv=1 Then ' после первого вызова пауза
t=76 ' 5 секунд и повторный опрос датчиков
GoSub time
EndIf
If cv=2 Then ' после второго вызова пауза
t=307 ' 20 секунд и повторный опрос датчиков
GoSub time
EndIf
If cv=3 Then ' после третьего вызова
t=9230 ' включить сирену на 10 минут
GoSub time ' затем выключить сирену и опрос датчиков
signal=0
GoTo start
EndIf
'-------------------------пп задержки времени---------------------
time:
sec=1
sec2=1
For sec2=1 To t 't-множитель
For sec=1 To 65535 'цикл 0.065 сек
If vibro=0 Then GoTo otvet
Next
Next
Return
GoTo Main
End

Добавлено (04.10.2011, 22.51.54)
---------------------------------------------
Как в сообщение добавить файл протона???

Сообщение отредактировал sams - Вт, 04.10.2011, 22:45
ЯНДЕКС Дата: 04.10.2011
anatol Дата: Вт, 04.10.2011, 23:24  |                                                                                                                Сообщение # 2
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Quote (sams)
Подскажите пожалуйста!я только начал изучать микроконтроллеры и решил с вейсикаБЕЙСИКА angry ,так что не судите строго.
идея такова;имитации нажатия на кнопки(подключить к клаве телефона через оптроны)
с динамика снимать сигналы управления сигналкой,а через микрофон посылать сигналы сработавших зон
вибратор сигнализирует о вызове и поднятии трубки а также об отключении.
Проблема такая:
1.как реализовать опрос первых трех битов порта А и в зависимости от их состояния отправить соответствующий сигнал.К А0-А2 подключены датчики(концевик ворот,объемник и вибрации) значит 3 варианта посылаемого сигнала плюс их комбинация(ворота-объем,ворота-вибро и т.д) и один-когда все в норме,итого 8 сигналов.
2.как правильно написать пп main.
3.можно ли использовать TMR0 для больших временных задержек(минут так на 10)и как.
4.Правильно ли написана программа или можно было проще сделать?
5.хотел использовать прерывания по RB0,чтобы кнопкой вкл\выкл управлять из любой части программы,но,следуя алгоритму,ноебходимо было из пп прерывания переходить на другую пп,что не есть хорошо(наверное),поэтому пришлось где нужно ставить проверку флага прерывания.как это возможно сделать?
Заранее благодарен!!!

1. Таким же образом как и порта В
2. main..........................................
3. И для малых тоже
4. Даже не смотрел, так как задача вверху обрисована через зад.
5. см. 4.

КТО Вас куда гонит? Задача обкатанная в вашем мозгу, для других темный лес. Поэтому сначала условия так чтобы было понятно всем, даже не электронщикам (уточнение куда, что и как в комментариях программы, а не в постановке задачи).
В вопросах - конкретные детали и место в программе.
Программа прилагается если не вся то конфиг, переменные и кусок достаточный для решения вопроса.[color=green]

Сообщение отредактировал anatol - Вт, 04.10.2011, 23:26
sams Дата: Ср, 05.10.2011, 09:00  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 4
Репутация: 0   ±
Замечания:   ±
На сайте с 11.05.2011

Статус: Offline

Если через зад, то как правильно описать? описать весь алгоритм работы?
retas Дата: Чт, 06.10.2011, 00:23  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 447
Репутация: 11   ±
Замечания:   ±
На сайте с 10.09.2007

Статус: Offline

sams!
1. Пробуй так
pA=portA
pA=pA & 00000111 'уничтожим ненужные биты
If pA = X then ' в зависимости от найденого делаешь что надо.
2. Пасмотри какой либо пример в Протоне.
3. Посмотри до сколькИ считаетTMR0, какая у тебя частота осцилятора,
скоко врамени затрачивается на один тик и прикинь.
...
5. Если у тебя разрешены прерывания по RB0 то, если на обработку этого
события нет у тебя много работы, то можешь всё сделать в обработчике прерываний,
если же обработка занимает много времени, устанавливаешь какой то бит и отслеживаешь
его в прогре, но при этом потеряешь время.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Сигнализация
  • Страница 1 из 1
  • 1
Поиск: