GsmHorn2 - устройство оповещения с обратной связью(GSM сигнализация) на базе микроконтроллера PIC16F628 и сотового телефона SiemensC55.

Дата последнего изменения документа - 29 мая 2008г.

Сразу начну с того, чем отличается GsmHorn2 от GsmHorn:

  1. Наличием обратной связи. GsmHorn2 не только сам звонит в случае срабатывания сигнализации, но также на него можно позвонить с заранее заданного телефона, и он выполнит заранее запрограммированное действие.
  2. Контроллером. В GsmHorn2 использован pic16f628. В нем есть аппаратный приемопередатчик. Собственно, это и позволило организовать обратную связь. Также, мне кажется, что это должно облегчить повторение устройства, ибо скорость связи с телефоном легко варьировать одной переменной. Скорость, на которой работал GsmHorn (57600), возможно, поддерживали не все телефоны.
  3. Телефоном. Во-первых, нужен телефон 100% поддерживающий AT-команды, во-вторых, при использовании другого телефона (не Siemens C55), я не уверен, что будет правильно работать зарядка аккумулятора. Так или иначе, на других телефонах возможности проверить у меня не было.

Сразу скажу, что мне пришло довольно много писем, в которых сообщалось, что обратная связь не работает. Так вот, запомните, когда Вы подаете питание на контроллер, телефон должен быть уже включен и "загружен", а "шнурок" к нему, естественно, подцеплен. Если Вы не хотите следовать такому правилу - тогда Вам необходимо изменить программу контроллера таким образом, чтобы память звонков выбиралась каждый раз перед ее использованием.

Схема

Схема во многом похожа на 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

Вернуться на главную страницу .

Hosted by uCoz