Исходник GSM «жучка» на PIC16F648A
Реверс инжиниринг демо-прошивки радиомикрофона на PIC16F648A/PIC16F628A и древнем GSM модуле SIM300DZ.
В отличие от «Трешки», ножек контроллера хватит и для дистанционного управления по SMS, а программа кажется гораздо более вменяемой.
Антенну используйте заводускую, а не такую, как у автора, а то Ротхаммель перевернется в гробу.
Плата «Трешки» является причиной страшных глюков. В этом 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.
Все права защищены. Копирование материалов сайта запрещено.
При цитировании ставить кликабельную ссылку на первоисточник.