Радиомикрофоны
December 3

Исходник GSM «жучка» на PIC16F648A

Реверс инжиниринг демо-прошивки радиомикрофона на PIC16F648A/PIC16F628A и древнем GSM модуле SIM300DZ.

В отличие от «Трешки», ножек контроллера хватит и для дистанционного управления по SMS, а программа кажется гораздо более вменяемой.

Исходники GSM радиомикрофона на PIC16F648A, SIM300D

Антенну используйте заводускую, а не такую, как у автора, а то Ротхаммель перевернется в гробу.

Плата «Трешки» является причиной страшных глюков. В этом GSM радиомикрофоне плата получше, особенно если светодиод с длинными выводами заменить бескорпусным, а микрофон применить от гарнитуры, как советует Eddy71.

Я не анализировал эту прошивку так подробно, как «Трешку», поэтому за надежность не ручаюсь. Но идея хранить номер на SIM карте и проверять по имени гарантирует отсутствие ложных срабатываний и глюков от наводок. Ни «Трешку», ни эту схему я не собирал, поэтому неприятные неожиданности возможны.

Авторская прошивка является демонстрационной и содержит ограничения на длительность и количество звонков. Интересные места прокомментированы.

Если вдруг окажется, что микропрограмма качественная, я советую связаться с автором и купить полную версию с управлением по SMS.

Комментарии автора:

Полная прошивка распространяется уже прошитая в микроконтроллер – спрашивайте у автора.
Если у Вас нету опыта и Вы собрали программатор самостоятельно, то не рискуйте, прошивая внутрисхемно. Вы можете потерять сотовый модуль.
Устройство отвечает только хозяину. Чтобы прописать его номер в международном формате (+7905……….) Вам надо записать на сим-карту его номер под имеем Ph1. Обязательно отмените ввод пин-кода. Программирование осуществляется с помощью мобильника. Будьте внимательны – некоторые телефоны дописывают индексы к имени, это приведет к сбою работы. Например, так делают Sony Ericson.
За полной прошивкой обращайтесь к автору по ICQ: 288449055 или пишите на мыло device@open.by. Автор принимает заказы на разработку устройств с применением контроллеров, GSM и GPS технологий.

Оригинальная прошивка без исходников (сайт Паяльник удалил все мои комментарии):

https://web.archive.org/web/20240512090900/https://cxem.net/radiomic/radiomic123.php

Страница с обсуждением на форуме cxem net:

https://web.archive.org/web/20251203165751/https://forum.cxem.net/topic/50702-%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9-gsm-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D1%84%D0%BE%D0%BD-%D0%BD%D0%B0-sim300d/

        processor p16f648a
        radix dec

        include p16f648a.inc

; The recognition of labels and registers is not always good, therefore
; be treated cautiously the results.

        CONFIG  WDTE  = ON
        CONFIG  PWRTE = OFF
        CONFIG  FOSC  = INTOSCIO
        CONFIG  MCLRE = OFF
        CONFIG  BOREN = OFF
        CONFIG  LVP   = OFF
        CONFIG  CPD   = OFF
        CONFIG  CP    = ON

#define MAX_CALLS 10
#define MAX_TIME 0x72
#define BUFSZ 0x31

;===============================================================================
; DATA address definitions

#define EEPROM_CALLS_COUNTER 0x64

bufptr          equ     0x29
buffer          equ     0x2a

state           equ     0x5c
#define STATE_OFF 0
#define STATE_READY 1
#define STATE_RESET 3

calls_counter   equ     0x5d
time_counter    equ     0x5e

flags           equ     0x5f
#define FLAG_CALL 0

smsp            equ     0x63
regcnt          equ     0x63                               ; network registration
a               equ     0x63
i               equ     0x63

sms_text        equ     0x64
c               equ     0x64
blink_arg       equ     0x64
quotes          equ     0x64
namepos         equ     0x64

sms_index       equ     0x65
d               equ     0x65

dtr_arg         equ     0x66
tmp4            equ     0x66
cmgd_arg1       equ     0x66

delay_arg       equ     0x67
cmgd_arg2       equ     0x67

itoabuf0        equ     0x68
itoabuf1        equ     0x69
itoabuf2        equ     0x6a
itoabuf3        equ     0x6b

arg1            equ     0x6c
arg2            equ     0x6d
j               equ     0x6e

Common_RAM      equ     0x0070                              ; size: 16 bytes

;===============================================================================
; Macroses

BSF1    MACRO   file, bit       ; установить бит регистра из банка 1
        bsf     STATUS, RP0
        bsf     (file), (bit)
        ENDM

BCF1    MACRO   file, bit       ; сбросить бит регистра из банка 1
        bsf     STATUS, RP0
        bcf     (file), (bit)
        ENDM

MAGIC   MACRO                   ; для отправки AT команды
        bcf     PCLATH, 0x0
        bcf     PCLATH, 0x1
        bcf     PCLATH, 0x2
        addwf   PCL, F
        ENDM

MOVLF   MACRO   value, file
        movlw   (value)
        movwf   (file)
        ENDM

MOVFF   MACRO   src, dst
        movf    (src), W
        movwf   (dst)
        ENDM

IFG     MACRO   var, n, label   ; если больше
        movf    (var), W
        sublw   (n)
        btfss   STATUS, C
        goto    (label)
        ENDM

IFL     MACRO   var, n, label   ; если меньше
        movf    (var), W
        sublw   (n)
        btfsc   STATUS, C
        goto    (label)
        ENDM

IFNE    MACRO   var, n, label   ; если не равно
        movf    (var), W
        sublw   (n)
        btfss   STATUS, Z
        goto    (label)
        ENDM

IFEQ    MACRO   var, n, label   ; если равно
        movf    (var), W
        sublw   (n)
        btfsc   STATUS, Z
        goto    (label)
        ENDM

DTR0   MACRO                   ; сбросить DTR
        bcf     PORTB, RB3
        BCF1    TRISB, RB3
        ENDM

DTRP    MACRO                   ; дернуть DTR
        bsf     PORTB, RB3
        BCF1    TRISB, RB3
        ENDM

DELAY   MACRO   n               ; задержка
        movlw   (n)
        bcf     STATUS, RP0
        movwf   delay_arg
        call    function_delay
        ENDM

LDELAY  MACRO   n, file         ; длинная задержка
        MOVLF   (n), (file)
        MOVLF   250, delay_arg
        call    function_delay
        decfsz  (file), F
        goto    $-4
        ENDM

BLINK   MACRO   n               ; мигание светодиодом
        MOVLF   (n), blink_arg
        call    function_blink
        ENDM

BLINKP  MACRO   n               ; мигание светодиодом
        movlw   (n)
        bcf     STATUS, RP0
        movwf   blink_arg
        call    function_blink
        ENDM

SEND    MACRO   char            ; отправить символ
        movlw   (char)
        btfss   PIR1, TXIF
        goto    $-1
        movwf   TXREG
        ENDM

SENDF   MACRO   file            ; отправить "файл"
        movf    (file), W
        btfss   PIR1, TXIF
        goto    $-1
        movwf   TXREG
        ENDM

TXSTR   MACRO   m, proc, n      ; отправить строку
        clrf    (m)
        LOCAL   next_char
next_char:
        movf    (m), W
        call    (proc)
        incf    (m), F
        movwf   (Common_RAM + 7)
        SENDF   (Common_RAM + 7)
        movlw   (n)
        subwf   (m), W
        btfss   STATUS, Z
        goto    next_char
        ENDM

; отправить AT-команду
ATCMD   MACRO   tmp, proc, length, delay
        call    function_clear_buffer
        TXSTR   (tmp), (proc), (length)
        LDELAY  (delay), (tmp)
        ENDM

ATCMD2  MACRO   tmp, proc, length, delay
        TXSTR   (tmp), (proc), (length)
        call    function_clear_buffer
        LDELAY  (delay), (tmp)
        ENDM

;===============================================================================
; CODE area

        ; code

        org     __CODE_START

vector_reset:

        MOVLF   0, PCLATH
        goto    reset_vector
        nop

vector_int:

        movwf   (Common_RAM + 15)
        swapf   STATUS, W
        clrf    STATUS
        movwf   0x21
        MOVFF   (Common_RAM + 15), 0x20
        MOVFF   PCLATH, 0x28
        clrf    PCLATH
        swapf   0x20, F
        MOVFF   FSR, 0x22
        MOVFF   (Common_RAM + 7), 0x23
        MOVFF   (Common_RAM + 8), 0x24
        MOVFF   (Common_RAM + 9), 0x25
        MOVFF   (Common_RAM + 10), 0x26
        MOVFF   (Common_RAM + 11), 0x27

        bcf     STATUS, IRP
        bcf     STATUS, RP0
        MOVLF   0x8c, FSR
        btfss   INDF, 0x5
        goto    check_timer
        btfsc   PIR1, RCIF
        goto    byte_arrived

check_timer:
        MOVLF   0x8c, FSR
        btfss   INDF, 0x0
        goto    restore
        btfsc   PIR1, TMR1IF
        goto    timer_interrupt

restore:
        MOVFF   0x22, FSR
        MOVFF   0x23, (Common_RAM + 7)
        MOVFF   0x24, (Common_RAM + 8)
        MOVFF   0x25, (Common_RAM + 9)
        MOVFF   0x26, (Common_RAM + 10)
        MOVFF   0x27, (Common_RAM + 11)
        MOVFF   0x28, PCLATH
        swapf   0x21, W
        movwf   STATUS
        swapf   (Common_RAM + 15), F
        swapf   (Common_RAM + 15), W
        retfie

byte_arrived:
        bcf     PCLATH, 0x3
        goto    byte_arrived2

timer_interrupt:
        bcf     PCLATH, 0x3
        goto    timer_interrupt2

function_ATE0:
        MAGIC
        dt      "ATE0\r", 0

function_ATCREG:        ; registration status
        MAGIC
        dt      "AT+CREG?\r", 0

function_ATCMGF:        ; SMS text mode
        MAGIC
        dt      "AT+CMGF=1\r", 0

function_ATCMGD:        ; delete SMS
        MAGIC
        dt      "AT+CMGD=%d\r", 0

function_ATCHFA:        ; set the audio channel to Half-Duplex
        MAGIC
        dt      "AT+CHFA=1\r", 0

function_ATCMIC:
        MAGIC
        dt      "AT+CMIC=1,15\r", 0

function_ATCLIP:
        MAGIC
        dt      "AT+CLIP=1\r", 0

function_ATCSCLK:
        ; enable the Serial Command Mode for SMS message waiting indications (SMS-CB)
        ; This command informs the module to send SMS-CB (Cell Broadcast) messages to the connected terminal.
        MAGIC
        dt      "AT+CSCLK=1\r", 0

function_ATA:
        MAGIC
        dt      "ATA\r", 0

function_ATH:
        MAGIC
        dt      "ATH\r", 0

function_ATCMGDC:       ; delete SMS
        MAGIC
        dt      "AT+CMGD=%c\r", 0

function_ATCBC:         ; report the battery charge status of the module
        MAGIC
        dt      "AT+CBC\r", 0

byte_arrived2:
        ; принятый ответ на AT-команду сохраняется в буфере:
        ; buffer[bufptr] = received_byte;
        IFG     bufptr, BUFSZ, buffer_full
        movf    bufptr, W
        incf    bufptr, F
        addlw   buffer
        movwf   FSR
        bcf     STATUS, IRP
        btfss   PIR1, RCIF
        goto    $-1
        MOVFF   RCREG, INDF
        goto    the_end

buffer_full:
        btfss   PIR1, RCIF
        goto    $-1
        movf    RCREG, W

the_end:
        bcf     PIR1, RCIF
        bcf     PCLATH, 0x3
        goto    restore

timer_interrupt2:
        btfsc   flags, FLAG_CALL
        incf    time_counter, F
        bcf     PIR1, TMR1IF
        bcf     PCLATH, 0x3
        goto    restore

function_delay:

        MOVLF   delay_arg, FSR
        bcf     STATUS, IRP
        movf    INDF, W
        btfsc   STATUS, Z
        goto    label_015
label_011:
        MOVLF   1, (Common_RAM + 8)
label_012:
        MOVLF   0xbf, (Common_RAM + 7)
        clrwdt
        decfsz  (Common_RAM + 7), F
        goto    $-2
        decfsz  (Common_RAM + 8), F
        goto    label_012
        MOVLF   0x4a, (Common_RAM + 7)
        decfsz  (Common_RAM + 7), F
        goto    $-1
        nop
        clrwdt
        decfsz  INDF, F
        goto    label_011
label_015:
        retlw   0x00

function_blink:

        movf    blink_arg, F
        btfsc   STATUS, Z
        goto    label_016
        bcf     PORTA, RA1
        BCF1    TRISA, RA1
        DELAY   250
        BSF1    TRISA, RA1
        DELAY   250
        decf    blink_arg, F
        goto    function_blink
label_016:
        retlw   0

function_DTR:

        movf    dtr_arg, F
        btfss   STATUS, Z
        goto    label_017
        DTR0
        DELAY   50
        goto    label_018
label_017:
        DTRP
        bcf     STATUS, RP0
label_018:
        retlw   0

function_clear_buffer:

        clrf    bufptr
label_019:
        IFG     bufptr, BUFSZ, label_020
        movlw   buffer
        addwf   bufptr, W
        movwf   FSR
        bcf     STATUS, IRP
        clrf    INDF
        incf    bufptr, F
        goto    label_019
label_020:
        clrf    bufptr
        retlw   0

start:
        call    function_clear_buffer
        SEND    'A'
        SEND    'T'
        SEND    '\r'
        call    function_clear_buffer

        LDELAY  2, a

        IFEQ    buffer,     'A', label_026
        IFEQ    buffer + 2, 'O', label_026

        MOVLF   0, (Common_RAM + 8)
        goto    label_027
        goto    label_027

label_026:
        MOVLF   1, (Common_RAM + 8)
        goto    label_027

label_027:
        bcf     PCLATH, 0x3
        goto    label_139

label_028:
        BSF1    TRISB, RB4
        bcf     STATUS, RP0

        ; зарядка подключена?
        btfss   PORTB, RB4
        goto    no_charger

        movf    state, F
        btfss   STATUS, Z
        goto    check_battery

        ; передаем несколько раз "AT\r"
        clrf    a
label_029:
        IFG     a, 2, check_battery
        SEND    'A'
        SEND    'T'
        SEND    '\r'
        LDELAY  2, c
        incf    a, F
        goto    label_029

check_battery:
        ATCMD   c, function_ATCBC, 7, 4
        ; +CBC: <battery connected status>, <battery charging_loop level>, <voltage>
        IFNE    buffer + 15, '1', check_charger
        BLINK   1

check_charger:
        IFNE    buffer + 15, '2', charger_disconnected

charging_loop:
        ; зацикливаемся на время зарядки
        BSF1    TRISB, RB4
        bcf     STATUS, RP0
        btfss   PORTB, RB4
        goto    charger_disconnected
        ; Для зарядки аккумулятора надо выключать устройство, подключить через
        ; шнур mini USB с соответствующему порту компьютера и дождаться
        ; постоянного горения светодиода.
        bcf     PORTA, RA1
        BCF1    TRISA, RA1
        DELAY   100
        goto    charging_loop

charger_disconnected:
        goto    charger_disconnected2

no_charger:
        BSF1    TRISA, RA1
        bcf     STATUS, RP0

charger_disconnected2:
        bcf     PCLATH, 0x3
        goto    label_142

; Нажмите на кнопку и ждите короткой вспышки светодиода.
; Это означает, что контроллер обратил внимание на кнопку.
function_button:

        BSF1    TRISB, RB5
        bcf     STATUS, RP0
        btfsc   PORTB, RB5
        goto    label_048

        bcf     PORTA, RA1
        BCF1    TRISA, RA1
        DELAY   50
        BSF1    TRISA, RA1
        DELAY   50
        BSF1    TRISB, RB5
        bcf     STATUS, RP0
        btfsc   PORTB, RB5
        goto    label_046

label_043:
        BSF1    TRISB, RB5
        bcf     STATUS, RP0
        btfsc   PORTB, RB5
        goto    label_045
        LDELAY  2, a
        goto    label_043

label_045:
        MOVLF   1, (Common_RAM + 8)
        goto    label_049
        goto    label_047

label_046:
        MOVLF   0, (Common_RAM + 8)
        goto    label_049

label_047:
        goto    label_049

label_048:
        MOVLF   0, (Common_RAM + 8)
        goto    label_049

label_049:
        retlw   0

function_SIM300D_power:

        bcf     PORTB, RB0
        BCF1    TRISB, RB0
        bcf     STATUS, RP0
        ; пауза
        clrf    c
label_050:
        IFG     c, 7, label_052
        LDELAY  2, d
        clrwdt
        incf    c, F
        goto    label_050
label_052:
        BSF1    TRISB, RB0
        bcf     STATUS, RP0
        retlw   0x00

power_on_continue:
        clrf    a
        call    function_clear_buffer
        clrf    a

label_054:
        IFEQ    buffer, 'A', label_060
        IFEQ    buffer + 2, 'O', label_060
        IFNE    a, 7, label_055
        call    function_SIM300D_power
        clrf    a

label_055:
        call    function_clear_buffer
        SEND    'A'
        SEND    'T'
        SEND    '\r'
        call    function_clear_buffer
        LDELAY  2, c
        incf    a, F
        goto    label_054

label_060:
        call    function_clear_buffer
        ATCMD2  c, function_ATE0, 5, 2
        clrf    regcnt

network_registration_loop:
        ; регистрация в сети
        IFEQ    buffer + 11, '1', registered
        IFNE    regcnt, 30, label_atcreg
        call    function_SIM300D_power
        clrf    regcnt
        goto    label_054

label_atcreg:
        incf    regcnt, F
        ATCMD2  c, function_ATCREG, 9, 2
        goto    network_registration_loop

registered:
        bcf     PCLATH, 0x3
        goto    after_registration

function_018:

        movf    arg2, W
        clrf    (Common_RAM + 8)
        subwf   arg1, W
        btfsc   STATUS, C
        goto    label_070
        MOVFF   arg1, (Common_RAM + 7)
        goto    label_072

label_070:
        clrf    (Common_RAM + 7)
        MOVLF   8, j

label_071:
        rlf     arg1, F
        rlf     (Common_RAM + 7), F
        movf    arg2, W
        subwf   (Common_RAM + 7), W
        btfsc   STATUS, C
        movwf   (Common_RAM + 7)
        rlf     (Common_RAM + 8), F
        decfsz  j, F
        goto    label_071

label_072:
        retlw   0

itoa:
        ; преобразование числа в строку
        movlw   ' '
        btfss   cmgd_arg2, 4
        MOVLF   '0', itoabuf0
        MOVFF   cmgd_arg1, (Common_RAM + 7)
        btfss   cmgd_arg1, 7
        goto    label_074
        comf    (Common_RAM + 7), F
        incf    (Common_RAM + 7), F
        MOVFF   (Common_RAM + 7), cmgd_arg1
        MOVLF   '-', itoabuf0
        bsf     cmgd_arg2, 7

label_074:
        MOVFF   cmgd_arg1, arg1
        MOVLF   100, arg2
        call    function_018
        MOVFF   (Common_RAM + 7), cmgd_arg1
        movlw   '0'
        addwf   (Common_RAM + 8), W
        movwf   itoabuf1

        MOVFF   cmgd_arg1, arg1
        MOVLF   10, arg2
        call    function_018
        movlw   '0'
        addwf   (Common_RAM + 7), W
        movwf   itoabuf3
        movlw   '0'
        addwf   (Common_RAM + 8), W
        movwf   itoabuf2

        MOVFF   itoabuf0, (Common_RAM + 7)
        btfss   cmgd_arg2, 0x3
        goto    $+3
        btfss   cmgd_arg2, 0x7
        bcf     cmgd_arg2, 0x2

        btfsc   cmgd_arg2, 0x4
        goto    label_076
        btfss   cmgd_arg2, 0x7
        goto    label_078
        btfsc   cmgd_arg2, 0x2
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf1
        btfsc   cmgd_arg2, 0x1
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf2
        goto    label_078

label_076:
        movlw   '0'
        subwf   itoabuf1, W
        btfss   STATUS, Z
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf1
        MOVLF   ' ', itoabuf0
        btfss   cmgd_arg2, 0x3
        goto    label_077
        bcf     cmgd_arg2, 0x2
        bsf     cmgd_arg2, 0x1
        btfss   cmgd_arg2, 0x7
        bcf     cmgd_arg2, 0x1

label_077:
        movlw   '0'
        subwf   itoabuf2, W
        btfss   STATUS, Z
        goto    label_078
        MOVFF   (Common_RAM + 7), itoabuf2
        MOVLF   ' ', itoabuf1
        btfss   cmgd_arg2, 0x3
        goto    label_077
        bcf     cmgd_arg2, 0x1
        btfss   cmgd_arg2, 0x7
        bcf     cmgd_arg2, 0x0

label_078:
        btfss   cmgd_arg2, 0x2
        goto    label_080
        SENDF   itoabuf0

label_080:
        btfss   cmgd_arg2, 0x1
        goto    label_082
        SENDF   itoabuf1

label_082:
        btfss   cmgd_arg2, 0x0
        goto    label_084
        SENDF   itoabuf2

label_084:
        SENDF   itoabuf3
        bcf     PCLATH, 0x3
        goto    return_from_itoa

remove_all_sms:
        ATCMD   d, function_ATCMGF, 10, 2
        MOVLF   1, i
delete_next:
        IFG     i, 19, delete_done
        call    function_clear_buffer
        TXSTR   d, function_ATCMGD, 8
        MOVFF   i, cmgd_arg1
        MOVLF   31, cmgd_arg2
        goto    itoa
return_from_itoa:
        SEND    '\r'
        LDELAY  2, d
        incf    i, F
        goto    delete_next

delete_done:
        ATCMD   d, function_ATCHFA, 10, 2
        ATCMD   d, function_ATCMIC, 13, 2
        ATCMD   d, function_ATCLIP, 10, 2
        ATCMD   d, function_ATCSCLK, 11, 2

        bcf     PCLATH, 0x3
        goto    ready

label_109:
        clrf    quotes
        clrf    i

parse_call_info:
        ; +CLIP: "number", "type", "alphaId"
        IFEQ    quotes, 5, parse_call_done
        movlw   buffer
        addwf   i, W
        movwf   FSR
        bcf     STATUS, IRP
        movf    INDF, W
        ; подсчет количества кавычек
        sublw   '\"'
        btfsc   STATUS, Z
        incf    quotes, F
        incf    i, F
        goto    parse_call_info
        ; выход за пределы буфера не проверяется!

parse_call_done:
        MOVFF   i, namepos
        clrf    i

label_112:
        movf    namepos, W
        sublw   BUFSZ + 1
        subwf   i, W
        btfsc   STATUS, C
        goto    check_callee

        movlw   buffer
        addwf   i, W
        movwf   (Common_RAM + 8)
        clrf    (Common_RAM + 10)
        btfsc   STATUS, C
        incf    (Common_RAM + 10), F
        movf    namepos, W
        addwf   i, W
        addlw   buffer
        movwf   FSR
        bcf     STATUS, IRP
        MOVFF   INDF, 0x68
        MOVFF   (Common_RAM + 8), FSR
        bcf     STATUS, IRP
        btfsc   (Common_RAM + 10), 0x0
        bsf     STATUS, IRP
        MOVFF   0x68, INDF
        incf    i, F
        goto    label_112

check_callee:
        clrf    c

        ; проверка имени контакта на SIM карте (Ph1)
        IFNE    buffer, 'P', label_ATH
        IFNE    buffer + 1, 'h', label_ATH
        IFNE    buffer + 2, '1', label_ATH

        ; очистить счетчик времени соединения
        clrf    time_counter

        ; принять звонок
        ATCMD   d, function_ATA, 4, 2

        ; активен звонок
        bsf     flags, FLAG_CALL

        ; чтение счетчика удачных соединений из EEPROM
        movlw   EEPROM_CALLS_COUNTER
        bsf     STATUS, RP0
        movwf   EEADR
        bcf     EECON1, 0x7
        bsf     EECON1, RD
        movf    EEDATA, W
        bcf     STATUS, RP0
        ; увеличение на единицу
        movwf   calls_counter
        incf    calls_counter, F
        ; запись нового значения
        movlw   EEPROM_CALLS_COUNTER
        bsf     STATUS, RP0
        movwf   EEADR
        bcf     STATUS, RP0
        movf    calls_counter, W
        bsf     STATUS, RP0
        movwf   EEDATA
        bsf     EECON1, WREN
        bcf     STATUS, RP0
        MOVFF   INTCON, (Common_RAM + 7)
        bcf     INTCON, GIE
        bsf     STATUS, RP0
        ; Flash programming unlock sequence
        MOVLF   0x55, EECON2
        MOVLF   0xaa, EECON2
        bsf     EECON1, WR
        btfsc   EECON1, WR
        goto    $-1
        bcf     EECON1, WREN

        movf    (Common_RAM + 7), W
        bcf     STATUS, RP0
        iorwf   INTCON, F
        goto    label_121

label_ATH:
        TXSTR   d, function_ATH, 4

label_121:
        LDELAY  2, d
        bcf     PCLATH, 0x3
        goto    not_a_ring

sms_received:
        ; пришло СМС
        clrf    dtr_arg
        call    function_DTR
        ; текущий символ СМС
        clrf    smsp
find_comma:
        movlw   buffer
        addwf   smsp, W
        movwf   FSR
        bcf     STATUS, IRP
        IFEQ    INDF, ',', comma_found
        incf    smsp, F
        goto    find_comma

comma_found:
        movlw   1
        addwf   smsp, W
        movwf   sms_text
        movlw   buffer
        addwf   sms_text, W
        movwf   FSR
        bcf     STATUS, IRP

        MOVFF   INDF, sms_index

        ; Команды отсылаются с телефона хозяина, все “чужие” смс просто удаляются.
        ; где проверка номера?

        call    function_clear_buffer

        ; удаляем СМС
        TXSTR   tmp4, function_ATCMGDC, 8
        SENDF   sms_index
        SEND    '\r'
        LDELAY  2, 0x66
        MOVLF   1, dtr_arg
        call    function_DTR
        bcf     PCLATH, 0x3
        goto    not_a_sms

reset_vector:

        clrf    FSR
        bcf     STATUS, IRP
        movlw   0x1f
        andwf   STATUS, F
        BSF1    PCON, OSCF
        MOVLF   0x19, TXREG
        MOVLF   0xa6, RCSTA
        movlw   0x90
        bcf     STATUS, RP0
        movwf   RCSTA
        MOVLF   0x07, CMCON
        clrf    bufptr
        MOVLF   STATE_RESET, state
        bcf     flags, FLAG_CALL
        bsf     STATUS, RP0
        movf    TMR0, W
        andlw   0xc0
        movwf   TMR0
        MOVLF   0x0f, (Common_RAM + 7)
        movlw   0x07
        bcf     STATUS, RP0
        clrf    TMR0
        MOVLF   0x81, FSR
        bcf     STATUS, IRP
        movf    INDF, W
        andlw   0xf0
        iorlw   0x07
        movwf   INDF
        clrwdt
        movf    INDF, W
        andlw   0xf7
        btfsc   (Common_RAM + 7), 0x3
        andlw   0xf0
        iorwf   (Common_RAM + 7), W
        movwf   INDF
        MOVLF   0xb5, T1CON
        MOVLF   0, (Common_RAM + 8)
        movwf   T2CON
        movlw   0x00
        bsf     STATUS, RP0
        movwf   T2CON
        movlw   0x07
        bcf     STATUS, RP0
        movwf   CMCON
        bsf     STATUS, RP0
        movf    PORTA, W
        clrwdt
        MOVLF   0x02, (Common_RAM + 7)

label_132:
        decfsz  (Common_RAM + 7), F
        goto    label_132
        goto    label_133

label_133:
        bcf     STATUS, RP0
        movf    CMCON, W
        bcf     PIR1, CMIF
        bsf     STATUS, RP0
        clrf    CMCON
        bsf     PIR1, TMR1IF
        bsf     PIR1, RCIF
        movlw   0xc0
        bcf     STATUS, RP0
        iorwf   INTCON, F
        BSF1    PCON, OSCF
        bsf     PORTA, RA1
        bsf     PORTB, RB4

        MOVLF   EEPROM_CALLS_COUNTER, EEADR
        bcf     EECON1, 0x7
        bsf     EECON1, RD
        IFNE    EEDATA, 0xff, label_initialized

        ; инициализация счетчика удачных соединений (демо-прошивка)
        MOVLF   0x64, EEADR
        clrf    EEDATA
        bsf     EECON1, WREN
        bcf     STATUS, RP0
        MOVFF   INTCON, (Common_RAM + 7)
        bcf     INTCON, GIE
        bsf     STATUS, RP0
        ; Flash programming unlock sequence
        MOVLF   0x55, EECON2
        MOVLF   0xaa, EECON2
        bsf     EECON1, WR
        btfsc   EECON1, WR
        goto    $-1
        bcf     EECON1, WREN
        movf    (Common_RAM + 7), W
        bcf     STATUS, RP0
        iorwf   INTCON, F
        bsf     STATUS, RP0

label_initialized:
        ; проверка счетчика звонков
        MOVLF   EEPROM_CALLS_COUNTER, EEADR
        bcf     EECON1, 0x7
        bsf     EECON1, RD
        ; достигли максимального количества звонков для свободной версии?
        IFNE    EEDATA, MAX_CALLS, label_137
        ; достигли - зацикливаемся
        BLINKP  5
        LDELAY  6, a
        bsf     STATUS, RP0
        goto    label_initialized

label_137:
        ; еще не достигли
        bcf     TMR0, 0x7
        bcf     STATUS, RP0
        clrf    dtr_arg
        call    function_DTR

label_138:
        movf    state, W
        sublw   STATE_RESET
        btfss   STATUS, Z
        goto    label_141
        goto    start

label_139:
        movf    (Common_RAM + 8), F
        btfss   STATUS, Z
        goto    label_140
        clrf    state
        goto    label_141

label_140:
        MOVLF   STATE_READY, state

label_141:
        BSF1    OPTION_REG, NOT_RBPU
        bcf     STATUS, RP0

        goto    label_028

label_142:
        BCF1    OPTION_REG, NOT_RBPU
        bcf     STATUS, RP0

        movf    state, F
        btfss   STATUS, Z
        goto    label_147

        call    function_button
        movf    (Common_RAM + 8), F
        btfss   STATUS, Z
        goto    power_on

        sleep
        goto    go_sleep2

power_on:
        ; Затем после того как вы отпустите он моргнет один раз – это означает
        ; что начался процесс включения модуля.
        DTR0
        BLINKP  1
        goto    power_on_continue

after_registration:
        ; Затем светодиод моргнет два раза – это означает что модуль
        ; настроен и зарегистрировался в сети GSM.
        BLINK   2
        goto    remove_all_sms

ready:
        ; После того как светодиод моргнет три раза – устройство готово к работе.
        ; Устройство перейдет в режим сна и будет ждать входящего звонка.
        BLINK   3
        DTRP
        movlw   STATE_READY
        bcf     STATUS, RP0
        movwf   state

go_sleep2:
        goto    go_sleep

label_147:
        call    function_button
        movf    (Common_RAM + 8), F
        btfss   STATUS, Z
        goto    power_off

        call    function_clear_buffer
        LDELAY  2, a

        ; "RING"
        IFNE    0x2c, 'R', not_a_ring
        IFEQ    0x2d, 'I', label_109

not_a_ring:
        ; пришло SMS
        ; <CR><LF>+CMTI: <mem>,<n><CR><LF>
        ; value of mem is the storage location where the sms was stored.
        ; Usually its value is SM, which stands for SIM memory.
        ; the value of n is the sms slot on which the incoming message was stored
        IFNE    0x2c, '+', not_a_sms
        IFNE    0x2d, 'C', not_a_sms
        IFNE    0x2e, 'M', not_a_sms
        IFEQ    0x2f, 'T', sms_received

not_a_sms:
        btfss   flags, FLAG_CALL
        goto    check_calls_counter

        ; проверка максимальной длительности соединения
        IFL     time_counter, MAX_TIME, check_calls_counter

        clrf    dtr_arg
        call    function_DTR
        bcf     flags, FLAG_CALL
        clrf    time_counter

        ; положить трубку
        ATCMD   a, function_ATH, 4, 2

        MOVLF   1, dtr_arg
        call    function_DTR

check_calls_counter:
        ; проверка счетчика удачных соединений (демо-прошивка)
        movlw   EEPROM_CALLS_COUNTER
        bsf     STATUS, RP0
        movwf   EEADR
        bcf     EECON1, 7
        bsf     EECON1, RD
        ; достигли максимума?
        IFNE    EEDATA, MAX_CALLS, have_free_calls
        ; лимит исчерпан
        BLINKP  5
        ; сбрасываем звонок
        TXSTR   a, function_ATH, 4
        LDELAY  6, a
        ; зацикливаемся
        goto    check_calls_counter
        bsf     STATUS, RP0

have_free_calls:
        bcf     STATUS, RP0
        goto    label_138
        goto    go_sleep

power_off:
        ; Выключение происходит как и включение.
        ; Нажмите на кнопку и держите покуда не моргнет светодиод, как отпустите
        ; он моргнет 2 раза. Это означает, что девайс выключен.
        BLINK   2
        call    function_SIM300D_power
        clrf    state

go_sleep:
        sleep

        end

Если найдете ошибку, напишите в комментариях.

© Copyright 2025 Badradio. All rights reserved.
Все права защищены. Копирование материалов сайта запрещено.
При цитировании ставить кликабельную ссылку на первоисточник.