Uso de un celular GSM con PIC o PC

Creo que el mejor es el c261 porque haces la conexion con una fichita de aurigular, re facil, pero es medio carito a comparacion de los otros
 
De verdad que no se toman la molestia de leer, biker2k3 en la página anterior o dos anteriores tengo publicado un archivo de la sony ericsson donde se detallan todos los modelos que soportan los comandos AT así como los comandos en general. Para las demás compañias supongo habrá que investigar en sus páginas.
Saludos
 
yo me hago una pregunta porque usan convcersores de tension cuando conectan los celulares al pic si los pic pueden funcionar pefectamente con la misma tension del celu jeje, es mas yo pruebo mis circuitos con baterias de celular a veces
 
De verdad que no se toman la molestia de leer
en la página anterior o dos anteriores tengo publicado un archivo de la sony ericsson donde se detallan todos los modelos que soportan los comandos AT así como los comandos en general.
:LOL: Sin comentarios Meta.
Cuando me interesó el tema me tuve que leer todas las páginas para entender todo lo que se mencionaba y de hecho fue así como descubrí que algunos links de información ya estaban caducados, me dió mucha flojera pero ni modos.
biker2k3, supongo que el circuito lo usan por seguridad, ya que el PIC tranquilamente maneja los 3V aún alimentado a 5V, pero el Cel si podría sufrir daños al intentar introducir una señal superior a los 3V. Un remedio rápido sería solo usar una resistencia limitadora entre el TX del PIC y el RX del Cel o como bien mencionas alimentar al PIC con el Cel, si el PIC soporta voltajes menores a 5V.
Saludos
Solo edito para poder resuscribirme a este tema jejej
 
Última edición:
Meta no es por pesado pero te recomiendo ampliamente leer este hilo de forma completa para que te des una idea aproximada de lo que son los comandos PDU , como decodificarlos , tambien que lo que son los comandos at y como utilizarlos.

Te mando un saludo !
 
bueno por fin logre meterme de nuevo al foro!!!!!!!!!!!!
mis saludos a todos

ericlarva tenias toda la razon mis problemas estavan en la configuracion de los fuses, todo arreglado ya soy un crac del lenguaje C jejeje.
 
Que bueno kapotik me alegro por ti, te aconsejo igual que cuando puedas entres a la sección de ayuda del PICC y cheques todas las librerías y funciones que maneja. Son muchas y variadas e incluso incluyen ejemplos de aplicación que te ayudan a comprender mejor su funcionamiento.
Como comentario, este compilador tiene un leve detalle al querer programar cualquier PIC12 y creo que igual para aquellos micros que poseen reloj interno, cuando quieres habilitar este reloj con el FUSE el compilador realiza un llamado a la última posición de la memoria y se queda en un lazo infinito que obviamente no permite ejecutar el programa que hayas realizado. Tiene dos posibles soluciones, una que no uses el oscilador interno y la otra que pongas una instrucción de RETURN o RETLW en esa posición para que el PIC siga ejecutando el resto del programa.
Saludos
 
Gracias por el aporte ericklarva.

Quisiera saber si alguien trato de aser funcionar el codigo para interpretar un mensaje de ryzi ?. yo por mi parte no logro que me lea el mensaje.Si lo puedo hacer por hipertelminal,pulsando una tecla activo una salida en el pic.

Ryzi dice en su explicacion que el mensaje empieza en el caracter nº27 pero si se fijan el empieza por ver si hay una "K" en el caracter nº26

if (c26=='K') // CHEQUEO SI EXISTE ALGUN MENSAJE DE ACCION O RESPUESTA

y luego sigue chequeando el caracter nº 89 y nº90 no logro entender por que salta del nº26 al nº89

if (c89=='A') // COMANDO *AE* ACTIVAR ELECTROVALVULA
{
if (c90=='E')
{
delay_us(100);
output_high(pin_B0);
output_low(pin_B2);output_high(pin_C1);
delay_us(100);
}
}

disculpen que lo edite no se como citar

saludos
 
Última edición:
Lo que sucede es que rizy envía un mensaje codificado según las necesidades de el, es decir, esa "k" el la envía como determinante de algún proceso, no significa que sea "norma" para cualquier mensaje. El hecho de saltar hasta las variables "c89" debe ser igual por lo mismo, es parte de su programa. Esperemos que el todavía siga por aqui para que te lo aclare aún más, sino pues espero que mi observación sea correcta.
Y para citar usa el botón en la esquina inferior derecha que dice "quote".
Saludos
 
La forma que propone rizi de decodificar el mensaje es completamente válida pero hay que saber exactamente que es lo que está trasmitiendo el PIC y el teléfono en cada momento para ver que no hayan caracteres basura.
 
gracias muchachos ya logre entender el codigo!!!
bueno ya tengo listo el envio y para recivir solo que estoy trabado en una tontera, como e tenido que aprender a programar en c, hay algunos comandos que no los manejo muy bien.
y lo que quiero saber es cual es el equivalente en C a BTFSC en asembler , osea testear algo y si no es que salte?

Gracias saludos
 
lo puedes literalmente hacer de cualquier forma, la más común es con la sentencia "if-else":
if( input( PIN_A1 ) );
else;
Otra también puede ser:
do{
}while( input( PIN_A1 ) );
Otra más:
switch( input( PIN_A1 ) );
case 0: break;
case 1: break:
default: break;
Etc, etc, etc.
Lo más importante es que cheques el codigo generado en assembler por el compilador para ver si hizo lo que tu querías, porque a veces solo por poner una instrucción antes o después cambia por mucho el código. Estp ya es a base de pruebas y cada quien trabaja como mejor crea, debes generar tu propio estilo de trabajo.
Saludos
 

Aqui les envío un video del módulo, un poco más reducido, que integro el celular con la board. La configuración se hace todo por mensaje de texto, logrando así un comando remotamente completo.

 
Exelente eenrique pensas dar algunas pautas de como realizaste el proyecto como por ejemplo que método utilizas para recibir los mensajes y como los decodificaste.
Por lo demás excelente proyecto !
 
buenas, como estan, nuevamente aki estoy solicitando una manito con mi codigo.
les cuento, lo que quiero hacer es que con una llamada perdida al modulo este la reconosca y aga algo determinado.Bien con el comando AT+CLIP se pone el modem en identificador de llamada, usando el metodo de ryzi para recivir en el pic atraves del modem, logro que llamando al modulo este aga algo.
El problema es que cuando no recibe nada necesito que el codigo salte a otra instruccion y aga otra cosa por ej. prender un led. como veran el codigo no "avansa" hasta que reciva algun caracter y no se como hacer para que chequee que si no recive caracter salte a otro lado.

Gracias
Saludos

codigo:

Código:
#include "C:\Documents and Settings\Administrador\Mis documentos\modulo\FINAL\55\55.h"

//DEFINICION DE CONSTANTES 
//************************ 
   int n=0x22;    // CODIGO ASCII " 
   int cont=0; 

//DECLARACION DE VARIABLES 
//************************* 
   char c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,c10=0,c11=0,c12=0,c13=0,c14=0,c15=0,c16=0,c17=0; 
   char c18=0,c19=0,c20=0,c21=0,c22=0,c23=0,c24=0,c25=0,c26=0,c27=0,c28=0,c29=0,c30=0,c31=0,c32=0,c33=0; 
   char c34=0,c35=0,c36=0,c37=0,c38=0,c39=0,c40=0,c41=0,c42=0,c43=0,c44=0,c45=0,c46=0,c47=0,c48=0,c49=0; 
   char c50=0,c51=0,c52=0,c53=0,c54=0,c55=0,c56=0,c57=0,c58=0,c59=0,c60=0,c61=0,c62=0,c63=0,c64=0,c65=0; 
   char c66=0,c67=0,c68=0,c69=0,c70=0,c71=0,c72=0,c73=0,c74=0,c75=0,c76=0,c77=0,c78=0,c79=0,c80=0,c81=0; 
   char c82=0,c83=0,c84=0,c85=0,c86=0,c87=0,c88=0,c89=0,c90=0; 
//INICIO DE PROGRAMA 

VOID main(VOID) { 
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);

 //PROGRAMA PRINCIPAL 
 
   WHILE (TRUE) {
     
    
    c1=0,c2=0,c3=0,c4=0,c5=0,c6=0,c7=0,c8=0,c9=0,c10=0,c11=0,c12=0,c13=0,c14=0,c15=0,c16=0,c17=0; 
    c18=0,c19=0,c20=0,c21=0,c22=0,c23=0,c24=0,c25=0,c26=0,c27=0,c28=0,c29=0,c30=0,c31=0,c32=0,c33=0; 
    c34=0,c35=0,c36=0,c37=0,c38=0,c39=0,c40=0,c41=0,c42=0,c43=0,c44=0,c45=0,c46=0,c47=0,c48=0,c49=0; 
    c50=0,c51=0,c52=0,c53=0,c54=0,c55=0,c56=0,c57=0,c58=0,c59=0,c60=0,c61=0,c62=0,c63=0,c64=0,c65=0; 
    c66=0,c67=0,c68=0,c69=0,c70=0,c71=0,c72=0,c73=0,c74=0,c75=0,c76=0,c77=0,c78=0,c79=0,c80=0,c81=0; 
    c82=0,c83=0,c84=0,c85=0,c86=0,c87=0,c88=0,c89=0,c90=0; 
    delay_ms(500);

    printf("AT+CLIP=1\n\r");    // inicia identificador de llamada
     DELAY_MS(1000); 
   
    c1=getch();c2=getch();c3=getch();c4=getch();c5=getch();c6=getch();c7=getch();c8=getch();c9=getch();c10=getch();  
    c11=getch();c12=getch();c13=getch();c14=getch();c15=getch(); c16=getch();c17=getch();c18=getch();c19=getch();
    c20=getch();c21=getch();c22=getch();c23=getch();c24=getch();c25=getch();c26=getch();c27=getch();c28=getch();
    

    //******************************************************************************* 
    //******************************************************************************* 
     if (c25=='6')   // IDENTIFICO Nº
         {
     delay_us(100); 
        
    //******************************************************************************* 
    //******************************************************************************* 
      
    if (c26=='2')   // IDENTIFICO Nº 
         {
     delay_us(100); 
       
    //******************************************************************************* 
    //******************************************************************************* 
    
    if (c27=='4')   // IDENTIFICO Nº
         {
     delay_us(100); 
         
    //******************************************************************************* 
    //******************************************************************************* 
    
    if (c28=='9')   // IDENTIFICO Nº 
{
      output_high(pin_B2); //
        delay_us(500);   
     
    //*******************************************************************************
    //si el Nª entrante es el correcto pone un alto en salida B2
    //
    // 
    //******************************************************************************* 

        }
        }
          }
         }
        }

}
 
Última edición por un moderador:
Hola kapotik, es muy generalizado lo que pides ya que existen un sin número posible de soluciones. Lo que sí puedo comentarte es que una solución rápida sería trabajar un temporizador en modo interrupción que te genere una constante de tiempo que tu puedas manipular y de esta forma controles lo que quieres. Es de preferencia contar con un PIC que incorpore el TIMER1, es más cómodo de trabajar:D.
Yo en lo personal trabajaría con la interrupción del RX y con un buffer de almacenamiento, además del temporizador para saber si el modem respondió en determinado tiempo. Otra sería enviar los datos al cel, adherir un delay de 1ms@9600bps para que el modem responda y leer RXBUFF no la bandera de recepción.
Son variadas las soluciones, dependiendo de que tan complejo quieras el control.
Un ejemplo, tal vez, sería:
Código:
struct{
boolean  TEND: 1; //Bandera que indica cuando el tiempo ha terminado
boolean  TON : 1; //Bandera de activación del temporizador
boolean  NA   : 2; //Bits no usados( puedes implementarlo para algo )
boolean  TIME: 4; //Tiempo = TIME * 15ms. De 5ms a 75ms( Puedes variarlo a tu gusto)
}FLAGS
// Interrupción para el timer0 o rtcc( aproximádamente 5ms@4Mhz )
#int_RTCC
RTCC_isr(){
  set_rtcc( 100 );                   // 5ms de carga
  if( FLAGS.TON ){
    if( !FLAGS.TIME ){              // Checamos que el tiempo no sea 0
       FLAGS.TON = 0;               // Si es así deshabilitamos el tiempo
       FLAGS.TEND = 1;            // Habilitamos la bandera de finalización
    }else    FLAGS.TIME--;      // Si es mayor  0 Decrementamos en 1 y salimos
  }
}

void main(void){

 set_rtcc( 0 );
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
 enable_interrupts(INT_RTCC);
 enable_interrupts(GLOBAL);
 FLAGS = 0;                         //Borramos la bandera para no generar errores
 //etc.....
 do{
    //etc...
    FLAGS.TIME = 1;                  //Esperamos 5ms
    FLAGS.TON  = 1;                  //Activamos el tiempo
    while(!kbhit()&&FLAGS.TEND);//Esperamos a recibir o finalizar el temporizado
    if( FLAGS.TEND ){                //Checamos si fue el fin del tiempo
      FLAGS.TEND = 0;               //Si es así borramos la bandera
      //etc...tratamos el error      //imlementamos alguna rutina para el error
    }else                                 //Si no fue el tiempo, es el caracter recibido
    VARXX = getc();                  //Guardamos la variable y continuamos el programa
  //.....

 }while( TRUE );
Espero esto te sea de utilidad, cualquier duda igual consulta en el PICC ahí te detallan más el operador "struct".
Igual hay esta opción, pero no se que tan bien funcione y como implementarla:
Código:
#use rs232 (options)
 TIMEOUT=X
  To set the time getc() waits for a byte in milliseconds.  If no  character comes in within this time the RS232_ERRORS is set to 0 as well as the  return value form getc().  This works for both UART and non-UART ports.
Saludos
 
Última edición:
Hola compañeros, he estado siguiendo muy de cerca este post y aun siendo un principiante solo he consigiendo algunos avances:

-Comunicacion PC > celular con los telefonos Motoroloa V3 y el Nokia 5300 por USB.
-Desarrollo del codigo en CCS para enviar sms y realizar llamada basado en el pic 16F628A.
-Simulacion en Proteus obteniendo correctamente los codigos AT en la hyperterminal.

Sin embargo al realizar la prueba fisicamente no obtengo ningun resultado con el motorola V3, y con el nokia 5300 se desconecta cuando recibe el primer comando. Como dije soy un principiante pero sospecho que mi error esta en querer hacer la comunicacion por el USB conectando el Tx del pic al Rx(D-) del celular y viceversa.

En su experiencia, ¿Es estrictamente necesario conectarse al FBUS Tx y FBUS Rx del celular? ¿Si cambiara a un pic con USB como el 18F2550, aumentaria la complejidad del codigo? Gracias.
 
Atrás
Arriba