while(1){
printf("AT\r\n");
delay_ms(4000);
printf("AT+CMGS=543xxxxxxx\r\n");
delay_ms(4000);
printf("HOLA DESDE PIC"+0X1A);
Delay_ms(4000);
} A ver si me dan una mano. Gracias
Checkeaste que el baud-rate sea el correcto ?si porque me deja llamar
Te fijaste que te responde ?El problema es que tengo que poner comillas y no se como ponerlas en el string tengo que poner, o mandar: AT+CMGS="543496508790"
Podrias determinar cual es el problema mirando eso.
para finalizar el mensaje tenes que enviar el caracter CTRL+z o 0x1Adonde puedo encontrar info sobre el fprint?
agregá esto al final:
printf("%c", 0x1A);
saludos!
para finalizar el mensaje tenes que enviar el caracter CTRL+z o 0x1A
agregá esto al final:
printf("%c", 0x1A);
saludos!
si funciono ahora trato de activar algo al recibir un mensaje de sms desde un telefono celular pero no me sale y encima no veo cual es el problema, porque no puedo monitoriar el puerto que tengo conectado a la sis900para finalizar el mensaje tenes que enviar el caracter CTRL+z o 0x1A
agregá esto al final:
printf("%c", 0x1A);
saludos!
te funcionó esto?
sds.
while(1){
delay_ms(1000);
IF(!(BIT_TEST(PORTA,5)))
{
printf("AT+CMGS=\"543xxxxxx\"\r");
delay_ms(3000);
printf("HOLA DESDE PIC\r\n");
printf("%c", 0x1A);
IF ((Cadena[0]=='+'))
{
printf("AT+CMGR=1\r"); //leer sms
delay_ms(500);//espero a que conteste
if(Cadena[0]=='P')output_high(PIN_B1);
che gracias por responder, me fije en el manual de la sis900 y ese es el comando para leer pero como ya lo configure para que tire el mensaje como el ejemplo que me diste no lo necesito lo que pasa es que algo esta mal con la recepcion de la cadena de caracteres porque no detecta nada de lo que recibo solo detecto la interrupcion de la uartCódigo: C
ese comando no es para leer los mensajes SMS, lo que hace es poner el modo SMS en modo texto.
quizà esto te sirva:
http://www.theengineeringprojects.com/2015/02/receive-sms-commands-using-sim900-arduino.html
la ultima parte del còdigo te lo venden jajaja, pero seguro vas a poder implementar lo que explican. Te manejas bien con el ingles?
sds.
void rd_isr(void)//función de interrupción por recepción de datos USART
{
ch=getc();
Cadena[i]=ch;
// putc(ch);
output_toggle(PIN_B0);
i++;
if(i>60)i=0;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
set_tris_b(0x04); //portb como salida
set_tris_a(0x20); //porta como Entrada
enable_interrupts(int_rda);
enable_interrupts(GLOBAL); //activadas interrupciones
output_Low(PIN_B1);
output_Low(PIN_B0);
while(1){
if((Cadena[0]=='+')&&(Cadena[1]=='C')&&(Cadena[2]=='M')&&(Cadena[3]=='T'))output_high(PIN_B1);
}
}
Fijate si lo poder resolver y me avisas, estoy estancado con eso
#include <16F88.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES PUT //Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#byte PORTA=0X05
#use delay(int=4000000,RESTART_WDT)
#use rs232(uart1, baud=9600)//usart1 -->ajuste de XMIT y RCV para la USART 1
int i=0,j=0;
char Cadena[60]="";
char ch;
int1 LineaPresente=0;
#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{
output_toggle(PIN_B0);
LineaPresente=0;
ch=getc();
Cadena[i]="";
Cadena[i]=ch;
i++;
if(i>=60)i=0;
if(ch==0x1a)
{
i=0;
LineaPresente=1;
}
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
set_tris_b(0x04); //portb como salida
set_tris_a(0x20); //porta como Entrada
enable_interrupts(int_rda);
enable_interrupts(GLOBAL); //activadas interrupciones
output_Low(PIN_B1);
output_Low(PIN_B0);
while(1){
delay_ms(500);
if((LineaPresente==1)&&(Cadena[0]=='+'))output_high(PIN_B1);
putc(Cadena[0]);
}
}
#include <16F88.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES PUT //Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#byte PORTA=0X05
#use delay(int=4000000,RESTART_WDT)
#use rs232(uart1, baud=9600)//usart1 -->ajuste de XMIT y RCV para la USART 1
int i=0,j=0;
char Mensaje[60]="",Respuesta[60]="";
char ch;
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
set_tris_b(0x04);
set_tris_a(0x20);
output_Low(PIN_B1);
output_Low(PIN_B0);
while(1){
printf("AT+CMGF=1\n");
gets(Respuesta);
if((respuesta[0]=='O')&&(respuesta[1]=='K'))printf("AT+CNMI=2,2,0,0,0\n");
if((respuesta[0]=='O')&&(respuesta[1]=='K'))gets(Respuesta);
if (Respuesta[0]=='R')output_high(PIN_B1);///detecta llamada entrante
//if((respuesta[0]=='+' && respuesta[1]=='C')&&(respuesta[2]=='M')&&(respuesta[3]=='T'))gets(Mensaje);
//if(mensaje[0]=='P')output_high(PIN_B1);
}
}
como vos me lo distepor que a veces usas respuesta y otras veces Respuesta? no te da error eso?No me da error
Esa forma de còdigo es la que yo te digo que es la màs facil. Mandas comando y luego haces un gets para recivir la respuesta. Ojo que yo no sé si es gets la orden en CCS para recivir una linea completa por el uart.
El primer ejemplo bàsico que tenes que hacer es enviar el comando AT solo y esperar el OK del SIM900. Si haces andar eso ya tendrìas la base para el resto.
Saludos!
#include <16F88.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES PUT //Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#byte PORTA=0X05
#use delay(int=4000000,RESTART_WDT)
#use rs232(uart1, baud=9600)//usart1 -->ajuste de XMIT y RCV para la USART 1
int i=0, j=0;
char Cadena[60]="";
char ch;
int1 LineaPresente=0;
#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{
output_toggle(PIN_B0);
LineaPresente=0;
ch=getc();
Cadena[i]=0x00;
Cadena[i]=ch;
i++;
if(i>=60)i=0;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
set_tris_b(0x04); //portb como salida
set_tris_a(0x20); //porta como Entrada
enable_interrupts(int_rda);
enable_interrupts(GLOBAL); //activadas interrupciones
output_Low(PIN_B1);
output_Low(PIN_B0);
while(1){
printf("AT\n");
delay_ms(2000);
if((Cadena[0]=='O')&&(Cadena[1]=='K'))
{
for (j=1;j<=60;++j)Cadena[j]=0x00;
output_toggle(PIN_B1);
}
}
}
pero si conecto la sis no anda
no entiendo. que sería simular la SIS con un adaptor uART?tengo un conversor uart a ttl y lo uso para ver lo que manda la sis900 o simularla, donde puedo ver lo que le manda el pic y responderle en algunos casos
#include <16F88.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC //Internal RC Osc
#FUSES PUT //Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#byte PORTA=0X05
#use delay(int=4000000,RESTART_WDT)
#use rs232(uart1, baud=9600)//usart1 -->ajuste de XMIT y RCV para la USART 1
int i=0;
char Cadena[60]="";
char ch;
#int_rda
void rd_isr(void)//función de interrupción por recepción de datos USART
{
ch=getc();
Cadena[i]=ch;
putc(ch);
output_toggle(PIN_B0);
i++;
if(i>60)i=0;
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
set_tris_b(0x06); //portb como salida
set_tris_a(0x20); //porta como Entrada
enable_interrupts(int_rda);
enable_interrupts(GLOBAL); //activadas interrupciones
output_Low(PIN_B1);
output_Low(PIN_B0);
while(1){
delay_ms(1000);
IF(!(BIT_TEST(PORTA,5)))
{
printf("ATD03496xxxxxx0;\r\n");
}no pongo foto de la placa porque esta todo conectado con cables y no se va a distinguir nada
si tengo conectadas las masas y rx con tx...
me podrías decir que cosas tienes conectado a cada pin del micro?el micro tiene conectado un pulsador a vss en a5 y de los pines de uart del micro sale al sis 900 rx con tx y viceversa, las masas las uni la vss del micro con gnd de sis
sds.
a 9600 bps tenes que cada bit tarda 104useg, Recibir la letra O lleva 10 bits -> 10mseg. O sea que cuando recivas el OK el led va a encenderse por 10mseg y luego a apagarse otra vez. Presta atension a ver si se enciende...
En realidad va a encender 1 milisegundo (104 useg x 10 = 1040 useg, igual a 1 mseg) solamente, no creo que puedas ver ese destello, es muy poco tiempo, aunque ya lo eran 10 mseg.
al arrancar los dos led encienden luego se apagan y finalente se enciende solo el B0?Si pasa eso
sds
si sacas el sis900 y pones un ftdi al arrancar el prograa en la terminal te aparece el mensaje AT?NO enciende el led pero no me deja mandar nada al puerto solo se ve el comando at al principio a lo mejor esta quemado el pic
si es así si en la terminal una vez recivido AT tu envías OK no se enciende el led B1?
NO enciende el led pero no me deja mandar nada al puerto
la solucion cual fue?Volvi a armar todo de nuevo en la protoboard y recurri a un codigo que me habia funcionado a medias antes igual todavia me queda poder leer un sms