|
|
View previous topic :: View next topic |
Author |
Message |
leojma
Joined: 25 Feb 2013 Posts: 6
|
kbhit() Problem |
Posted: Sat Mar 02, 2013 7:43 pm |
|
|
Hi, I have a gps and two PIC 16F877.
The GPS sends the data infinitely to pic # 2 and I want to take the data to send to pic 1.
This is the code:
Code: |
while (1)
{
if (kbhit ())
{
valor_ready = getc ();
if ((cont_ready == 18) && (valor_ready == ','))
{
if (input_state (pin_a3) == 0)
{
output_d (valor_ready);
output_bit (pin_a3, 1);
permiso1 = 0;
}
if (input (pin_a4) == 1)
output_bit (pin_a3, 0);
}
cont_ready + +;
}
}
}
|
The problem I have is entering the if (kbhit ()) only 3 times and the program stops.
The GPS data is sending endlessly, but does not take the data.
Please help! |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19545
|
|
Posted: Sun Mar 03, 2013 2:44 am |
|
|
Nothing ever resets cont_ready. Once it passes 18 nothing more will happen.
Remember also the entire operation will depend on what actual signal levels the pins go to. If the load on A3 is too much for it to actually be seen as a logic 0, the input_state test won't go true, etc. etc..
Best Wishes |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Mar 03, 2013 5:45 am |
|
|
The sample code is not complete so it is hard to tell, but there might be another problem too: make sure you have added 'ERRORS' to the '#USE RS232' line.
Without the ERRORS keyword you are responsible for clearing buffer overrun errors in the hardware UART. 99% of the programmers want the compiler to handle this, so always add ERRORS unless you have a very good reason to leave it out.
On buffer overflow the UART will stop receiving after 2 (or 3?) characters which sounds similar to your problem. |
|
|
leojma
Joined: 25 Feb 2013 Posts: 6
|
|
Posted: Sun Mar 03, 2013 1:24 pm |
|
|
ok, fix the code, and discovered that if inside the if (kgbit ()) write any line containing the variable to get the gps (valor_ready) the program does not work, just go in if (kgbit ()) 2 or 3 times. why this happens? if I put a: printf ("% u", variable_ready) or if (variable_ready == 1) the program crashes and does not continue and if not put "variable_ready" works!
Code: | #include <16f877a.h>
#use delay (clock = 4 M) //Reloj de 4 Megahertz
#include <LCD.h>
#include <stdlib.h>
#use RS232 (baud=9600, bits =8, parity= N, xmit= pin_c6, rcv=pin_c7)
#fuses HS,NOWDT,NOPUT,NOPROTECT
int8 ceros=0;
int cont_ready=0;
char valor_ready;
void Gps_ready()
{
while(1)
{
if(kbhit())
{
valor_ready=fgetc();
if ((cont_ready==18)) //the condition should be: if ((cont_ready==18)&&(valor_ready==','))
{
if (input_state(pin_a3) == 0)
{
output_d(ceros);
output_bit(pin_a3,1);
}
if (input(pin_a4)==1)
output_bit(pin_a3,0);
cont_ready=-1;
printf("valor: %u",valor_ready);//this does not work
}
cont_ready++;
}
}
}
void main()
{
set_tris_a(0x15);
set_tris_e(0);
set_tris_b(0);
set_tris_d(0);
set_tris_c(0xbf);
output_bit(pin_a3,0);
Gps_ready();
}
|
|
|
|
leojma
Joined: 25 Feb 2013 Posts: 6
|
|
Posted: Sun Mar 03, 2013 1:33 pm |
|
|
Ttelmah wrote: | Nothing ever resets cont_ready. Once it passes 18 nothing more will happen.
Remember also the entire operation will depend on what actual signal levels the pins go to. If the load on A3 is too much for it to actually be seen as a logic 0, the input_state test won't go true, etc. etc..
Best Wishes |
Ok, fix the code, and discovered that if inside the if (kbhit ()) write any line containing the variable to get the gps (valor_ready) the program does not work, just go in if (kbhit ()) 2 or 3 times. Why this happens? If I put a: printf ("% u", variable_ready) or if (variable_ready == 1) the program crashes and does not continue and if not put "variable_ready" works!
Code: |
#include <16f877a.h>
#use delay (clock = 4 M) //Reloj de 4 Megahertz
#include <LCD.h>
#include <stdlib.h>
#use RS232 (baud=9600, bits =8, parity= N, xmit= pin_c6, rcv=pin_c7)
#fuses HS,NOWDT,NOPUT,NOPROTECT
int8 ceros=0;
int cont_ready=0;
char valor_ready;
void Gps_ready()
{
while(1)
{
if(kbhit())
{
valor_ready=fgetc();
if ((cont_ready==18)) //the condition should be: if ((cont_ready==18)&&(valor_ready==','))
{
if (input_state(pin_a3) == 0)
{
output_d(ceros);
output_bit(pin_a3,1);
}
if (input(pin_a4)==1)
output_bit(pin_a3,0);
cont_ready=-1;
printf("valor: %u",valor_ready);//this does not work
}
cont_ready++;
}
}
}
void main()
{
set_tris_a(0x15);
set_tris_e(0);
set_tris_b(0);
set_tris_d(0);
set_tris_c(0xbf);
output_bit(pin_a3,0);
Gps_ready();
} |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19545
|
|
Posted: Sun Mar 03, 2013 1:44 pm |
|
|
You haven't added ERRORS.
Your print will take up to about 10mSec to execute. All this time your loop will not be reading the serial port, so the hardware buffer (less than 2 characters), _will_ overflow. This will then hang the UART...
Add ERRORS, and add the serial buffer code from ex_sisr. Call bkbhit, instead of kbhit, and bgetc, instead of getc. This way the serial will be handled while you are printing, and the UART won't get hung.
Best Wishes |
|
|
|
|
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
|