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

canbus - adc

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



Joined: 09 Mar 2006
Posts: 9
Location: Chile

View user's profile Send private message MSN Messenger

canbus - adc
PostPosted: Sat Aug 28, 2010 11:45 am     Reply with quote

Good day Coders:

I have 2 small circuits (18F258+mcp2551) which I've already test :

- Both circuits send and receive can data fine.
- I made some code to trigger leds from one board to the other... Smile
- I use version 4.093
------------------------------------
My problem, if I try to:

- Sample the value of the RA0 ADC
- Put it in the canbus
- Get it on the other board
- Send it to the UART

The code actually works, but only in the first loop:
- It sends the correct value the first time.
- After it repeats the first sample value...(ex: 127 127 127)
- If I reset the sender board it will sample (refresh) the new value of ADC , but still repeat the first sample.

Any ideas ? Why I'm not getting the new sample each time ??
pd: I tried adding delays.

Thanks for reading
--------------------------------------
Code for receiver board (18F258+mcp2551 + uart)
Code:

#include <18F258.h>
#fuses HS,NOWDT,NOPROTECT
#use delay (clock=20000000)
#include <can-18xxx8.c>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

void main()
{
float var1=562.289;
int   var2=876;


int32 rx_id;

int buffer[2];
int rx_len;
struct rx_stat rxstat;

//set_tris_a(11111111);
can_init();
 printf("Prueba 1 Can Bus\n");

output_high(PIN_A0);

while(TRUE)
{
  if ( can_kbhit() )
  {
     if(can_getd(rx_id, &buffer[0], rx_len, rxstat))
     {
        if ( rx_id  ==0x202)
        {
         printf("%u\n\r",buffer[0]);
         output_high(PIN_A0);
         delay_ms(50);
         output_low(PIN_A0);
         delay_ms(50);
        }
     }      
  }
}

}


Code for emitter board (18F258+mcp2551 + adc pot)
Code:

#include <18F258.h>
#fuses HS,NOWDT,NOPROTECT
#use delay (clock=20000000)
#include <can-18xxx8.c>

void main() {
int i;

can_init();

setup_port_a(RA0_ANALOG);
delay_ms(100);
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(100);
set_adc_channel(0);
delay_ms(100);

while(1)
{
   i = read_adc();
   delay_ms(100);
   can_putd(0x202, &i, 1, 1, 1, 0);
   output_high(PIN_A1);
   delay_ms(100);
}
            
}
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat Aug 28, 2010 6:15 pm     Reply with quote

Quote:
int var2=876;

In CCS, an 'int' is an 8-bit unsigned integer. It can only hold 0 to 255.

For the rest of your code, you should look at the Ex_can.c example file.
In the transmitter portion of that code, CCS calls the can_tbe() function
to check if the transmitter is ready to accept data. You're not doing that.
They also have a lot of diagnostic messages in there. I suggest that you
at least initially, try to closely follow the CCS code. Also, increase the
receive buffer to 8 bytes, just for safety. Get it working in a baseline
fashion, then modify it to suit your needs later.
criss_m



Joined: 09 Mar 2006
Posts: 9
Location: Chile

View user's profile Send private message MSN Messenger

PostPosted: Sun Aug 29, 2010 1:12 am     Reply with quote

Thanks PCM programmer:

I'll try.

By the way:

What does the "&" mean ?
in :
Code:

can_getd(rx_id, &buffer[0], rx_len, rxstat)
can_putd(0x202, &i, 1, 1, 1, 0);
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Sun Aug 29, 2010 7:04 am     Reply with quote

criss_m wrote:


By the way:

What does the "&" mean ?
in :
Code:

can_getd(rx_id, &buffer[0], rx_len, rxstat)
can_putd(0x202, &i, 1, 1, 1, 0);


That's the "address of" operator. It gets the address that the variable is stored at. In the case of the code you showed this allows can_getd to figure out where buffer[0] is stored so that it can write to it.
criss_m



Joined: 09 Mar 2006
Posts: 9
Location: Chile

View user's profile Send private message MSN Messenger

PostPosted: Thu Sep 09, 2010 3:40 am     Reply with quote

Hello Boys...

ive followed testing , i added can_tbe() condition for the transmiter code:

i found out that.

-My code seems to work but after sending 6 frames , it stops.
- It looks like the transmiter buffer gets full or something.


Any Ideas how to fix it ??? Smile

Code:

 while(TRUE)
                        {


                        if ( can_tbe()) {
                                              set_adc_channel(0);
                                              i=read_adc();
                                              buffer[0]=i;
                                              can_putd(0x202,buffer,8, 1, 1, 0);
         
                                              }
                        }
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Thu Sep 09, 2010 5:12 am     Reply with quote

criss_m wrote:
Hello Boys...

ive followed testing , i added can_tbe() condition for the transmiter code:

i found out that.

-My code seems to work but after sending 6 frames , it stops.
- It looks like the transmiter buffer gets full or something.


Any Ideas how to fix it ??? Smile


Yes, I have an idea. Try to get the receiving end to actually acknowledge the canbus frames. If it does not then you will tie up all of your transmit buffers trying to constantly resend the messages within them over and over.

Basically, do you have something else on the canbus and is it reading the frames?
criss_m



Joined: 09 Mar 2006
Posts: 9
Location: Chile

View user's profile Send private message MSN Messenger

PostPosted: Thu Sep 09, 2010 5:54 am     Reply with quote

yes i have another board , reciving the frames:

here is the important part of the code on the receiver node:

Code:

#int_canrx0
can_isr0()
{

   int buffer[8], rx_len, rx_stat;
        int32 rx_id;
        disable_interrupts(GLOBAL);
        cligne();cligne();

        if(can_getd(rx_id,buffer, rx_len,rx_stat))

        {
          if(rx_id == 0x202)    // si bonne ID

                       {
                        printf("%u\n\r",buffer[0]);
                        printf("%u\n\r",buffer[1]);
                        printf("%u\n\r",buffer[2]);
                        printf("%u\n\r",buffer[3]);
                        printf("%u\n\r",buffer[4]);
                        printf("%u\n\r",buffer[5]);
                        printf("%u\n\r",buffer[6]);
                        printf("%u\n\r",buffer[7]);
                        printf("------------------------");
               }
          }
RXB0CON.rxful=0;
RXB1CON.rxful=0;
enable_interrupts(GLOBAL);

}

Obviously im not i aknowledging the cabus frames....(any example code?)

Thanks for the hint collink!!!!!!!!!!!!!!!
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Thu Sep 09, 2010 7:02 am     Reply with quote

criss_m wrote:
yes i have another board , reciving the frames:

here is the important part of the code on the receiver node:

Obviously im not i aknowledging the cabus frames....(any example code?)

Thanks for the hint collink!!!!!!!!!!!!!!!



Your code includes explicit disabling of interrupts and reenabling. DO NOT DO THIS. Completely remove that code. That is, remove these lines:

Code:

        disable_interrupts(GLOBAL);
        cligne();cligne();
RXB0CON.rxful=0;
RXB1CON.rxful=0;
enable_interrupts(GLOBAL);


Now, when I say acknowledge I mean that the hardware must do that. This is done by successfully receiving a frame. You appear to be properly doing that (other than the issue I highlighted above.)

So, is the receiving end getting the frames? That is, are you getting output from your printf statements or do you never see any output?
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Thu Sep 09, 2010 7:05 am     Reply with quote

I take back what I said about your receive code being correct... You might be making the canbus receiver code puke by not calling it right. You need to pass the address to the buffer. Your call to can_getd should look like:

Code:

if(can_getd(rx_id,&buffer, rx_len,rx_stat))


Note the addition of a & to your original line.
criss_m



Joined: 09 Mar 2006
Posts: 9
Location: Chile

View user's profile Send private message MSN Messenger

PostPosted: Fri Sep 10, 2010 2:45 am     Reply with quote

I activated can debug..
my code are the EX_CAN_CCS_A.C EX_CAN_CCS_B.C

here is the output in the sender board:

Running...

CAN_PUTD(): BUFF=0 ID=00000202 LEN=1 PRI=1 EXT=1 RTR=0
DATA = 00

CAN_PUTD(): BUFF=1 ID=00000400 LEN=3 PRI=1 EXT=1 RTR=0
DATA = 1E 7F 02

CAN_PUTD(): BUFF=2 ID=00000202 LEN=1 PRI=1 EXT=1 RTR=0
DATA = 01

CAN_PUTD() FAIL: NO OPEN TX BUFFERS

CAN_PUTD() FAIL: NO OPEN TX BUFFERS

CAN_PUTD() FAIL: NO OPEN TX BUFFERS
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Fri Sep 10, 2010 6:11 am     Reply with quote

Your most recent post suggests that nothing is acknowledging the frames you are sending. Is your other device (the receiver in this case) getting the frames and displaying them or isn't it? It would appear that it isn't as it is not doing frame acknowledgement. If it IS getting them then chances are you've somehow set the receiving device to listen only mode or to blindly accept all frames no matter how mangled. In both cases it will not acknowledge frames.
pmuldoon



Joined: 26 Sep 2003
Posts: 218
Location: Northern Indiana

View user's profile Send private message

PostPosted: Mon Sep 13, 2010 11:40 am     Reply with quote

could it be that the terminating resistors are missing?
collink



Joined: 08 Jan 2010
Posts: 137
Location: Michigan

View user's profile Send private message Visit poster's website

PostPosted: Mon Sep 13, 2010 11:44 am     Reply with quote

pmuldoon wrote:
could it be that the terminating resistors are missing?


That's certainly a possibility but you can get away with horrific sins when it comes to terminating resistors. If the line resistance is anything from like 20 ohms to 350 ohms it will probably work with just two devices on the bus. That is, if you aren't in a noisy environment. The noisier the environment the more critical the termination, line quality, and speed.

Though the OP hasn't been by in a while. Maybe the problem is fixed?
pmuldoon



Joined: 26 Sep 2003
Posts: 218
Location: Northern Indiana

View user's profile Send private message

PostPosted: Mon Sep 13, 2010 11:49 am     Reply with quote

Yeah, just a guess. It can be an easy oversight if your swapping boards around in developement and pull the brd with the tacked-on resistor out of the system.

Funny thing is, the very first thing he said was that the communication was working fine. From the probs you pointed out, it doesnt seem like that was possible.
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