|
|
View previous topic :: View next topic |
Author |
Message |
sebalitter
Joined: 05 May 2015 Posts: 47
|
rs232 in header |
Posted: Thu Jan 23, 2020 10:35 pm |
|
|
Hello
This code shows me those errors:
Error#7 Invalid Pre-Processor directive Invalid Pin
Error#12 Undefined identifier SERIAL_GPS
What I'm doing wrong?
fases.c
Code: |
// Voltimetro trifasico
#include "fases_header.h"
//#define VSS_VREF
//#define VREF_ADC_1v024
#INT_RDA
void RDA_isr(void)
{
int8 d;
d=0;
d=getchar(SERIAL_GSM);
clear_interrupt(INT_RDA);
}
void main (void)
{
inicializacion();
//int8 posicion=0;
while(TRUE)
{
setup_adc_ports(sAN0|sAN2|sAN3);
setup_adc(ADC_CLOCK_DIV_2);
voltajes[0] = medir_voltaje(0);
delay_ms(100);
voltajes[1] = medir_voltaje(2);
delay_ms(100);
voltajes[2] = medir_voltaje(3);
delay_ms(100);
lcd_gotoxy(0,1);
printf(lcd_putc," Vr Vs Vt");
lcd_gotoxy(0,2);
printf(lcd_putc,"%3.0lu %3.0lu %3.0lu",voltajes[0], voltajes[1], voltajes[2]);
}
}
|
Code: |
#include <16F1823.h>
#device adc=10
//#device PASS_STRINGS = IN_RAM
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin enabled
#use delay(clock=16M) //Configuracion reloj interno
#PIN_SELECT U1TX=PIN_C4
#PIN_SELECT U1RX=PIN_C3
#use rs232(UART, BAUD=9600, PARITY=N, BITS=8, stream=SERIAL_GSM , errors)
#use i2c(Master,Fast=100000, sda=PIN_C1, scl=PIN_C2,force_sw)
#include <i2c_Flex_LCD.c>
#define PROM 1500
#define TELEFONO "1565404122"
int16 voltajes[3];
void inicializacionSIM800L(void)
{
int cont;
delay_ms(1000);
puts("A",SERIAL_GSM); //para sincronizar el baudrate del SIM 900
delay_ms(300);
putchar(0x0d,SERIAL_GSM);
delay_ms(3000);
for(cont=0;cont<5;cont++) // mando varios AT para el autobauding
{
puts("AT",SERIAL_GSM);
delay_ms(300);
putchar(0x0d,SERIAL_GSM);
delay_ms(200);
}
puts("AT+CMGF=1\r",SERIAL_GSM); // configuro para que trabaje en modo texto
delay_ms(100);
putchar(0x0d,SERIAL_GSM);
delay_ms(100);
puts("AT\r",SERIAL_GPS);
delay_ms(1000);
puts("AT+CGPSPWR=1\r",SERIAL_GPS);
delay_ms(300);
puts("AT+CGPSRST=0\r",SERIAL_GPS);
delay_ms(3000);
return;
}
void inicializacion(){
lcd_init();
lcd_backlight_led(ON); //Enciende la luz de Fondo
inicializacionSIM800L();
lcd_clear(); //Limpia el LCD
printf(lcd_putc, "\f");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
}
void mandar_SMS(char *numero , char *mensaje)
{
//char *serial_gsm;
//sprintf( serial_gsm ,"\n\r LDR Analog Value: %.0f \n\r PANIC Status: %d \n\r TEMP Analog Value: %.0f \n\r X/Y/Z Accelerometer %.0f : %.0f : %.0f \n\r",ADC1, input(PANIC),grados,i,a,w);
//PIN_ON(LED);
//delay_ms(300);
//printf(usb_cdc_putc, "\r\nAT+CMGS=\"%s\"\r", numero);
fprintf(SERIAL_GSM, "AT+CMGS=\"%s\"\r", TELEFONO);
delay_ms(300);
//fputs(serial_gsm,SERIAL_GSM);
fprintf(SERIAL_GSM,"\n\r Vr: %3.0lu \n\r Vs :%3.0lu \n\r Vt: %3.0lu",voltajes[0], voltajes[1], voltajes[2]);
//fprintf(SERIAL_GSM, "AT+CMGS=\"%s\"\r", numero);
delay_ms(100);
fprintf(SERIAL_GSM,"%c",0x1a);
//PIN_OFF(LED);
}
int16 medir_voltaje(int8 channel){
int32 acum=0;
int16 Vmedio=0, i=0; //, Voltaje=0;
for(i=0;i<PROM;i++)
{
set_adc_channel(channel);
delay_us(100);
acum+=read_adc();
}
Vmedio=acum/PROM;
//Voltaje=;
//lcd_gotoxy(1,1);
//printf(lcd_putc,"Vr= %lu V",Voltaje);
return (Vmedio*3.594);
}
|
Thanks! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19506
|
|
Posted: Thu Jan 23, 2020 11:52 pm |
|
|
Hint:
UART != UART1
#USE RS232 needs a UART number. |
|
|
sebalitter
Joined: 05 May 2015 Posts: 47
|
|
Posted: Fri Jan 24, 2020 3:06 am |
|
|
Ttelmah wrote: | Hint:
UART != UART1
#USE RS232 needs a UART number. |
i changed to UART1 using the conventional ports
Tx: Pin C4
Rx: Pin C5
#use rs232(UART1, BAUD=9600, PARITY=N, BITS=8, stream=SERIAL_GSM , errors)
do you know if i need something else to send a message in sim800L because its not sending anything. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Fri Jan 24, 2020 5:37 am |
|
|
Always best to start with the hardware
1) what is the VDD of the PIC ?
2) what is the VDD of the SIM800L?
3) is the SIM800L a 'chip' or a 'module' ?
4) What is the rating of the power supply in amps ? |
|
|
sebalitter
Joined: 05 May 2015 Posts: 47
|
|
Posted: Fri Jan 24, 2020 5:56 am |
|
|
temtronic wrote: | Always best to start with the hardware
1) what is the VDD of the PIC ?
2) what is the VDD of the SIM800L?
3) is the SIM800L a 'chip' or a 'module' ?
4) What is the rating of the power supply in amps ?
|
Hello , thanks for the quick answer .
PIC16F1823 and SIM800L are connected to the same power ( 5v , 1.25A)
Module GSM SIN800L (Rohs)
[img]
http://g03.a.alicdn.com/kf/HTB1duFfKVXXXXXGaXXXq6xXFXXXq/High-Quality-SIM800L-font-b-GPRS-b-font-GSM-Board-Quadband-QUAD-BAND-L-shape-font.jpg
[/img]
i did something like this
Code: |
#INT_RDA
void RDA_isr(void)
{
int8 d;
d=0;
d=getchar(SERIAL_GSM);
dato_recibido[con_recepcion] = d;
con_recepcion++;
if(con_recepcion>19)
con_recepcion=0;
//lcd_gotoxy(0,1);
// printf(lcd_putc, "%c",d);
clear_interrupt(INT_RDA);
}
and show it in main..
if(con_recepcion>18){
lcd_clear(); //Limpia el LCD
printf(lcd_putc, "\f");
lcd_gotoxy(0,1);
printf(lcd_putc,"%s",dato_recibido);
delay_ms(5000);
}
|
but it didnt show anything. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Fri Jan 24, 2020 5:59 am |
|
|
Is that module designed to be operated at 5 volts ?
Most peripheral devices are 3 volts and need 'logic level converters' to properly connect to 5 volt PICs.
If you have a 'link' to the module we can check.
hmm, my 'guy instinct' is that you should have at least a 2.5 amp power supply. most of these 'wireless' module need a LOT of current to transmit. whatever the datasheet says DOUBLE it ! You need a good reservoir of electrons !
As for software, check with the mfrs website / dtasheet. there should be some basic 'write to a register, read to confirm' code. Assuming you didn't write the 'driver' code, ask that programmer or check the website/forum for Q&A about it or use Google for THAT device, version of PCB may be a problem ? Code written for V1.2 versus PCB is V2.4.
Jay |
|
|
sebalitter
Joined: 05 May 2015 Posts: 47
|
|
Posted: Fri Jan 24, 2020 6:08 am |
|
|
temtronic wrote: | Is that module designed to be operated at 5 volts ?
Most peripheral devices are 3 volts and need 'logic level converters' to properly connect to 5 volt PICs.
If you have a 'link' to the module we can check.
Jay |
it has a VCC input , it says 5v on the board.
[url]
https://irishelectronics.ie/SIM800L-V20-5V-Wireless-GSM-GPRS-MODULE
[/url] |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Fri Jan 24, 2020 6:39 am |
|
|
hmm I saw this. about 1/2 way down that webpage....
•Embedded AT (optional)
That to me says 'AT command set is an OPTION' though it could mean something totally without the actual datasheet I can't tell.
You should try a simple 'loopback' test to confirm the PIC is running and sending/reciving serial data.
There's 2 possible problems
1) The PIC is not running properly
or
2) The SIM is not running properly
silly question... you have PIC XMT -> SIM RCV ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19506
|
|
Posted: Fri Jan 24, 2020 8:24 am |
|
|
You have a voltage problem.
The SIM800, is a 3.3v device (actually supports 4.4v maximum).
The boards supplied for things like the Arduino, have a regulator to give
the 3.3v, but they don't have a signal amplifier to raise the output voltage
to the levels required by the PIC. The reason is that the PIC serial input
is a Schmitt input but the Arduino one is TTL. So one is not needed when
attached to an Arduino, but is for the PIC,
You need a level shifter on the output from the modem to work.
I've used a lot of these units over the years, and this is required unless
you use a 3.3v PIC. |
|
|
sebalitter
Joined: 05 May 2015 Posts: 47
|
|
Posted: Fri Jan 24, 2020 8:32 am |
|
|
Ttelmah wrote: | You have a voltage problem.
The SIM800, is a 3.3v device (actually supports 4.4v maximum).
The boards supplied for things like the Arduino, have a regulator to give
the 3.3v, but they don't have a signal amplifier to raise the output voltage
to the levels required by the PIC. The reason is that the PIC serial input
is a Schmitt input but the Arduino one is TTL. So one is not needed when
attached to an Arduino, but is for the PIC,
You need a level shifter on the output from the modem to work.
I've used a lot of these units over the years, and this is required unless
you use a 3.3v PIC. |
It's working properly now, I wasn't showing the message in the correct position.
The thing is that I can't send SMS yet. I think I have a problem with AT commands.
Also this PIC has a limited memory ram and rom for this program.
main.c
Code: |
// Voltimetro trifasico
#include "fases_header.h"
//#define VSS_VREF
//#define VREF_ADC_1v024
#INT_RDA
void RDA_isr(void)
{
dato_recibido[con_recepcion] = getchar(SERIAL_GSM);
con_recepcion++;
if(con_recepcion>30)
con_recepcion=0;
clear_interrupt(INT_RDA);
}
void main (void)
{
inicializacion();
while(TRUE)
{
voltajes[0] = medir_voltaje(0);
delay_ms(100);
voltajes[1] = medir_voltaje(2);
delay_ms(100);
voltajes[2] = medir_voltaje(3);
delay_ms(100);
lcd_clear(); //Limpia el LCD
printf(lcd_putc, "\f");
lcd_gotoxy(0,1);
printf(lcd_putc,"%s",&(dato_recibido[0]));
//printf(lcd_putc," Vr Vs Vt");
lcd_gotoxy(0,2);
printf(lcd_putc,"%s",&(dato_recibido[15]));
delay_ms(3000);
//printf(lcd_putc,"%3.0lu %3.0lu %3.0lu",voltajes[0], voltajes[1], voltajes[2]);
mandar_SMS();
delay_ms(3000);
//ejecucion();
}
}
|
.h
Code: |
/*
UART1 -> modulo GSM
Tx: Pin C4
Rx: Pin C5
* I2C display -> sda=PIN_C1 - scl=PIN_C2
*/
#include <16F1823.h>
#device adc=10
//#device PASS_STRINGS = IN_RAM
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOMCLR //Master Clear pin enabled
#use delay(clock=16M) //Configuracion reloj interno
#use rs232(UART1, BAUD=9600, PARITY=N, BITS=8, stream=SERIAL_GSM , errors)
#use i2c(Master,Fast=100000, sda=PIN_C1, scl=PIN_C2,force_sw)
#include <i2c_Flex_LCD.c>
#define PROM 1500
#define TELEFONO "1565404122"
int16 voltajes[3];
char dato_recibido[30]; // Buffer de recepción
int con_recepcion=0;
void inicializacionSIM800L(void)
{
int cont;
delay_ms(1000);
puts("A",SERIAL_GSM); //para sincronizar el baudrate del SIM 900
delay_ms(300);
putchar(0x0d,SERIAL_GSM);
delay_ms(3000);
for(cont=0;cont<5;cont++) // mando varios AT para el autobauding
{
puts("AT",SERIAL_GSM);
delay_ms(300);
putchar(0x0d,SERIAL_GSM);
delay_ms(200);
}
puts("AT+CMGF=1\r",SERIAL_GSM); // configuro para que trabaje en modo texto
delay_ms(100);
putchar(0x0d,SERIAL_GSM);
delay_ms(3000);
return;
}
void inicializacion(){
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(sAN0|sAN2|sAN3);
setup_adc(ADC_CLOCK_DIV_2);
lcd_init();
lcd_backlight_led(ON); //Enciende la luz de Fondo
inicializacionSIM800L();
lcd_clear(); //Limpia el LCD
//printf(lcd_putc, "\f");
lcd_gotoxy(0,1);
printf(lcd_putc," INICIANDO..");
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
}
void mandar_SMS()
{
//fprintf(SERIAL_GSM, "AT+CMGS=\"%s\"\r", TELEFONO);
printf(SERIAL_GSM, "AT+CMGS=\"1565404122\"\r");
delay_ms(300);
//fputs(serial_gsm,SERIAL_GSM);
//printf(SERIAL_GSM, "SEBA!!!");
fprintf(SERIAL_GSM,"\n\r Vr: %3.0lu \n\r Vs :%3.0lu \n\r Vt: %3.0lu",voltajes[0], voltajes[1], voltajes[2]);
//fprintf(SERIAL_GSM, "AT+CMGS=\"%s\"\r", numero);
delay_ms(100);
//putchar(0x1a,SERIAL_GSM);
fprintf(SERIAL_GSM,"%c",0x1a);
}
int16 medir_voltaje(int8 channel){
int32 acum=0;
int16 i=0;
for(i=0;i<PROM;i++)
{
set_adc_channel(channel);
delay_us(100);
acum+=read_adc();
}
//Vmedio=;
return ((acum/PROM)*3.594);
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19506
|
|
Posted: Fri Jan 24, 2020 8:54 am |
|
|
OK. Looking at the picture of your board, the two transistors between
the modem, and the connector may be used for level translation.
You don't need the clear_interrupt line in your interrupt handler. The
compiler already does this for you.
Little bit puzzled. You refer to SIM900, but the board you show is a
SIM800?.
The telephone number fed to the modem for a SMS, needs to be in
E123 format. They like not to respond unless this is right.
You are also mixing using printf, and fprintf. You need to only use
fprintf.
I know you are limited on space, but normally you need to perform a
AT+CREG to verify the modem has actually registered on the network
before sending.
You also normally need AT+CMGF=1 to set the modem to send SMS's
in text mode. It defaults to working in PDU mode. |
|
|
sebalitter
Joined: 05 May 2015 Posts: 47
|
|
Posted: Tue Jan 28, 2020 12:35 pm |
|
|
I could see the messages in the PC via RS232.
The problem is +CREG: 1,3 (registration denied). |
|
|
PrinceNai
Joined: 31 Oct 2016 Posts: 479 Location: Montenegro
|
|
Posted: Tue Jan 28, 2020 2:11 pm |
|
|
I did a quick search on the net and saw there are a lot of people out there having that problem with SIM800 modules. One of the reasons they mention is a duplicate IMEI number and network operators having a list of those. Do you by chance have another module to test with?
As a side note, Chinese modules, both SIM800 and SIM900, gave me nothing but trouble. Not connecting, disconnecting, one day it works and the next day not... So one day I threw all of them into trash bin and got myself some A6 modules. Zero problems, only the ones I created via bad code :-) |
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1634 Location: Perth, Australia
|
|
Posted: Tue Jan 28, 2020 3:22 pm |
|
|
sebalitter wrote: | I could see the messages in the PC via RS232.
The problem is +CREG: 1,3 (registration denied). |
What country are you in?
The SIM800 is a 2G module. 2G technology is old, and no longer operational in a lot of countries. _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
sebalitter
Joined: 05 May 2015 Posts: 47
|
|
Posted: Sat Feb 15, 2020 11:19 am |
|
|
Thank you. With A6 module works perfect. it a bit more expensive but it saves me lots of time.
I have other issue...
Error#7 Invalid Pre-Processor directive Invalid Pin
i didn found #pin_select directive in <16F1823.h>
why does it happend?
why i cant change U1RX pin port?
Code: |
#pin_select U1RX = PIN_C3
#use rs232(UART1, BAUD=9600, PARITY=N, BITS=8, stream=SERIAL_GSM , errors)
|
Another question with sleep mode.
do i need to connect special external interrupt ports in this device? or i can use whatever port i want ? |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|