CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Problem in uart communication programming

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
qwwe



Joined: 17 Sep 2017
Posts: 59

View user's profile Send private message

Problem in uart communication programming
PostPosted: Sun Sep 17, 2017 7:48 am     Reply with quote

Hello
I have written the following program.
In this program I would like to send information to the sim900 module and display the information received on an LCD. But in the Proteus simulator, in the debug mode, the line 26 reaches the program. And rs232 gives Error.
What do you think is the problem ?
Code:

#include <16f1829.h>
#include <stdio.h>
#include <string.h>
#fuses HS,wdt

#use delay(crystal=12000000,restart_wdt)
#use RS232(baud=9600,xmit=PIN_C4,RCV=PIN_C5,parity=n,bits=8,errors,ENABLE=PIN_A0,restart_wdt)

#define lcd_use_portb_lcd true
#define LCD_ENABLE_PIN  PIN_C0                                   
#define LCD_RS_PIN      PIN_C1                                   
#define LCD_RW_PIN      PIN_C2                                   
#define LCD_DATA4       PIN_B4                                   
#define LCD_DATA5       PIN_B5                                   
#define LCD_DATA6       PIN_B6                                   
#define LCD_DATA7       PIN_B7
#include <lcd.c>

char recive[10];
char dq=34,enter=13,cz=26,linfeed=10;

#int_EXT
void EXT_isr(){
disable_interrupts(INT_EXT);
printf("AT%c",enter);
delay_ms(1000);
printf("AT+IPR=0%c",enter);
delay_ms(1000);
printf("ATE0%c",enter);
delay_ms(1000);
printf("AT+CMGF=1%c",enter);
delay_ms(1000);

if (kbhit()){ 
  gets(recive);
  delay_ms(10);
  lcd_gotoxy(1,1);
  delay_ms(10);
  printf(lcd_putc,"a=%s",recive);
  }

delay_ms(10);
enable_interrupts(INT_EXT);
}


void main()
{
lcd_init();
enable_interrupts(INT_EXT);
ext_int_edge(l_to_h);
enable_interrupts(GLOBAL);

while(true){
  restart_wdt();
  }

}


Simulation images in proteus.
[img]
http://uupload.ir/files/24te_sd.png
[/img]

[img]
http://uupload.ir/files/zlt2_sd2.png
[/img]
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 8:09 am     Reply with quote

Code:

//These:
#include <stdio.h>
#include <string.h>


Should be _after_ all fuses, serial setup, clock setup etc..

You shouldn't really be doing all the work in the interrupt.
The rule for writing interrupt handlers, is that they should contain the smallest amount of code possible to handle the hardware event only.
Interrupts are already disabled once you are in an interrupt handler anyway.

Set a flag when the interrupt triggers and do the rest in the main, or simply monitor the input pin, and trigger the code when it changes.

Carriage return, codes in C as '\r'. So:
printf("AT+IPR=0%c",enter);

Just needs:
printf("AT+IPR=0\r");

etc..

Line feed is '\n'.
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 8:17 am     Reply with quote

couple of other points...

In the USE RS232(....) you have a pin designated for enable. This implies and RS485 style interface...does your SIM900 have this abilty ?


also

get rid of the WDT code. Until your program runs flawlessly a WDT is not required and could cause problems.

also

most peripherals these days are 3 volts, is your SIM900 3 volts?
good news is that PIC is 3 volt !
Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 8:38 am     Reply with quote

There is also another point.

Unless it has a hardware reset circuit, the SIM900, normally needs to be woken up. You have to either manually operate the wake up connection, or have a PIC connection to operate this, or it won't talk. It switches on in the 'idle' state.
qwwe



Joined: 17 Sep 2017
Posts: 59

View user's profile Send private message

Problem in uart communication programming
PostPosted: Sun Sep 17, 2017 10:57 am     Reply with quote

Thank you for answering
I changed the programming as follows, and the rest of the program does not stand in the order I said before.
But this time it stands in the line outlined in the screenshots below.
Namely, as it is known, it sends commands in the terminal and receives the response.
But the turn of the display shows the amount received on the LCD as you can see.
Meanwhile, I disabled the wdt, but it did not work
I simulate this in Proteus software, not in practice. As a result, the sim900 module does not need to turn on.
Thanks for the last help
Thanks for helping again

Code:

#include <16f1829.h>
#fuses HS,wdt
#use delay(crystal=12000000,restart_wdt)
#use RS232(ENABLE=PIN_A0,baud=9600,xmit=PIN_C4,RCV=PIN_C5,parity=n,bits=8,errors,restart_wdt)
#include <stdio.h>
#include <string.h>
#define lcd_use_portb_lcd true
#define LCD_ENABLE_PIN  PIN_C0                                   
#define LCD_RS_PIN      PIN_C1                                   
#define LCD_RW_PIN      PIN_C2                                   
#define LCD_DATA4       PIN_B4                                   
#define LCD_DATA5       PIN_B5                                   
#define LCD_DATA6       PIN_B6                                   
#define LCD_DATA7       PIN_B7
#include <lcd.c>
#include <stdio.h>
#include <string.h>
char recive[10];
char dq=34,enter=13,cz=26,linfeed=10,i=0;
#int_EXT
void EXT_isr(){
disable_interrupts(INT_EXT);
i=1;
delay_ms(10);
enable_interrupts(INT_EXT);
}
void main()
{

lcd_init();
enable_interrupts(INT_EXT);
ext_int_edge(l_to_h);
enable_interrupts(GLOBAL);

while(true){
if(i==1)
{
printf("AT%c",enter);
delay_ms(1000);
printf("AT+IPR=0%c",enter);
delay_ms(1000);
printf("ATE0%c",enter);
delay_ms(1000);
printf("AT+CMGF=1%c",enter);
delay_ms(1000);
if (kbhit()){ 
gets(recive);
delay_ms(10);
lcd_gotoxy(1,1);
delay_ms(10);
printf(lcd_putc,"a=%s",recive);
}
i=0;
}
restart_wdt();
}
}





[img]
http://uupload.ir/files/nidh_untitled5.png
[/img]


[img]
http://uupload.ir/files/k6b2_untitled4.png
[/img]

In addition, ccs also gives the following warnings

>>> Warning 216 "test5.c" Line 57(1,2): Interrupts disabled during call to prevent re-entrancy: (@delay_ms1)
>>> Warning 202 "test5.c" Line 19(6,8): Variable never used: dq
>>> Warning 202 "test5.c" Line 19(21,23): Variable never used: cz
>>> Warning 202 "test5.c" Line 19(27,34): Variable never used: linfeed
Memory usage: ROM=10% RAM=3% - 6%
0 Errors, 4 Warnings.
Build Successful.
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 11:03 am     Reply with quote

That is because you have put a delay in the interrupt.
Get rid of it.
Also you are still pointlessly disabling interrupts.
Code:


int1 have_interrupt=FALSE;

#int_EXT
void EXT_isr(void)
{
    have_interrupt=TRUE;
}

//Other stuff omitted

    while(true)
    {
        if(have_interrupt)
        {
             have_interrupt=FALSE; //otherwise it'll repeat forever
             printf("AT\r");
             delay_ms(1000);
             //etc..


The other errors are because you have declared three variables you don't use....
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 2:38 pm     Reply with quote

The BIG problem is that you're using a defective 'simulator', aka Proteus ! Do NOT trust that Proteus actually works, it doesn't even simulate a PIC properly, I seriously doubt they can emulate the SIM900 die.

Also you need to tell us WHICH 'SIM900' you're trying to use, the actual hardware as I still don't see why you need an 'enable' pin if using true RS232.

Without seeing a schematic as well as true parts lists, fixing code ,line by line, is a futile effort.

Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19510

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 2:45 pm     Reply with quote

He doesn't need an enable pin.
temtronic



Joined: 01 Jul 2010
Posts: 9226
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun Sep 17, 2017 3:03 pm     Reply with quote

But we don't know where he's using it... without a schematic, it's anybody's guess....
then again this is a 'Proteus Project' so it'll work no matter what !
qwwe



Joined: 17 Sep 2017
Posts: 59

View user's profile Send private message

Problem in uart communication programming
PostPosted: Sun Sep 17, 2017 11:04 pm     Reply with quote

I myself thought that the problem was from Proteus, but I wanted to make sure that the program I wrote did not have a problem.
Schematic circuit is also available at the following link.

I used an active pin to turn on an LED to indicate that the microcontroller is sending data, just that.
thank you

http://uupload.ir/files/q74h_untitled5.png
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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