Curso de programación de PIC en PICBasic Pro

:unsure: rey a mi me avienta basura... le hize igual que tu y no me manda nada...

definitavamente yo creo que el error esta en la configuracion de los baudios paridad polaridad etc..
 
No fijate yo lo cambie a 16780 que es = 2400 baud , sin paridad , invertido
pero tienes que enviarle Activar, osea con la primera letra en mayuscula y con 2 espacios y luego enter y veras como si activa el rele 1, te dejo el esquema modificado.

Edit: por cierto si quieres cámbiale el tiempo
ENVIAR:
PAUSE 10000
a 1000 para que sea mas rápida la respuesta
 

Adjuntos

  • pull1988 sms.rar
    28.4 KB · Visitas: 81
Última edición:
O si ya...

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
[COLOR="Red"]serout2 Tx,16780,[13] 'ponle esta linea tambien[/COLOR]

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

si ya vi porque me mandaba basura... fijate y el primer envio es basura...
 
a ya amigo reyvilla ahora te entendi lo de los fuses, te comento, yo no los utilizo porque yo quemo el PIC con el programa pickit 2 y utilizo el ICprog para activar o desactivar el Boden, MCRL, etc,etc, entonces ahi se genera una palabra de configuracion en hexadecimal, esa palabra la convierto en binario y ese codigo en binario lo introduzco en el pickit2, parece largo el proceso pero no lo es en realidad.

Ahora paso a indicarte como calculé los 9600 baudios con logica invertida:

la ecuacion para calcular los baudios con logica normal es: (1000000/9600)-20=84.1666...que cojiendo la parte entera es 84.
luego de eso se lo convierte a binario: 1010100 q para este caso es de 7 bits, despues se debe completar hasta el bit 13 con paridad nula y el bit 14 para debe ser 1 para q indique q es logica negada o invertida osea: 10000001010100 que corresponde al codigo decimal 16468.

Espero haberme explicado, sino culquier duda estaré presto a responderla.

Tu codigo ya activa el rele?



No fijate yo lo cambie a 16780 que es = 2400 baud , sin paridad , invertido
pero tienes que enviarle Activar, osea con la primera letra en mayuscula y con 2 espacios y luego enter y veras como si activa el rele 1, te dejo el esquema modificado.

Edit: por cierto si quieres cámbiale el tiempo
ENVIAR:
PAUSE 10000
a 1000 para que sea mas rápida la respuesta

Amigo reyvilla solo se activa con la palabra "Activar" y dos espacios???, entonces si queiro activar un segundo rele tendría que poner otra palabra ya que solo con esa palabra y dos espacios se activaria cualquier rele.
 
Última edición:
Lubeck a que se debe ese primer envio que es basura, ya que si lo vuelves activar si lo envía bien.

Amigo pull1988, ya me sospechaba algo asi mas me faltaba ese ultimo dato del arreglo de los últimos bit, gracias por el dato, y si activa el rele, pero a tu código ahora es que le falta para que sea una aplicación real, ya que si es un solo rele no habria problema pero si son mas, tendrías que enviar el dato del rele activado, como lo hice en la ultima linea, osea enviar lo que recibiste, o en tal caso verificar el pin del rele que este realmente activo, digamos que mandas activar el rele 1, en el receptor debes responder cual fue el dato recibido y si es correcto activas el rele correspondiente y luego indicas que fue activado.
 
Lubeck a que se debe ese primer envio que es basura, ya que si lo vuelves activar si lo envía bien.

Amigo pull1988, ya me sospechaba algo asi mas me faltaba ese ultimo dato del arreglo de los últimos bit, gracias por el dato, y si activa el rele, pero a tu código ahora es que le falta para que sea una aplicación real, ya que si es un solo rele no habria problema pero si son mas, tendrías que enviar el dato del rele activado, como lo hice en la ultima linea, osea enviar lo que recibiste, o en tal caso verificar el pin del rele que este realmente activo, digamos que mandas activar el rele 1, en el receptor debes responder cual fue el dato recibido y si es correcto activas el rele correspondiente y luego indicas que fue activado.

Amigo reyvilla sabes que a mi no se me activa le pongo Activar y 2 espacios tal como dijiste y nada sin resultados
 
Hola amigos, quisiera por favor alguien me ayudara intruyendome un poco sobre el siguiente tema que pongo a su consideracion:
Sucede que estoy por presentar mi proyecto de grado el cual consiste en automatizar mi departamento usando PICs; bueno basicamente lo que hace el PIC es recibir un SMS enviado desde cualquier movil y accionar diferentes cosas en base a reles, en otras palabras el PIC recibe un mensaje y este le manda una señal a un o varios reles y estos proceden abrise o cerrarse; el problema que se me ha presentado esque no puedo independizar los reles, osea si quiero activar el rele dos, primero debo activar el rele uno, porque en el codigo fuente esta primero la linea que contiene al rele uno, entonces quiero saber si hay la posiblidad de saltarme esas lineas de codigo para que no siga el orden logico o bien sea poner condicionantes para que si a determinada accion se active cualquier rele ya sea el uno el dos, el tres, etc.

Adjunto mi codigo fuente que este hecho en Basic, en microcode studio.

Cualquier ayuda m sería de gran utilidad.

Gracias

parce yo creo que el problema esta en igualar las variables, es decir, que mensaje se envia para activar el rele. supongamos que en el mensaje vas a enviar un numero cualquiera entonces tenes que guardar ese valor en una variable y luego decirle al programa si esa variable es igual al numero recibido entonces 1 a pin.


x var byte

if x = 24 then

porta.0 = 1

endif.

he leido algo de comandos AT, la verdad es que no le he puesto mucha atencion el serin guarda el valor entrante en una variable, esa es la variable a la que tenes que condicionar.

pillate este ejemplo a ver si te sirve:

INCLUDE "modedefs.bas" ;incluyen los modos de comunicación
@ device XT_OSC ;cambia a oscilador XT en el IC-Prog
led VAR portb.7 ;nombre led al puerto b.7
dat VAR BYTE ;variable de almacenamiento de 255
num VAR BYTE ;variable para almacenar el contador
num=0 ;contenido inicial para la variable num
GOSUB ledr ;ir a leds para saber si ya arrancó el PIC
Inicio:
SERIN portb.0,T2400,dat ;esperar el dato y guardarlo en dat
IF dat = "C" THEN contar ;si dat es una C empiece a contar
GOSUB ledr
GOTO inicio ;ir a esperar el siguiente caracter
contar:
HIGH led ;led sólo encendido indica enviando datos
SEROUT portb.1,T2400,[#num,"-"] ;enviar el contenido decimal de la variable num
;seguido de un signo menos
num=num+1 ;incrementar la variable 1 x 1
PAUSE 1000 ;esperar 1 s
GOTO contar ;ir a subrutina contar
ledr: ;subrutina ledr
HIGH led
PAUSE 200
LOW led
RETURN
END
 
Última edición:
Bueno antes que nada confirmado ya se me activo el rele tuve que cambiarle el al seri2 le corresponde el Tx, que es el puertob.1 y serout2 RX que es el puerto b.0 tu le tienes al reves amigo reyvilla, gracias por ese codigo mañana lo reviso para ya continuar haciendolo con mas reles pero por el momento se me ocurre lo siguiente.
Para el rele uno es Activar 1 y un enter si estamos a traves de un hyperterminal, tal cual esta escrito ahi, por lo tanto para el rele dos deberia ser Activar 2 diciendole que si B0=2 active el rele 2
 
Si de echo por eso te dije que hay que estar pendiente recuerda que serout es una salida por lo tanto correponde a tx y de igual forma para rx aqui un video de el codigo y como funciona este activa hasta 5 rele:

 
Bueno lo importante esque poco a poco vamos depurando esta situacion, ahora lo malo esq con cualquier numero tu puedes activar el mismo rele, si pensamos en un caso real, estaria mal q mandemos un SMS con la palabra Activar 2 por ejm. y se active unicamente el rele 1, era por esa razon que yo al principio le puse B0="1"para que solo me reconociera el 1 y asi hacer una difrenciacion de los reles, osea si quieria el rele tres por ejm B0 tendria q ser igual a "3" para que cuando ponga Activar 3 solo se active el rele 3, eso deberiamos depurarle amigos, el día de mañana continuaré trabajando en eso puesto que para mi ha sido el final en este día, ha sido muy sacrificado pero muy productivo este día, les agradezco por su interes, una buena noche
 
Si te fijas bien en el video activo dependiendo del mensaje una salida del puerto A, si es 1 activa el pin 0 del puerto A, si el mensaje es 2 activa el pin 1 del puerto A y asi sucesivamente chequea bien y veras;)

El codigo es este:
Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_ON       
@ 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 REL2 = PORTA.1
SYMBOL REL3 = PORTA.2
SYMBOL REL4 = PORTA.3
SYMBOL REL5 = PORTA.4
SYMBOL REL6 = PORTA.5

SYMBOL RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE
TX = 1
'serout2 Tx,16780,[13] 'ponle esta linea tambien

INICIO:
SerIn2 RX,16780,[WAIT("ACTIVAR"),SKIP 2,DEC B0]

SELECT CASE B0

CASE 0
serout2 Tx,16780,["ERROR DE COMANDO"]
GOTO INICIO
CASE 1
HIGH REL1
PAUSE 1000
GOTO ENVIA2
GOTO INICIO

CASE 2
HIGH REL2
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
CASE 3

HIGH REL3
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
CASE 4

HIGH REL4
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
CASE 5

HIGH REL5
PAUSE 1000
GOTO ENVIA2
GOTO INICIO
end select

GOTO INICIO
ENVIA2:
serout2 Tx,16780,["AT+CMGF = ",#B0,13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
GOTO INICIO
 
No fue mucho casi todo es copiar y pegar y colocar un select case y listo, claro esta ese seria la base del programa como tal, ya que falta la parte de desactivar y la parte de verificación, para saber si esta activo o no el rele
 
si tienes razon pero una pregunta para que sirve esa linea de "ERROR DE COMANDO"?
Por cierto muy util ese select, se me ocurre que para desactivar solo se coloque en la rutina INICIO un serin2 con la palabra desactivar y hacer otro select para desactivar los 5 reles
 
Última edición:
Es una opción que se me ocurrió, en caso de recibir un comando no deseado o que no este dentro de los comandos normales, en fin puedes quitarlo, y bueno eso seria una idea para empezar ya lo demas esta de parte de cada quien ahora espero tu gran aporte cuando lo termines:cool:
 
Prueben este....
Código:
@ DEVICE PIC16F628A         
@ DEVICE INTRC_OSC_NOCLKOUT 
@ DEVICE WDT_OFF        
@ DEVICE PWRT_OFF       
@ DEVICE MCLR_ON       
@ DEVICE BOD_OFF        
@ DEVICE LVP_OFF        
@ DEVICE CPD_OFF        
@ DEVICE PROTECT_OFF
 
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 RX = PORTB.0   'RX ENTRADA 
SYMBOL TX = PORTB.1   'TX SALIDA
B0 VAR BYTE
TX = 1
serout2 Tx,16780,[13] 'ponle esta linea tambien

INICIO:
SerIn2 RX,16780,[WAIT("ACTIVAR"),SKIP 2,DEC B0]

PortA=PortA+DCD B0

serout2 Tx,16780,["AT+CMGF = ",#B0,13]
PAUSE 1000
serout2 Tx,16780,["AT+CMGS=",34,"092661649",34,13]
PAUSE 1000
SEROUT2 Tx,16780,["R1 activado ",#B0,26]
GOTO INICIO

empieza en rele 0 osea "activar 0"
 
Atrás
Arriba