desktop

Curso de programación de PIC en PICBasic Pro

Quería ver si los ponía a prueba pero aun no se como ya que no tengo un sistema para la recepción de SMS, que modulo uso o que materiales aparte del pic necesito?


:unsure: creo que ya voy entendiendo...

no solo es con los mensajes SMS es una comunicacion serial asincrona normalita y corriente...
la ventaja es que supuestamente utiliza menos codigo... pero suponiendo que utiliza menos codigo algo debe estar sacrificando no?, como algun cequeo de recepcion o envio.... intentare hacer una prueba.. o si gustas tu tambien hazla como si fuera el Serin y serout....

con respecto a como mandar mensajes por SMS, solo necesitas un telefono y tener los codigos AT del telefono, modem o modulo... y conectas como si conectaras pic a pic por usart...
lo dificil es encontrar un telefono que se conecte con el puerto serial porque ya la mayoria son por bluetooth y USB, yo lo hice con un Nokia 3100 y la PC el problema fue que nunca encontre los codigos del Nokia, me aburrio y lo deje.... ahora lo interesante es que venden modulos Bluetooth en 20usd aprox y puedes comunicar cualquier pic con cualquier telefono que tenga bluetooth..

s_MLM_v_O_f_72248066_933.jpg
 
Última edición:
Amigo ludbeck, estoy por utilizar un modulo gsm marca ZTE ME 3000, que ya viene con el puerto serial, esta por llegarme en los proximos dias de esta semana.

Con respecto a la simulacion en proteus, no la tengo pues yo soy mas de implementarlo directamente en el protoboard

Amigo ludbeck, estoy por utilizar un modulo gsm marca ZTE ME 3000, que ya viene con el puerto serial, esta por llegarme en los proximos dias de esta semana.

Con respecto a la simulacion en proteus, no la tengo pues yo soy mas de implementarlo directamente en el protoboard



Fijate este codigo:

Código:
@ device PIC16F72 , xt_osc, wdt_off, pwrt_on, protect_oN
Include "MODEDEFS.BAS"          ' Include Shiftin/out modes
DEFINE DEBUG_REG PORTC
DEFINE DEBUGIN_REG PORTC
DEFINE DEBUGIN_BIT 7
DEFINE DEBUG_BIT 6 
DEFINE DEBUG_MODE 0 		' 1 = Inverted (w/o max) , 0 = true (with max)
DEFINE DEBUGIN_MODE 0
DEFINE DEBUG_BAUD 9600
'-----------------------------------------------------------------
' HARDWARE DEFINES
'-----------------------------------------------------------------
' Define LCD pins
Define Lcd_dreg Porta
Define Lcd_dbit 0
Define Lcd_rsreg Porta
Define Lcd_rsbit 4
Define Lcd_ereg Porta
Define Lcd_ebit 5
'-----------------------------------------------------------------
Define Osc 4                   ' We're using a 4 MHz oscillator
'-----------------------------------------------------------------
    Adcon1 = 7                     ' Set PORTA DIGITAL
    OPTION_REG.7 = 0               ' DISABLE INTERNAL PULLUPS
    Trisa = %00000000              ' SETS ALL PORTA PINS TO OUTPUT
    Trisb = %00000000              ' ALL OUTPUT
    Trisc = %00001011              ' 6 Pins - LCD and 2 Pins RF Module
'-----------------------------------------------------------------    
RELAY1      VAR PORTB.0     ' RELAY 1
RELAY2      VAR PORTB.1     ' RELAY 2
RELAY3      VAR PORTB.2     ' RELAY 3
RELAY4      VAR PORTB.3     ' RELAY 4
RELAY5      VAR PORTB.4     ' RELAY 5
RELAY6      VAR PORTB.5     ' RELAY 6
RELAY7      VAR PORTB.6     ' RELAY 7
RELAY8      VAR PORTB.7     ' RELAY 8
LED         VAR PORTC.4     ' LED (SINK)
RELAY       VAR BYTE        ' RELAY NUMBER
MYDATA      VAR BYTE        ' GENERAL PURPOSE DATA VARIABLE
INDEX       VAR BYTE        ' SMS INDEX NUMBER
I           VAR BYTE        ' GENERAL VARIABLE
Pause 500                   ' Wait .5 second
'-----------------------------------------------------------------    
B2400   Con 16780           ' Inverted 2400 baud for SERIN2

    HIGH LED 
    PORTB = 0		    ' TURN OFF ALL RELAYS

    Lcdout $fe, 1,   "SMS CONTROL"  ' Send to LCD
    Lcdout $fe, $C0, "SMS TEST C5"  ' Second Line
    PAUSE 2000

    ' GOSUB OLD
LOOP:

    Lcdout $fe, 1,   "WAITING 4 SMS"  ' Send to LCD
    DEBUGIN [WAIT("+CMTI:"), SKIP 7 , DEC INDEX]
    Lcdout $fe, $C0, "SMS RX: " , DEC INDEX ' Second Line
    PAUSE 5000
    Lcdout $fe, 1,   "READ MSG "  ' Send to LCD
    DEBUG "AT+CMGR=", DEC INDEX, 13
    'DEBUGIN [WAIT("+CMGR:"), SKIP 51 , DEC MYDATA]
    DEBUGIN [WAIT("+CMGR:"), SKIP 53 , DEC MYDATA]
    Lcdout $fe, 1,   "MYDATA: " , DEC MYDATA   ' Send to LCD
    PAUSE 3000
    
    SELECT CASE MYDATA
    
    CASE 20
        Lcdout $fe, 1,   "RELAY 2"
        Lcdout $fe, $C0, "ON" 
        
    CASE 21
        Lcdout $fe, 1,   "RELAY 2"
        Lcdout $fe, $C0, "OFF" 
    
    CASE 10
        Lcdout $fe, 1,   "RELAY 1"
        Lcdout $fe, $C0, "ON" 
        
    CASE 11
        Lcdout $fe, 1,   "RELAY 1"
        Lcdout $fe, $C0, "OFF" 
        

    CASE 30
        Lcdout $fe, 1,   "RELAY 3"
        Lcdout $fe, $C0, "ON" 
        
    CASE 31
        Lcdout $fe, 1,   "RELAY 3"
        Lcdout $fe, $C0, "OFF" 

    CASE 40
        Lcdout $fe, 1,   "RELAY 4"
        Lcdout $fe, $C0, "ON" 
        
    CASE 41
        Lcdout $fe, 1,   "RELAY 4"
        Lcdout $fe, $C0, "OFF" 


    END SELECT
    
    PAUSE 3000
    Lcdout $fe, 1,   "DELETE SMS MSG"
    Lcdout $fe, $C0, "#:" , DEC INDEX
    DEBUG "AT+CMGD=", DEC INDEX, 13
    PAUSE 3000

GOTO LOOP

END

Lo saque de este Link: http://www.picbasic.co.uk/forum/showthread.php?t=3765
Según tengo entendido es para el control de relays a traves de un SMS, por eso mi duda al respecto con esos comandos DEBUG y DEBUGIN :confused:
Quería ver si los ponía a prueba pero aun no se como ya que no tengo un sistema para la recepción de SMS, que modulo uso o que materiales aparte del pic necesito?

Amigo reyvilla tu sabes para que pone skip 53, osea yo se que skip es saltar un numero determinado de caracteres, pero porque? especificamente salta 53 en este ejemplo?
 
Última edición:
Oye la verdad no se es primera vez al igual que lubeck que le presto atencion a estos comandos la verdad nunca los he usado, pero debe referirse a una cadena de caracteres que esta antes del mensaje, en ese caso para ese país y empresa de telefonica en aprticular :confused: la verdad que no estoy seguro
 
pero porque? especificamente salta 53 en este ejemplo?
DEBUGIN [WAIT("+CMGR:"), SKIP 53 , DEC MYDATA]

Porque el pic va a esperar a que lleguen los caracteres +CMGR: y despues discrimina 53 caracteres, y despues recibe un byte y lo guarda en mydata que es lo que necesita el que lo programo...

Ejemplo:
el modem manda al pic.:
"+CMGR:Hola estoy mandando un dato para que prenda el Relay 1"

esto es el dato que espera para proceder..."+CMGR:"
estos son 53 caracteres que no sirven..."Hola estoy mandando un dato para que prenda el Relay "
esto es el relay que guarda en mydata..."1"

Rey... ya echaste a andar ese ejemplo???? yo no puedo :cry:



YAAAAAAAAAAAAAA PUUUUDEEEEE :LOL:


esta bien fregon ese metodo para comunicacion serial... muy bueno... muy bueno...
 
Última edición:
No aun no me he puesto de verdad,:aplauso: y lo hiciste con el código que te coloque con el mismo pic ?
De que se trata, yo no pude deducir las conexión ya que tiene unas definiciones que no entendí muy bien tienes un esquema para armarlo aquí y ver de que se trata?
como funciona ?
 
mira lasimulacion, la puse con el 877A pero puede ser cualquiera porque es por software... y use el virtualterminal...
en el virtual pones "+CMTI:12345678" sin las comillas y enter despues pasa al siguiente paso...
si te fijas discrimina el 1234567 y pone el 8....
 

Adjuntos

  • Debug.rar
    70.9 KB · Visitas: 121
Si ya vi esta bien bueno, eso facilita la cosa ya que no hay que inventar mucho ya con estoy tendrías lo que quieres, cambiando un poco el código claro esta, ahora voy hacer mas pruebas a ver que se me ocurre y a ver si aprendo mas de este comando. Por cierto lubeck si te fijaste en los DEFINE, a que se refiere cada uno o tienes alguna idea de que pueda ser?

Edit: Ya, que torpe, es igual a las definiciones de un ldc, la diferencia es que aqui defines cual es TX y RX, por otro lado, puedes tener dos modos uno de entrada y otro para salida, muy interesante esto ya que no tiene esas limitaciones como el serin y el serout
 
Última edición:
Estos?

si te refieres a esos es algo parecido a como se usa el LCD...
Código:
DEFINE DEBUG_REG PORTC 'Este y....
DEFINE DEBUG_BIT 6         ' este es para decir que la salida del Debug (Salida Serial) seria por el puerto RC6
DEFINE DEBUGIN_REG PORTC  'Este y....
DEFINE DEBUGIN_BIT 7     ' este es para decir que la entrada del DebugIn (entrada serial) seria por el puerto RC7
DEFINE DEBUG_MODE 0 		' 1 = Inverted (w/o max) , 0 = true (with max) 
DEFINE DEBUGIN_MODE 0  'estos son el modo invertido si no se usa el max232 y no invertido si  se usa
DEFINE DEBUG_BAUD 9600  'la velocidad en baudios
'-------------------------
 
Última edición:
Exacto, ahora DEBUG es salida y DEBUGIN es la entrada, osea puedes tener dos modos diferentes con los mismo baud de velocidad, digamos entrada normal o verdadera, y salida invertida o falsa.
 
sip... es muy parecido al SEROUT (debug) y SERIN (DEBUGIN) la diferencia es que con el serin serout cada que los utilizas especificas el pin y la velocidad, y aca lo defines desde el principio del programa....

otra ventaja es eso del Wait, SKip,WaitSTR etc, que no se si recuerdas que mi amigo maxtorcampos solicitaba algo asi.... esto le hubiera servido de lujo... :LOL:

bueno... ni hablar... hasta ahora lo descubrimos... :D
 
Amigos, partiendo de la muy buena explicacion de ludbeck referente al comando SKIP, pongo a consideracion el siguiente codigo, el cual gracias espera (WAIT) a la palabra "Activar", salta (SKIP) 2 caracteres y despues de establecer la condicionante con el IF-THEN que si la variable tipo byte (B0) sea "1", active el rele, bueno pues el problema esque no activa el rele, pero lo curioso esque si pasa a la siguiente linea, que para el caso es el inicio de la subrutina ENVIAR:, que es simplemente la confirmacion de la activacion del rele mediante comandos AT. Esto lo probe con el terminal del microcode y evidencie lo antes explicado.

Entonces reitero el problema el cual es que el rele no se esta activando, por favor revisenle el codigo y digame cual es el error que estoy cometiendo y la posible solucion.

Muchas gracias

Código:
include "modedefs.bas"
define OSC 4
CMCON=7
REL1 VAR PORTA.0
RX VAR PORTB.0
TX VAR PORTB.1
B0 VAR BYTE

INICIO:
    SerIn2 TX,16468,[WAIT("Activar"),SKIP 2,DEC B0]
    IF B0="1" THEN
    HIGH REL1
    ENDIF
ENVIAR:
    PAUSE 10000
    serout2 Rx,16468,["AT+CMGF=1",13]
    PAUSE 50
    serout2 Rx,16468,["AT+CMGS=",34,"092661649",34,13]
    PAUSE 50
    SEROUT2 Rx,16468,["R1 activado",26]
    pause 50
GOTO INICIO
 
Última edición por un moderador:
:unsure: el serin2 y el serout2 es la combinacion del uso del Serin serout y del debug debugin...

ya aprendi algo nuevo hoy....:D

amigo pull1988, te recomiendo muy ampliamente que utilices el proteus.... o que pongas el esquema... honestamente a mi me da flojera siquiera tratar de entender que rayos quieres que haga.. con la simulacion ya te estuviera intentando ayudar...:D
 
jajajajaja ok amigo ludbeck voy a poner un esquema enseguida lo hago y si el serin2 y el serout2 son muy completos y me han ayudado a resolver muchos problemas de comunicacion serial, sobretodo el WAIT
 
Ya somos dos lubeck:D, concuerdo contigo hoy aprendimos algo nuevo, y conrespecto al esquema amigo Pull1988 te iba a decir algo similar, ya que no contamos con el circuito que tu tienes para hacer las pruebas y no hay mejor manera que un esquema en proteus para probarlo.;)
 
Bueno amigos ahi lo tienen el esquema en proteus, disculpen cualqueir error, puesto q yo no utilizo mucho el simulador, prefiero hacerlo en el protoboard directamente. Les explico brevemente los pines del PIC:
el puerto A.0 es la salida al rele mediante el transistor 2N2222.
los purtos B.0 y B.1 son RX y TX respectivamente, del cable serial.
los puertos A.6 y A.7 son para el Oscilador de 4MHz, no lo puse puesto q no lo encontré, pido disculpas por mi ignorancia para con el simulador.

Esos son los puertos q utilizo hasta el momento prentendo utilizar los puertos desde el A.0 hasta el A.5 para las salidas a los reles.

Cualquier inquietud estaré atento para esclarecerselas.

Muchas gracias
 

Adjuntos

  • Esquema.rar
    11.6 KB · Visitas: 101
Amigo Pull1988, unas recomendaciones si quieres tomarlas, si bien esta demostrado, hablo por mi propia experiencia, las simulaciones en proteus son yo diria un mas de un 70% confiables, eso quiere decir que si corre en el proteus tienes un 70% si no mas de probabilidades de que funcione en la practica real, aparte del ahorro de tiempo y coste, si conectas algo mal o configuras o programas mal en el proteus, fácil lo corriges de manera rápida y ya, en cambio en la practica real puede costarte mucho tiempo aparte de dinero, por otro lado, en la programación para garantizar un mejor funcionamiento, las configuraciones de los fuses y entradas y salidas del microcontrolador, ya que de no hacerlo puede causarte mas que un dolor de cabeza, lo digo por que me paso mucho. Ya terminando con esto, revise y verifique tu código, lo simule y corregí. Solo falta declaración de fuses y entradas y salidas, y en la parte de serin2, tu estas transformando en dato en decimal por lo tanto debes tratarlo como decimal y no como dato ascii o AT. Otra cosa desde hace un tiempo yo para estar seguro y diferencias que es variable y que es un pin, utilizo el comando symbol para renombrar los pines, esto es opcional.
El codigo si funciona solo falta lo que te dije revisa y me avisas.;)
 
amigo reyvilla muchas gracias x tu respuesta, sabes q en lo personal no utilizo fuses, bueno de hecho asi me enseñaron en la universidad y me he acostumbrado a eso, pero tal ves tu me puedes decir q fuses me hacen falta para ponerlos; con respecto a la parte del seri2 en cual tu mencionas que lo utlizo como decimal, pues efectivamente tienes razon, pero en ese caso que podria poner?.

Muchas gracias por tus sugerencias y consejos, los tendré muy presentes, sino es mucha molestia me gustaria que pongas el codigo para ver cuales fueron mis errores y que me falta.
 
Última edición:
Ok el codigo lo modifique para que trabaje a 2400 invertido, ya que no se calcular el que tu hicistes que es 16468, trate de calcularlo pero no pude...Dime como lo calculaste :confused:

Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_OFF       
@ DEVICE BOD_OFF        
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF        
@ DEVICE PROTECT_OFF
 
include "modedefs.bas"
DEFINE OSC 4
CMCON=7
TRISA = %00000000 'todo el puerto a como salida
TRISB = %00000001 'todo el puerto b como salida menor portb.0 es entrada
SYMBOL REL1 = PORTA.0
SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE


INICIO:
SerIn2 RX,16780,[WAIT("Activar"),SKIP 2,DEC B0]
IF B0 = 1 THEN
HIGH REL1
REL1 = 1
PAUSE 100
ENDIF
ENVIAR:
PAUSE 1000
serout2 Tx,16780,["AT+CMGF=1",13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
PAUSE 1000
GOTO INICIO
 
Atrás
Arriba