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 support@ccsinfo.com

inputing bits on port D of a PIC18F4680

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



Joined: 01 Oct 2007
Posts: 11

View user's profile Send private message

inputing bits on port D of a PIC18F4680
PostPosted: Mon Oct 15, 2007 8:02 am     Reply with quote

I hope someone can help me. I am trying to read in a 7 bit value through port D. I can only get bits 6,5,4 to read correctly but bits 3,2,1,0 are always low. I can't seem to see anything wrong with the code. The only thing I haven't tried is replacing the PIC(Last resort). Here is the code.

#include "C:\Documents and Settings\tfaulkner.OTTAWA\My Documents\Motor Controller\Software\Motor Controller V1.0.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <can-18xxx8.c>


static int step[8]; // this is an array of steps
static unsigned int8 CAN_BUS_ID; // this is the address for this antenna
static int8 CAN_ALL_ID;// This is for all calibration
static int8 MASTER_ID = 0x00;// this is the ID for the FPGA Card
static int8 buffer[8];// this data storage


Steps(); //
Calibration();
TX_CANBUS();
RX_CANBUS();

void main()
{

RX_CANBUS();


}

RX_CANBUS()
{
struct rx_stat rxstat;
int32 rx_id;

int8 rx_len;
boolean RX;





can_init();
CAN_ALL_ID = 0x7E;
set_tris_d(0xFF);
CAN_BUS_ID = input_d();
rx_id = 0;
step[0] = 0x01;
step[1] = 0x03;
step[2] = 0x02;
step[3] = 0x06;
step[4] = 0x04;
step[5] = 0x0c;
step[6] = 0x08;
step[7] = 0x09;
while(RX = TRUE)
{


if(can_kbhit()) // Message available ?
{
// If so, get the message.
if(can_getd(rx_id, buffer, rx_len, rxstat))
{

if(rx_id == CAN_BUS_ID) // Is it for this board ?
{
Steps();
TX_CANBUS();
}
if(rx_id == CAN_ALL_ID) // Is it for this board ?
{
Calibration();
TX_CANBUS();
}

}
}

}
}

Calibration()
{
int i=0;

while(LIMIT_SW_REAR == 1)
{
output_a(step[7]);//1001
delay_us(1900);
output_a(step[5]);//1100
delay_us(1900);
output_a(step[3]);//0110
delay_us(1900);
output_a(step[1]);//0011
delay_us(1900);
}

while((i<5000) && (LIMIT_SW_FRONT == 1))
{
output_a(step[1]);//1001
delay_us(2000);
output_a(step[3]);//1100
delay_us(2000);
output_a(step[5]);//0110
delay_us(2000);
output_a(step[7]);//0011
delay_us(2000);
i++;
}
}

Steps()
{
int direction;
int num_steps[7];
int i, x;
x=0;
direction = buffer[0];

/* for(i=1; i<8; i++)
{
num_steps[x]=buffer[i];
x++;
}
*/

num_steps[1] = buffer[1];
i=0;

if(direction == 1)
{
while((i<num_steps[1]))// && (LIMIT_SW_FRONT == 1))
{
output_a(step[1]);//1001
delay_us(2000);
output_a(step[3]);//1100
delay_us(2000);
output_a(step[5]);//0110
delay_us(2000);
output_a(step[7]);//0011
delay_us(2000);
i++;
}
}
else
{
while((i<num_steps[1]))// && (LIMIT_SW_REAR == 1))
{
output_a(step[7]);//1001
delay_us(2000);
output_a(step[5]);//1100
delay_us(2000);
output_a(step[3]);//0110
delay_us(2000);
output_a(step[1]);//0011
delay_us(2000);
i++;
}
}
output_a(0b0000);
// for(i=0; i<8; i++)
//{
// buffer[i]=0;
//}


}

TX_CANBUS()
{
int notify;

notify = CAN_BUS_ID;

rotate_left(&notify, 1);

can_putd(MASTER_ID, notify, 1, 1, 1, 0);


}

Thanks.
dyeatman



Joined: 06 Sep 2003
Posts: 1924
Location: Norman, OK

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 8:15 am     Reply with quote

One thought...

Look at page 139 of the data sheet (Port D) and see what else is enabled on those pins that might OVERRIDE the digital inputs.
Youngpup



Joined: 01 Oct 2007
Posts: 11

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 9:30 am     Reply with quote

I looked on Page 139. I have commented out PSP part of the 18F4680.h and the Comparator part as well. This still did not help me. Any other suggestions?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 10:00 am     Reply with quote

1. Post your compiler version.

2. Your code has some other bugs.

Quote:
Calibration()
{
int i = 0;

while(( i < 5000 ) && (LIMIT_SW_FRONT == 1))

In CCS, an 'int' is an unsigned 8-bit integer. It can only hold 0 to 255.
The code above will not work as expected.


Quote:
void main()
{

RX_CANBUS();

while(1);
}

I don't know if the RX_CANBUS() function ever returns, but if it does,
you need to place a continuous loop at the end of main(). This is to
prevent the PIC from executing the hidden sleep instruction that CCS
places there, which will put the PIC into Sleep mode.
Youngpup



Joined: 01 Oct 2007
Posts: 11

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 10:25 am     Reply with quote

Thanks for those catches. I had not tested that part of the code yet. I have been stuck on a few other issues like the one at hand. My compiler version is 3.213.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 10:43 am     Reply with quote

I don't have that version so I can't test it. I think it's likely that the
comparator is turned on. It could be that your version of the compiler
doesn't turn them off. Try adding the following code, which will turn
them off by writing directly to the CMCON register.

Code:
#byte CMCON = 0xFB4

void main()
{
CMCON = 0x07;   // Turn off the comparators




while(1);
}
Youngpup



Joined: 01 Oct 2007
Posts: 11

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 10:49 am     Reply with quote

Thank you, Thank you soooo much. It worked. You are the best.
frequentguest
Guest







PostPosted: Mon Oct 15, 2007 3:08 pm     Reply with quote

Quote:
I have commented out PSP part of the 18F4680.h and the Comparator part as well.


That was part of the problem. Commenting out part of the device header file probably won't help too much.
Ttelmah
Guest







PostPosted: Mon Oct 15, 2007 3:35 pm     Reply with quote

Youngpup wrote:
I looked on Page 139. I have commented out PSP part of the 18F4680.h and the Comparator part as well. This still did not help me. Any other suggestions?


Big hint here. The include file itself does nothing. Commenting out the stuff here, does not turn off these components, all it does, is remove the definitions _needed in the code_, to control the stuff.
The sequence to turn off the comparator, is:

setup_comparators(NC_NC_NC_NC);

Which needs the definition for 'NC_NC_NC_NC' from the include file.
PCM_programmers solution, is another way of doing exactly the same thing, for compiler versions, where the default routines do not work, but the reason it did not work for you, was that you were not loading the code to turn the parts off at all....

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Mon Oct 15, 2007 3:49 pm     Reply with quote

Normally the compiler inserts start-up code which turns off the
comparators. For example, here's the start-up code for the 18F4680
for vs. 4.058:
Code:
... void main() 
... { 
00004:  CLRF   FF8
00006:  BCF    FD0.7
00008:  CLRF   FEA
0000A:  CLRF   FE9

// Set all analog pins to be digitial i/o pins.
0000C:  MOVF   FC1,W   // ADCON1
0000E:  ANDLW  C0
00010:  IORLW  0F
00012:  MOVWF  FC1

// Turn off the Comparators.
00014:  MOVLW  07
00016:  MOVWF  FB4  // CMCON 
... 
... while(1);       
00018:  BRA    0018

My suspicion is that vs. 3.213 may not do this correctly. The power-on
reset condition for the comparators is that they are turned on. I don't
have vs. 3.213, so I can't be sure that the setup_comparators() function
works correctly either. That's why I proposed turning them off by
writing directly to the CMCON register.
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