Uso de un celular GSM con PIC o PC

Gracias denuevo eric, yo no configure manualmente el pin tx como salida por que se supone que la funcion UART1_Init(9600) lo hace sino me equivoco. de todas formas voy a configurarlo manualmente y por las dudas me voy a comprar un 628 que es baratito y tiene usart.

te cuento lo que medi: en el tx del max medi con el osciloscopio y hay exactamente 5V cuando no transmite, y el tx del pic cuando no transmite la señal es de 5V pero entrecortado, varia entre 5V y 0V, supongo que esta variacion de tension hace confundir al celular cuando el pic envia los datos?

lo del pull ap no lo sabia, ahora q me decis voy a poner la r como me indicas.

pregunto: cual es el pdf al que haces referencia?

gracias, una vez que pruebe comento los resultados. saludos
 
Es correcto lo que dices de la configuracion I/O del módulo USART así lo marca el PDF de este micro, lo localicé en la microchip, sin embargo no está de más intentarlo, yo así lo he trabajado y no me ha dado problemas. Lo que comentas de los pulsos entrecortados me hace pensar aún más que el buffer tenga algún daño, un corto accidental o por ESD, suele pasar...tego algunos PICs con el Reset dañado, son irreprogramables :cry:.
Lo del PullUp es porque algunas configuraciones como el HalfDuplex requieren un voltaje estable sin comunicación, se supone integran un PullUp, pero es sano colocarle uno externo. En tu caso debe de funcionar ya que sigo pensando que es problema del buffer, por lo tanto un valor hasta de 4.7KOhms te debe solucionar esto...lo malo es que ese PIC así se va a quedar :rolleyes:.
Saludos
 
Gracias eric. sigo con los resultados negativos :enfadado:

probe colocando la resistencia pull ap pero no se soluciono, si bien la tension si, era estable, al momento de transmitir como que ni se mosqueaba el pic, no me acuerdo que valor use creo que 1K, vos me dijiste de 4,7K tendra algo que ver esto?

de todas maneras cambie de pic, use un 16f628a y no funciona nada. sin embargo la simulacion en proteus anda bien. envia los datos al terminal.

voy a seguir intentando y comento. saludos
 
Extraño, y más extraño que nadie opine!!!:D
Puedes probar con valores más elevados, aunque la verdad sigo sin entender bien el porque de tu fallo( como dirían en mi país, " un caso para la araña":LOL: ).
El hecho que funcione con el MAX en paralelo solo puede significar la falta de un PullUp.
Ahora que si lo probaste con otro PIC y no así funcionó, quiere decir entonces que es un problema de configuraciones en el compilador, que programa usas??
Saludos
 
uso mikroc, voy a intentar de pasar el codigo en ccs y compilarlo a ver si tengo algun resultado, ensima el grabador de los pic 16f que tengo graba cuando quiere y para grabar un pic es un martirio jeje, insistire con el pic18 nose, voy a compilar en ccs, le cambio la r de pull up aver q pasa.

gracias eric
 
tendrías que poner el circuito que usas ...una solución (en vez de usar el MAX232) sería usar buffers adaptadores CD4050 de tecnología CMOS.

CONVERSORDENIVELES.jpg
 
Hola moyano, el circuito que uso entre el pic y el celular es directo.
tx del pic al rx del celular

y rx del pic al tx del celular.

y entre pic y la pc uso el max232 y no hay problema, lo mismo entre celular y pc uso max232 y todo bien.

hoy segui intentando y no logre nada, quize intentar con otros pic y no logro quemarlos, ya comentare los resultados

gracias
 
Hola, dejo una imagen del tx del pic cuando no esta transmitiendo y no esta conectado al max232.

saludos
 

Adjuntos

  • DSC00664.JPG
    DSC00664.JPG
    28.8 KB · Visitas: 14
MMM, si que es raro, lo curioso también es que el PIN TX del PIC es al mismo tiempo el CK del modo síncrono y los pulsos están más que parecidos a pulsos de reloj. Yo creo que debe ser algún error de configuración del periférico, solo como comentario, tu configuración de Reset, Xtal y el capacitor de Bypass entre los pines de VDD y GND del PIC están como deben estar?
Saludos
 
Hola eric dejo una foto del circuito que uso para alimentar el pic y como esta configurado mikroc, el capacitor que vos decis va directo entre los dos pines del pic de alimentacion, y las dos masas?
 

Adjuntos

  • AlimentacionPic.JPG
    AlimentacionPic.JPG
    5.4 KB · Visitas: 24
  • CenfigPic.JPG
    CenfigPic.JPG
    69.9 KB · Visitas: 31
Hola Sdel, la primera foto la tienes como tal? es decir, con los capacitores que te marca?
No te puedo garantizar que tu problema esté con los capacitores de bypass, pero si te puedo decir que son altamente importantes y hay que colocarlos siempre, al igual que los capacitores que debe llevar todo cristal según lo marca cualquier PDF que revices de PICs, son dos capacitores, uno conectado a cada PIN del cristal y de ahí a GND, ayudan a estabilizar la oscilación del mismo. Normalmente para cristales de 4MHz se usan de 33pF.
Los de bypass ayudan a que los "ruidos" de otros componentes o de la fuente puedan afectar al PIC, de igual forma te ayudan para cuando el PIC consume ciertos picos de corriente que podrían ocasionar que se resetée, van entre VDD y GND, de preferencia en cada PIN de vdd que tenga el PIC( 10uF ).
La opción de "power up timer" se aconseja usar ya que no permite que el PIC "arranque" hasta que el voltaje no se estabilice...te evita algunos dolores de cabeza para cuando trabajas en Proto ;D.
Saludos
 
Gracias eric muy buena explicacion, en el cristal de 20Mhz tengo dos capacitores de 22pf a masa, y el circuito de alimentacion es el mismo de la foto, lo que no tengo son los capacitores que nombras, a la noche voy a intentar agregarselos y comento, saludos
 
Hola eric te debo un asado jeje, anoche probe agregando los capacitires y andubooo, pude llamar con el pic sin conectarlo al max, asi que era eso, los capacitores...

ahora tengo que cargarle credito al celular y seguir con el codigo del programa. mando un saludo y muchas graciaaas

cuando avanze comento mas...
 
Jaja, tampoco me esperaba que el problema anduviera por ahí, pero si lo estás montado en Proto era de lo más posible entonces. Que bueno que se resolvió, por lo menos ahora ya hay un conocimiento más. Son imprescindibles esos capacitores de Bypass, no sabes cuantos dolores de cabeza sufrí al principio por no colocarlos, hasta en el PCB hay que estar concientes.
Saludos
 
A mi me había sucedido un problema similar al usar un cristal de 20Mhz....el programa era el mismo....y no funcionaba..luego con el cristal de 4Mhz...se normalizó la situación y comenzó a funcionar.

rarezas de la electrónica...
 
Hola, estube haciendo unas pruebas y tube algunos resultados:

con el pic pude marcar un numero para llamar y enviar un mensaje, pero el mensaje que envia por ejemplo al pic le digo que envie el mensaje hola, en el celular destinatario el mensaje que recibe es:
at

at+cmgf=1

at+cmgs="#########"

hola

por que puede pasar esto?

loque todavia no puedo y lo que me parece mas importante es recibir un mensaje y leerlo con el pic.
El pic le envia bien los comandos al celular, y este los interpreta bien y responde, esto lo comprobe con el terminal. lo que pasa es que el pic no interpreta bien los datos recibidos por el telefono, supongo que sera por la tension de tx del celular? que apenas llega a los 3V.
sera por esto?

alguna sugerencia?

saludos
 
Una consulta frecuente en este hilo es la posibilidad de procesar los comandos que enviamos mediante mensajes de texto a nuestro microcontrolador. Buscando por la red una manera sencilla de hacerlo, encontré un código en C de CCS ( Que puede portarse a otras plataformas facilmente ). El mismo toma comandos definidos por el usuario y luego los procesa para realizar alguna acción determinada.

Sin ir mas lejos este es el código:
Código:
#include <16f876a.h>       // Definiciones del PIC 16F876A
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Los Fuses de siempre
#use delay(clock=4000000) // Oscilador a 4 Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar

// CONSTANTES /////////////////////////////////////////////////////////////////

int const lenbuff=32; // Longitud de buffer, Ajustar
                      // a lo que desees (o te sea posible)

// VARIABLES EN RAM ///////////////////////////////////////////////////////////

int xbuff=0x00;      // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char rcvchar=0x00;   // último carácter recibido
int1 flagcommand=0;  // Flag para indicar comando disponible 

// Declaración de Funciones ///////////////////////////////////////////////////

void inicbuff(void);        // Borra buffer 
int addcbuff(char c);       // añade carácter recibido al buffer
void echos(char c);         // Eco selectivo sobre RS232
void procesa_comando(void); // Procesa comando

// INTERRUPCIONES /////////////////////////////////////////////////////////////

#int_rda
void serial_isr() {    // Interrupción recepción serie USART

  rcvchar=0x00;        // Inicializo carácter recibido 
  if(kbhit()){         // Si hay algo pendiente de recibir ...
    rcvchar=getc();    // lo descargo y ...
    addcbuff(rcvchar); // lo añado al buffer y ...
    echos(rcvchar);    // hago eco (si procede).
  }
}

// Desarrollo de Funciones ////////////////////////////////////////////////////

void echos(char c){ // Echo selectivo ----------------------

  switch(c){
    case 0x0D: printf(" [Ent] "); // Si he pulsado la tecla [Intro]
               break;
    case 0x08: printf(" [Del] "); // Si he pulsado la tecla [Retroceso]
               break;
    case 0x1B: printf(" [Esc] "); // Si he pulsado la tecla [Escape]
               break;
    default:   putc(rcvchar);     // Echo de cualquier otro carácter
  }
}

void inicbuff(void){ // Inicia a \0 cbuff -------------------
  int i;

  for(i=0;i<lenbuff;i++){   // Bucle que pone a 0 todos los
    cbuff[i]=0x00;          // caracteres en el buffer
  }
  xbuff=0x00;               // Inicializo el índice de siguiente
                            // carácter
}

int addcbuff(char c){ // Añade a cbuff -----------------------

  switch(c){
    case 0x0D:           // Enter -> Habilita Flag para procesar
      flagcommand=1;     // Comando en Main
      break;
    case 0x08:           // Del -> Borra último carácter del Buffer
      if(xbuff>0) cbuff[--xbuff]=0x00;
      break;
    case 0x01B:          // Esc -> Borra el Buffer completamente
      inicbuff();
      break;
    default:
      cbuff[xbuff++]=c; // Añade carácter recibido al Buffer
  }
}


// Programa Principal /////////////////////////////////////////////////////////

void main() {

  inicbuff(); // Borra buffer al inicio

  printf("\r\n\** RS232 Buffered **\r\n\r\n"); // Presenta menú
  printf("[Enter] Procesa comando\r\n");
  printf("[Escape] Borra todo el buffer\r\n");
  printf("[Delete] Borra último carácter del buffer\r\n");
  printf("[\\w] Comando Escribe\r\n");
  printf("[\\r] Comando Lee\r\n");
  printf("\r\n");

  enable_interrupts(int_rda); // Habilita Interrupción RDA
  enable_interrupts(global);  // Habilita interrupciones

  do {

    if(flagcommand) procesa_comando(); // Si hay comando pendiente
                                       // de procesar ... lo procesa.

  } while (TRUE);

}

// Procesador de Comandos /////////////////////////////////////////////////////

void procesa_comando(void){

  int i;
  char arg[lenbuff]; // Argumento de comando (si lo tiene)

  flagcommand=0; // Desactivo flag de comando pendiente.
  printf("\r\nProcesando ... "); // Monitorizo procesando ...

  for(i=0;i<lenbuff;i++){ // Bucle que pone a 0 todos los
    arg[i]=0x00; // caracteres en el argumento
  }

  if(cbuff[0]=='\\'&&cbuff[1]=='r'){ // Comparo inicio del buffer con comando "\r"

    printf("Leyendo ... ");         [B]// Aqui lo que deseemos hacer con comando "\r"[/B]

  }

  if(cbuff[0]=='\\'&&cbuff[1]=='w'){ // Comparo inicio del buffer con comando "\w"
    i=2;
    do{ // Extraemos argumento del buffer 
      arg[i-2]=cbuff[i]; // a partir del 3er byte y hasta \0.
    }while(cbuff[++i]!=0x00);

    printf("Escribiendo %s ... ",arg);[B]// Aqui lo que deseemos hacer con comando "\w"[/B]
                                      // Monitorizamos el argumento.
  }

  inicbuff(); // Borro buffer.

  printf("Procesado.\r\n\r\n"); // Monitorizo procesado.

El autor de este código Diego alias "RedPIC" lo explica en su página: http://picmania.garcia-cuervo.net/picc.php#COMBUF232
 
ya mismo lo estoy probando, gracias moyano. esto me saca la cabeza, ya probe con distintos codigos y compiladores, hasta en assembler y no logro que el pic interprete nada. pense que era por la diferencia en los niveles de la señal pero puse una compuerta and en el tx del celular y el pic ni se mosquea, quiza tendria que comprar un modulo gsm para hacer las pruebas.

pregunto:
despues de la ultima linea : printf("Procesado.\r\n\r\n"); // Monitorizo procesado.

iria la llave de cierre del main no?
 
Hola de nuevo Sdel, perdón por meterme de nuevo :D. Creo que sería una muy buena idea que probaras el PIC con hypertérminal antes que con el cel...corre un programa muy simple donde metas caracteres al PIC y checa que este los interprete de alguna forma que regrese al hypertérminal una respuesta para que sepas que la configuración de recepción es correcta...
Saludos
 
Atrás
Arriba