Дата последнего изменения документа - 29 мая 2008г.
Сразу начну с того, чем отличается GsmHorn2 от GsmHorn:
Сразу скажу, что мне пришло довольно много писем, в которых сообщалось, что обратная связь не работает. Так вот, запомните, когда Вы подаете питание на контроллер, телефон должен быть уже включен и "загружен", а "шнурок" к нему, естественно, подцеплен. Если Вы не хотите следовать такому правилу - тогда Вам необходимо изменить программу контроллера таким образом, чтобы память звонков выбиралась каждый раз перед ее использованием.
Схема во многом похожа на GsmHorn, поэтому остановлюсь лишь на особенностях, которые не были присущи предыдущему устройству. Кроме двух первых заполненных ячеек в телефонной книге вашей Sim-карты (на которые приходит звонок в случае тревоги), должна присутствовать запись, имя которой содержит восклицательный знак, например, "!Action". Таких записей может быть несколько, они могут находиться в любых ячейках телефонного справочника (в том числе и в первых двух). Когда Вы позвоните на GsmHorn2, он сначала "отбивает" звонок, а затем проверяет - кто звонил? Если обнаруживает восклицательный знак в имени абонента, то программа переходит на ту ветвь, которая предназначена для выполнения действия. В моем варианте GsmHorn перезванивает на номер из второй ячейки и зажигает красный светодиод на несколько секунд. Если с фантазией у Вас лучше, чем у меня - придумайте что-нибудь поинтереснее. На "чужие" звонки и SMS сообщения никакой реакции, естественно, не возникает.
Зеленый светодиод нужен для индикации режимов. Во-первых, при включении устройства он моргает один раз. И при поступлении звонка моргает (очень коротко). Ну и он нужен для будущих новых функций.
Резисторы R7 и R8 нужны для того, чтобы телефон правильно заряжался, а при отсутствии внешнего питания брал на себя функции резервного питания.
Теперь контроллер не использует режима sleep в дежурном режиме, зато использет прерывания от приемопередатчика. Итак, программа:
;********************************************************************************** ;GsmHorn2 на PIC16F628 ; ;********************************************************************************** LIST p=16F628 ; Определение типа микроконтроллера. __CONFIG 03F21H ; Биты конфигурации: защита выключена, WDT выкл, ; стандартный XT - генератор, PWRTE включен. ;================================================================================== ; Определение положений регистров специального назначения. ;================================================================================== PC equ 02h ; PC Status equ 03h ; Status VRCON equ 1Fh ; VRCON - банк1. Источник опорного U. CMCON equ 1Fh ; CMCON. Модуль компараторов. T1CON equ 10h ; T1CON. Таймер TMR1. T2CON equ 12h ; T2CON. Таймер TMR2. CCP1CON equ 17h ; CCP1CON. Модуль CCP. RCSTA equ 18h ; RCSTA. Модуль USART. TXSTA equ 98h ; SPBRG equ 99h ; PORTA equ 05h ; PORTB equ 06h ; TRISA equ 85h ; TRISB equ 86h INTCON equ 0Bh PIE1 equ 8Ch TXREG equ 19h PIR1 equ 0Ch RCREG equ 1Ah OPTION_REG equ 81h ;================================================================================== ; Определение названий и положений регистров общего назачения. ;================================================================================== ; Регистры, с которыми можно производить операции в любом банке. ;----------------------------------------------------------------- COUNT1 equ 70h ;счетчик для подпрограммы временной задержки COUNT2 equ 71h ;счетчик для подпрограммы временной задержки TEMP equ 72h ; COUNT3 equ 73h ;счетчик для подпрограммы временной задержки SAVE_STAT equ 74h ;используется для сохранения статуса в прерывании FLAGS equ 75h ;регистр флагов ;структура регистра FLAGS: 1 бит-поступил звонок (читается информация о звонке) ;2 бит-принятый звонок с заданного телефона (необходимо прореагировать событием) SAVE_W equ 76h ;используется для сохранения W в прерывании ;...... equ 77h ; ;...... equ 78h ; ;...... equ 79h ; ;...... equ 7Ah ; ;...... equ 7Bh ; ;...... equ 7Ch ; ;...... equ 7Dh ; ;...... equ 7Eh ; ;...... equ 7Fh ; ;=============================================================================================== ; Присваивание битам названий. ;=============================================================================================== RP0 equ 5 ; Бит выбора банка. RP1 equ 6 ; Бит выбора банка. Z equ 2 ; Нулевой результат ;=============================================================================================== org 0 ; Начать выполнение программы goto Start ; с подпрограммы Start. ; Обработчик прерываний org 4 ;В обработчике прерываний... ;---- действия по сохранению состояния ------- movwf SAVE_W swapf Status,w ;обменять местами полубайты и сохранить в W movwf SAVE_STAT bcf Status,5 ;установка 0 банка ;--------------------------------------------- btfsc PIR1,5 ;Прерывание от RS232 ? goto RS232 ;Да, прерывание от RS232. BCF PORTA,2 ;Нет, прерывание от внешнего источника ; bcf FLAGS,1 ; (зарезервировано для будующего использования) BCF INTCON,1 ;сбросить бит прерывания от внешнего источника goto S1 ;Выходим RS232 movf RCREG,w ;Считали пришедший байт btfss FLAGS,1 ;Если уже был звонок, то 1 goto C1 BCF PORTA,2 ; turn off the LED ; Проверяем "попадание" пришедшего байта на восклицательный знак XORLW d'33' ;восклицательный знак btfsc Status,Z ;результат нулевой? bsf FLAGS,2 ;поднять флаг события goto C2 C1 bsf FLAGS,1 ;поступил звонок BSF PORTA,2 ; turn on the LED C2 bcf PIR1,5 ;Сбросили флаг прерывания ;---- действия по восстановлению состояния -------- S1 swapf SAVE_STAT,w movwf Status swapf SAVE_W,f swapf SAVE_W,w ;-------------------------------------------------- retfie ;Конец обработчика прерываний ;*********************************************************************************************** ; НАЧАЛО ПРОГРАММЫ ;*********************************************************************************************** ; Подготовительные операции ;=============================================================================================== Start bsf Status,RP0 ; "Двойная" "штатная" команда установки bcf Status,RP1 ; 1-го банка. clrf VRCON ; Отключение источника опорного напряжения. ; MOVLW b'00000110' ; all as output, кроме тех, что используются для USART MOVLW b'11111111' ; all as input MOVWF TRISB ; Configure PORTB MOVLW b'00000000' ; all as output MOVWF TRISA ; Configure PORTA MOVLW b'11000101' ; прерывание по переднему фронту, Timer0 in timer mode, prescaler=1:64 assigned to timer0, резисторы выкл. MOVWF OPTION_REG ; Configure options bcf Status,RP0 ; Установка 0-го банка movlw .07 ; Отключение компараторов. movwf CMCON ; --------"-------- clrf T1CON ; ----"---- TMR1. clrf T2CON ; ----"---- TMR2. clrf CCP1CON ; ----"---- CCP. ;Блок инициализации USART movlw b'11010000' ;Разрешение прерывания, разрешение от INT movwf INTCON ;(0Bh)в любом банке ;------------------------------------------ bsf Status,5 ;установка 1-го банка movlw d'12' ;19200 Byte/sec movwf SPBRG ;(99h)Регистр генератора скорости USART movlw b'00100100' ;brgh = high (высоко скоростной режим) movwf TXSTA ;(98h) регистр управления и статуса передатчика ;------------------------------------------ bsf PIE1,5 ;(8Ch) бит 5 Разрешаем прерывание по RS232 ; bcf PIE1,5 ;(8Ch) бит 5 Запрещаем прерывание по RS232 ;------------------------------------------ bcf Status,5 ;установка 0 банка movlw b'10110000' ;enable Async Reception movwf RCSTA ;(18h)регистр управления и статуса приемника ;При включении моргнем светодиодом на PA2 (1 ножка микросхемы) Go clrf PORTA BSF PORTA,2 ; turn on the LED CALL delay1 CALL delay1 BCF PORTA,2 ; turn off the LED CALL delay1 CALL delay1 ;Не забыть выбрать справочник принятых звонков командой at+cpbs="RC" movlw d'65' call TransWt movlw d'84' call TransWt movlw d'43' call TransWt movlw d'67' call TransWt movlw d'80' call TransWt movlw d'66' call TransWt movlw d'83' call TransWt movlw d'61' call TransWt MOVLW d'34' CALL TransWt MOVLW d'82' CALL TransWt MOVLW d'67' CALL TransWt MOVLW d'34' CALL TransWt movlw d'13' call TransWt call delay1 clrf FLAGS ;сброс всех флагов ;Звоним на первый номер zvon BSF PORTA,2 ; turn on the LED call HangUp CALL delay1 call Atd1 call big_delay ;Звоним на второй номер zvon1 BSF PORTA,2 ; turn on the LED call HangUp CALL delay1 call Atd2 call big_delay BCF PORTA,2 ; turn off the LED BCF PORTA,3 ; turn off the LED ; CALL delay1 ; CALL delay1 bcf FLAGS,1 ;сбрасываем флаги bcf FLAGS,2 ;Проверяем, не поступил-ли звонок? Cont0 btfss FLAGS,1 ; Если поступил звонок goto Cont1 CALL delay1 CALL delay1 CALL delay1 ; добавил 30.08 call HangUp ; Отбиваем линию CALL delay1 ;Выдаем команду на чтение звонка at+cpbr=1 movlw d'65' call TransWt movlw d'84' call TransWt movlw d'43' call TransWt movlw d'67' call TransWt movlw d'80' call TransWt movlw d'66' call TransWt movlw d'82' call TransWt movlw d'61' call TransWt movlw d'49' call TransWt movlw d'13' call TransWt ;Нужно вернуть флаг звонка на место CALL delay1 CALL delay1 bcf FLAGS,1 ;Проверка на наступление события Cont1 btfss FLAGS,2 ; Если наступило событие goto Cont2 BSF PORTA,3 ; Зажигаем нужный светодиод goto zvon1 ; 31.08 И отзваниваем на второй номер ;Проверка на срабатывание датчика на B4 Cont2 btfss PORTB,4 ; Проверка на срабатывание цепи охраны goto Cont0 ;Если нет, переходим на начало проверок goto zvon ;Если да, уходим звонить ;---------------------------------------------- ;Подпрограмма "ATH0" HangUp MOVLW d'65' ; ASCII code CALL TransWt ; Send W MOVLW d'84' ; ASCII code CALL TransWt ; Send W MOVLW d'72' ; ASCII code CALL TransWt ; Send W MOVLW d'48' ; ASCII code CALL TransWt ; Send W MOVLW d'13' ; ASCII code CALL TransWt ; Send W return ;---------------------------------------------- ;Подпрограмма "ATD>"SM"1;" Atd1 MOVLW d'65' ; ASCII code CALL TransWt ; Send W MOVLW d'84' ; ASCII code CALL TransWt ; Send W MOVLW d'68' ; ASCII code CALL TransWt ; Send W MOVLW d'62' ; ASCII code CALL TransWt ; Send W MOVLW d'34' CALL TransWt ; Send W MOVLW d'83' CALL TransWt ; Send W MOVLW d'77' CALL TransWt ; Send W MOVLW d'34' CALL TransWt ; Send W MOVLW d'49' ; ASCII code CALL TransWt ; Send W MOVLW d'59' ; ASCII code CALL TransWt ; Send W MOVLW d'13' ; ASCII code CALL TransWt ; Send W return ;---------------------------------------------- ;Подпрограмма "ATD>"SM"2;" Atd2 MOVLW d'65' ; ASCII code CALL TransWt ; Send W MOVLW d'84' ; ASCII code CALL TransWt ; Send W MOVLW d'68' ; ASCII code CALL TransWt ; Send W MOVLW d'62' ; ASCII code CALL TransWt ; Send W MOVLW d'34' CALL TransWt ; Send W MOVLW d'83' CALL TransWt ; Send W MOVLW d'77' CALL TransWt ; Send W MOVLW d'34' CALL TransWt ; Send W MOVLW d'50' ; ASCII code CALL TransWt ; Send W MOVLW d'59' ; ASCII code CALL TransWt ; Send W MOVLW d'13' ; ASCII code CALL TransWt ; Send W return ;---------------------------------------------- ;Подпрограмма передачи ;У ПИКа есть регистр TXREG в который, если положить ;данные, они сразу же перемещаются в сдвиговый регистр. ;В это время выставляется флаг того, что передача ведется и еще не ;закончена TXSTA,TRMT если флаг ,TRMT в лог "0" значит передача не закончена, ;если в лог "1" значит передал. TransWt movwf TXREG ;В регистр передатчика положили передаваемый байт bsf Status,5 ;5 или 1 все-таки??? btfss TXSTA,1 ;Ждем когда ПИК передаст байт goto $-1 ;и освободит сдвиговый регистр передатчика bcf Status,5 ;Все, передал. return ;выходим из подпрограммы. ;---------------------------------------------- ;Delay subroutine delay1 MOVLW d'200' ; Delay duration MOVWF COUNT1 ; Initialize COUNT1 MOVLW d'255' ; Maximum value MOVWF COUNT2 ; Initialize COUNT2 DECFSZ COUNT2,F ; COUNT2-- GOTO $-1 ; Loop until COUNT2=0 DECFSZ COUNT1,F ; COUNT1-- GOTO $-5 ; Loop until COUNT1=0 RETURN ; Return ;---------------------------------------------- ;Big delay subroutine big_delay MOVLW d'120' ; Delay duration MOVWF COUNT3 ; Initialize COUNT1 mm CALL delay1 DECFSZ COUNT3,F ; COUNT3-- GOTO mm ; Loop until COUNT3=0 RETURN ; Return end ; Конец программы.
Два слова об использовании других телефонов. Думаю, что другие телефоны должны работать, главное, чтобы они поддерживали AT-команды. Насчет резисторов R7 и R8 ничего про другие телефоны не знаю, видел только, что это делается именно с моделью C55. Ну и, конечно, у других телефонов может быть другая цоколевка системного разъема. Сам я с другими моделями телефонов не экспериментировал.
Буду рад, если Вы пришлете мне свои отзывы и предложения на gsmhorn@narod.ru.
И последнее:
Автор не несет никакой ответственности за возможную порчу телефона и за любые
другие негативные последствия, возникшие вследствие использования данного
устройства.
(C) Ilya Permyakov, 2005-2009