Hello , i use a 16f628 with a wavecom modem and i must read sms messages with serin and the 4 Mhz internal oscillator. When i receive the sms , the pic must receive 4 caracters with this:
SERIN RX,N9600,consigne,sms,ordre,valeur
can you help me because it doesn't work correctly.
Here is an extract of my program that use 4 output and 4 input
Sorry for my english. I'm a french student.
DEFINE OSC 4 ; utilisation de l'oscillateur à quartz 4 Mhz intégré
INCLUDE "modedefs.bas"
sms var byte ; octet de reception série
sms2 VAR BYTE
memo var byte
i VAR BYTE ; variable de travail pour les boucles if
ordre VAR BYTE ; type ordre demandé ? ou =
valeur VAR BYTE ; état demandé d'une sortie relais
relais VAR BYTE ; variable de masquage pour l'écriture sur les sorties TOR
consigne VAR BYTE ; variable de valeur Q ou E pour entrée ou sortie
alerte VAR BYTE ; variable désignant coupure edf = 2 ou sms mal tapé = 1
nbrenum VAR BYTE ; si nbrenum = 1 then 1 seul numéro possible
coupure VAR bit;indique si une détection de coupure edf a été traité par SMS
venvoi VAR BYTE
rw VAR byte ; indique si on veut accéder aux entrées ou aux sorties
code VAR BYTE [4] ; code secret à 4 chiffres
codeb VAR BYTE [4] ; code reçu
phone_number VAR BYTE [11] ; numéro de téléphone en utilisation
phone_numberb var BYTE [11] ; numéro de téléphone unique défini à la config
TX VAR PORTB.7 ; envoie RS232 sur PORTB7
RX VAR PORTB.6 ; réception RS232 sur PORTB.6
debut var byte
fin var byte
initialisationa: ; programme d'initialisation au démarrage du pic
PORTA = $00
TRISA = %11110000 ; init des 4 sorties relais
PORTB = %111111 ; 4 entrée TOR et 2 jumpers donc 6 entrée
rw = 0
WRITE 46,"="
FOR i = 1 to 11 ; copie du numéro de téléphone en ram
call lecture_eeprom
phone_number[i] = valeur
NEXT i
FOR i = 12 to 15 ; copie du code secret en ram
CALL lecture_eeprom
code [i] = valeur
NEXT i
alerte = 0 ; initialisation des variables d'indication defaut
if PORTA.4 = 1 then setup ; si jumper 1 placé sur on mode config
pause 5000 ; on laisse le modem s'initialiser pendant 5 secondes
PAUSE 10
SEROUT TX,N9600,["AT+CPIN=3795",13] ; envoi du code pin
SERIN RX,N9600,["OK"] ; attente de la réponse
PAUSE 5000
call purge
goto reception_message
main: ; sous programme pricipal
If coupure = 0 then
call test_perte_reseau ; test de présence EDF
ENDIF
IF coupure = 1 THEN
CALL test_perte_reseau_retour
ENDIF
IF alerte > 0 then reponse ; si une alerte est apparu on envoi un sms
PAUSE 3000
attente_sms:
SERIN RX,N9600,["+CMTI: ",$22,"SM",$22,","],memo
SEROUT TX,N9600,["AT+CMGR=",memo,13]
goto lecture
retour:
PAUSE 4000
goto main
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; sous programmes de réception des sms
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
reception_message: ; on commence par lire les messages en mémoire
SEROUT TX,N9600,["AT+CMGL=",$22,"REC UNREAD",$22,13] ;liste les messages stockés
lecture:
SERIN RX,N9600,5000,retour,[",",34,"+"] ;
for i = 1 to 11
SERIN RX,N9600,phone_numberb [i] ;on mémorise dans la ram le numéro de tel
next i
SERIN RX,N9600,5000,main,[13,10],codeb [1],codeb [2],codeb [3],codeb [4]; test du code secret à 4 chiffres
SERIN RX,N9600,consigne,sms,ordre,valeur
FOR i = 1 to 4 ; vérification des 4 chiffres du code secret
if codeb [i] != code [i] then main
NEXT i
if PORTA.4 = 1 then lecture_suite ; test du cavalier num_unique
FOR i = 1 to 11 ; vérification des 11 chiffres du numéro de tel
IF phone_number[i] != phone_numberb[i] then main
NEXT i ; Ce test est fait si on souhaite que la carte ne
lecture_suite:
if consigne = "q" then commande_relais ; test de l'orde demandée
if consigne = "e" then lecture_entree_tor ; q pour les sortie et e pour les entrées
Bookmarks