sams |
Дата: Вт, 04.10.2011, 22:51 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
4
Замечания:
±
На сайте с 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
|
|
|
|
anatol |
Дата: Вт, 04.10.2011, 23:24 | Сообщение # 2 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
471
Замечания:
±
На сайте с 10.02.2010
Статус:
Offline
|
Quote (sams) Подскажите пожалуйста!я только начал изучать микроконтроллеры и решил с вейсикаБЕЙСИКА ,так что не судите строго. идея такова;имитации нажатия на кнопки(подключить к клаве телефона через оптроны) с динамика снимать сигналы управления сигналкой,а через микрофон посылать сигналы сработавших зон вибратор сигнализирует о вызове и поднятии трубки а также об отключении. Проблема такая: 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
Замечания:
±
На сайте с 11.05.2011
Статус:
Offline
|
Если через зад, то как правильно описать? описать весь алгоритм работы?
|
|
|
|
retas |
Дата: Чт, 06.10.2011, 00:23 | Сообщение # 4 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
445
Замечания:
±
На сайте с 10.09.2007
Статус:
Offline
|
sams! 1. Пробуй так pA=portA pA=pA & 00000111 'уничтожим ненужные биты If pA = X then ' в зависимости от найденого делаешь что надо. 2. Пасмотри какой либо пример в Протоне. 3. Посмотри до сколькИ считаетTMR0, какая у тебя частота осцилятора, скоко врамени затрачивается на один тик и прикинь. ... 5. Если у тебя разрешены прерывания по RB0 то, если на обработку этого события нет у тебя много работы, то можешь всё сделать в обработчике прерываний, если же обработка занимает много времени, устанавливаешь какой то бит и отслеживаешь его в прогре, но при этом потеряешь время.
|
|
|
|