|
|
View previous topic :: View next topic |
Author |
Message |
trentonite
Joined: 06 Apr 2010 Posts: 7
|
Need help with RX on 16F887 |
Posted: Wed Nov 03, 2010 3:28 pm |
|
|
The pic I'm using is a 16F887. The code is for a remote control for a project that is hooked up to an LCD screen (4x20). What I'm having trouble with is receiving a packet that is being sent back to me. Initially this code sends out a packet of 8 bytes, and the robot responds by sending a 16 byte packet. I've hooked up the PICkit2 to the robot to ensure that it is sending the packets back and it is, so this means I'm sending the packets just fine. To double check it I hooked the remote (which sends the 8 byte packet) up to the RX of the PICkit and it is receiving packets from the 16F887 just fine.
An example of an outgoing packet is '31 31 00 00 77 32 00 00' and an incoming packet should look like ''31 31 00 00 77 32 00 00 00 00 00 00 00 00 00 00'. I've set up the code as follows below using incPKT as the packet to be received, and outPKT as the outgoing packet.
Code: |
#include <Jinx_TestModule.h>
#include <Flex_LCD420.c>
#define PUSH_UP PIN_B5
#define PUSH_DOWN PIN_B4
#define PUSH_LEFT PIN_B3
#define PUSH_RIGHT PIN_B2
#define LED_R PIN_B1
#define LED_L PIN_B0
#define incPKT_sz 16 // incoming packet size
#define outPKT_sz 8 // outgoing packet size
#define ixSenderID 0 //
#define ixReceiverID 1 // jinx is 1
#define ixFlags 2
#define ixNumber 3
#define ixDirection 4 // w a d s
#define ixSpeed 5 // a
#define ixReserved 6
#define ixCRC 7
#define BUFFER_SIZE 24 // size of buffer (1 packet = 8bytes = 64bits)
char incPKT[incPKT_sz]; // x byte incoming packet
char outPKT[outPKT_sz]; // x byte outgoing packet
int i = 0;
void setSpeed(char direction, int8 spd) // function for sending a packet
{
outPKT[ixSenderID] = '1';
outPKT[ixReceiverID] = '1';
outPKT[ixFlags] = 0; //possible that error is due to ixSenderID = 0??
outPKT[ixNumber] = 0x00;
outPKT[ixDirection] = direction;
outPKT[ixSpeed] = spd;
outPKT[ixReserved] = 0x00;
outPKT[ixCRC] = 0x00;
}
//an outgoing packet example is '31 31 00 00 77 32 00 00'
//The below code is for an incoming packet!!!
char buffer[BUFFER_SIZE];
int8 next_in = 0;
int8 next_out = 0;
int8 ID = '1'; // this robot's id
int8 serverID = '1'; // the server this robot will listen to
//incPKT[0] = serverID;
//incPKT[1] = ID;
int1 getPacket()
{
while((next_in - next_out) >= incPKT_sz)
{
// if the next byte and the one after that are [ID],[ServerID]
if(buffer[next_out] == ID && buffer[next_out + 1] == serverID)
{
for(i = 0; i<incPKT_sz; i++)
{
incPKT[i] = buffer[next_out];
next_out++;
}
next_out = next_in; // erase the rest of the packet
return 1;
}
next_out++; // move forward in the buffer
}
return 0;
}
#int_rda
void serial_isr()
{
do
{
buffer[next_in]=getc();
if (++next_in >=BUFFER_SIZE) next_in=0;
if(next_in==next_out)
{
if (++next_out >= BUFFER_SIZE) next_out=0;
}
// Buffer full, throw oldest character - opposite of CCS here
}
while(kbhit());
}
void initInts()
{
//enable_interrupts(INT_TIMER1); // enable .5sec failsafe
enable_interrupts(INT_RDA); // enable int on rx from wireless
enable_interrupts(GLOBAL); // enable ints (master switch)
}
// interupt on uart data in (robot sends data to remote)
// this assumes the data is coming in via bytes (eg rs232)
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab
lcd_init(); // Initialize the LCD
initInts(); // Initialize the Interrupts
printf(lcd_putc, "\f"); // Clear the LCD.
delay_ms(500);
output_low(LED_R);
while(TRUE)
{
delay_ms(100);
if(getPacket()) //packet received or not
{
printf(lcd_putc, incPKT);
}
for(i=0; i <=10 ; i++)
{
if(!input(PUSH_UP))
{
printf(lcd_putc, "\fMoving Forward");
setSpeed('w',50);
output_high(LED_R);
output_high(LED_L);
break;
}
if(!input(PUSH_DOWN))
{
printf(lcd_putc, "\fMoving Backwards");
setSpeed('s',50);
output_high(LED_R);
output_high(LED_L);
break;
}
if(!input(PUSH_LEFT))
{
printf(lcd_putc, "\fTurning Left");
setSpeed('a',50);
output_high(LED_L);
break;
}
if(!input(PUSH_RIGHT))
{
printf(lcd_putc, "\fTurning Right");
setSpeed('d',50);
output_high(LED_R);
break;
}
// wait and send data
delay_ms(50);
if(i==10)
{
setSpeed('x',1); // Stopped State
for(i=0; i < outPKT_sz; i++)
{
putc(outPKT[i], wireless);
}
output_low(LED_L);
output_low(LED_R);
printf(lcd_putc, "\f");
}
}
for(i=0; i < outPKT_sz; i++)
{
putc(outPKT[i], wireless);
}
}
}
|
Any help or input on why the RX line isn't working would be greatly appreciated. |
|
|
pmuldoon
Joined: 26 Sep 2003 Posts: 218 Location: Northern Indiana
|
|
Posted: Wed Nov 03, 2010 7:42 pm |
|
|
I would suggest deleting the
Your interrupt should be fast enough to execute before the next character arrives.
I don't see how you are setting up your UART, either.
I would suggest using the compiler directives(with appropriate values for your system);
Code: |
#use delay(clock=20MHz)
#USE RS232(BAUD=9600, XMIT=PIN_B2,RCV=PIN_B3)
|
I have used the RS232 that way on almost every design and on a variety of PIC's for debugging & testing without any trouble. |
|
|
pmuldoon
Joined: 26 Sep 2003 Posts: 218 Location: Northern Indiana
|
|
Posted: Wed Nov 03, 2010 7:46 pm |
|
|
My bad. (copied first one from CCS manual).
you should ALWAYS include ERRORS in the #USE RS232 directive or the uart will hang if it has an error.
Code: |
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3,ERRORS)
|
|
|
|
trentonite
Joined: 06 Apr 2010 Posts: 7
|
|
Posted: Thu Nov 04, 2010 4:22 pm |
|
|
I'm using this setup
Code: |
#use delay(clock=4000000)
#use rs232(stream=wireless,baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,STOP=1) |
I'll try throwing errors at the end to see what happens. Thanks for the heads up, I'll keep ya posted. |
|
|
trentonite
Joined: 06 Apr 2010 Posts: 7
|
|
Posted: Sat Nov 06, 2010 10:18 pm |
|
|
Yeah still no such luck. I included errors, but received a warning that it was never used, so I doubt that was it. Also, after hooking up the tx/rx to the uart on pickit2 its still reading absolutely nothing for incoming packets.
/headscratch =\
Any more ideas? I'm lost lol. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Sun Nov 07, 2010 3:24 am |
|
|
No, you did not receive a warning that errors was never used. You received a warning that the _variable_ RS232_ERRORS was never used. Different.....
The 'ERRORS' directive does two things. It adds code to the getc, so that if an error occurs, it clears it. This is _essential_. If you do not have the ERRORS in your RS232 declaration, then _you_ must perform the same clearing operations yourself. It also declares a new variable called 'RS232_ERRORS', and when it does find an error, records this in the variable. If you never read this variable, you get the 'warning'. This however does _not_ mean that the actual recovery code is never used, it just means 'you' are not looking at the variable to see if anything has gone wrong.
Best Wishes |
|
|
pmuldoon
Joined: 26 Sep 2003 Posts: 218 Location: Northern Indiana
|
|
Posted: Sun Nov 07, 2010 8:12 am |
|
|
Okay, at this point I would back up a step.
disable your interrupts (don't enable them) and comment out your main code and replace it with something like this:
Code: |
char NewChar;
while(TRUE)
{
if(kbhit())
{
NewChar=getch();
printf(lcd_putc, "\fNewChar: %c ",NewChar + '0'); // use this line if data is binary
// printf(lcd_putc, "\fNewChar: %c ",NewChar); // use this line if data is ascii
}
}
|
I don't know if your data is binary or ascii, but I think you get the drift.
Just do something simple and see if you can detect a kbhit(). Then we can work on that. Once the Kbhit is detected, we can display some of the data. Either you're not getting any data, or something is going wrong in your code for processing it, this will tell us where to look next.
You did say you were using some pickit thing that has hardware that works, or used to, right? Or are you comparing your board to the pickit?
If this is a new board there may be some hardware issue involved. |
|
|
pmuldoon
Joined: 26 Sep 2003 Posts: 218 Location: Northern Indiana
|
|
Posted: Sun Nov 07, 2010 8:29 am |
|
|
just an FYI
Code: |
setup_spi(SPI_SS_DISABLED);
|
isn't turning off the SPI, it is enabling the SPI with SLAVE SELECT disabled.
There is no conflict with the RX/TX lines so it doesn't affect this problem, but may be an issue if you try to use PIN_C3-C5 for something. |
|
|
|
|
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
|