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

Aurel module and remote control servomotor

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



Joined: 17 Nov 2011
Posts: 4

View user's profile Send private message

Aurel module and remote control servomotor
PostPosted: Thu Nov 17, 2011 4:34 am     Reply with quote

Dear sir,
I need your help to use Aurel module and PIC 16F4550 to remote control sevomotors. I have make the code below for transmitter:

Code:
#include "send.h"
#include <stdlib.h>
   int16 ADC1,ADC2,ADC3,ADC4;
   int i;
  int16 ch1_result(int i)
{
         set_adc_channel(i);  //A0
         delay_us(100);
         return( read_adc());
}

void main()
{
   setup_adc_ports( ALL_ANALOG );
   setup_adc(ADC_CLOCK_DIV_32 );
   while(true)
   {
     
         ADC1=ch1_result(0)*30/1023;
         ADC2=ch1_result(1)*30/1023;
         ADC3=ch1_result(2)*30/1023;
         ADC4=ch1_result(3)*30/1023;
         printf("$%Lu-%Lu-%Lu-%Lu\n\r",ADC1,ADC2,ADC3,ADC4);
         }
         {
         delay_ms(10);
   }
   }


and the code below for receiver :

Code:
#include "recev.h"
#include <stdlib.h>
int16 i;
int iposv0,iposv1,iposv2,iposv3;
int16 donneem1, donneem2,donneem3,donneem4;
char string[35],read[35], var1[5],var2[5],var3[5],var4[5];
int etat[32];

#define servo1 PIN_B0
#define servo2 PIN_B1
#define servo3 PIN_B2
#define servo4 PIN_B3


#INT_RDA
void main_rs232rx()
{
     if(kbhit())
    {
      restart_wdt();
      gets(read);
      strcpy (string, read);
     for (i=0;i<=strlen(string);++i)
      if(string[i]=='$')
      {
      iposv0=i;
      for (i=iposv0+1;i<=strlen(string);++i)
        {
        if(string[i]=='-')
        {
         iposv1=i;
         for (i=iposv1+1;i<=strlen(string);++i)       
            if(string[i]=='-')
            {
               iposv2=i;
               for (i=iposv2+1;i<=strlen(string);++i)
                  if(string[i]=='-')
                  {
                  iposv3=i;
                  }
                  }}}}
                        }
         
      for (i=iposv0+1;i<=iposv1-1;i++)
            var1[i-1]=string[i];
            //printf("%s\r\n",var1);
      for (i=iposv1+1;i<=iposv2-1;i++)
            var2[i-iposv1-1]=string[i];
            //printf("%s\r\n",var2);
      for (i=iposv2+1;i<=iposv3-1;i++)//
            var3[i-iposv2-1]=string[i];
            //printf("%s\r\n",var3);       
      for (i=iposv3+1;i<=strlen(string);i++)//
            var4[i-iposv3-1]=string[i];     
            //printf("%s\r\n",var5);
                     donneem1=atol(var1);
                     donneem2=atol(var2);
                     donneem3=atol(var3);
                     donneem4=atol(var4);
                                       
      for (i=0;i<=3;i++)
          {
            var1[i]=' ';
            var2[i]=' ';
            var3[i]=' ';
            var4[i]=' ';
          }
}

#INT_TIMER1
void pulse_freq()
{
    set_timer1(40536);    // So that the interrupt will overflow after every 20 ms
   //output_high(PIN_A6);
   etat[30]=1;
}


void main ()
{
   int temps_ecoule=0;
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
while (TRUE)
{
      if (etat[30] == 1)
      {
      etat[30] =0;
      output_high(servo1); etat[0]= 1;
      output_high(servo2); etat[1]= 1;
      output_high(servo3); etat[2]= 1;
      output_high(servo4); etat[3]= 1;
      delay_us(800);
      for (temps_ecoule = 0; temps_ecoule <  30; temps_ecoule++)
         {
            if (etat[0] == 1 && temps_ecoule >= donneem1) { output_low(servo1); etat[0] = 0; }
            if (etat[1] == 1 && temps_ecoule >= donneem2) { output_low(servo2); etat[1] = 0; }
            if (etat[2] == 1 && temps_ecoule >= donneem3) { output_low(servo3); etat[2] = 0; }
            if (etat[3] == 1 && temps_ecoule >= donneem4) { output_low(servo4); etat[3] = 0; }
         delay_us(45);
         }
     
      }
}
}

but it can work well.
Can your help me and look at the code to fix the problem.
best regards.
Ttelmah



Joined: 11 Mar 2010
Posts: 19477

View user's profile Send private message

PostPosted: Thu Nov 17, 2011 4:49 am     Reply with quote

Start again.....

Without even looking far:
1) What is the value printed going to be for the ADC's?. You don't show us your #device ADC= line, so the default will be a number from 0 to 255. *30/1023 will then give a value from 0 to 7. If you have got 10 bit mode selected, still only going to give a value from 0 to 30.

2) Understand that the RDA interrupt means just _one_ character is waiting to be received. Don't use gets in an RDA interrupt, will stop everything else from running.

3) How does atol, expect a string to be terminated?. Are you terminating your strings this way?.

You need to step back, and change the whole approach. Look at ex_SISR.c for how to handle the RDA interrupt, then put the 'decoder' code in the main, when the end of line is received. Then terminate your strings correctly, for atol, and get the value you send to a reasonable number.....

Best Wishes
nabil



Joined: 17 Nov 2011
Posts: 4

View user's profile Send private message

PostPosted: Thu Nov 17, 2011 6:32 am     Reply with quote

Dear Sir,
Thanks for your reply and help.
It will not be easy for me to develop as I just start with PIC and PCW.

At the first time your recommandation is about Transmitter code or receiver code or both ?

About atol, looking at the library STDLIB.h, i find atol fonction:
Quote:
signed long atol(char *s);

/* Standard template: float32 strtol(char * s,char *endptr)
* converts the initial portion of the string s to a float32
* returns the converted value if any, 0 otherwise
* the final string is returned in the endptr, if endptr is not null


About RDA interrupt, how can i do?
Thanks for your help


Last edited by nabil on Thu Nov 17, 2011 11:45 pm; edited 1 time in total
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Thu Nov 17, 2011 9:26 am     Reply with quote

Hi Nabil,

I recommend that you delete the link to the file shown in your last post as you are violating the forum rules by posting CCS example code. Besides, Ttelmah gave you the name of the file, and if you own the compiler, you've got it. Why would you think that is not the correct file??

John
nabil



Joined: 17 Nov 2011
Posts: 4

View user's profile Send private message

PostPosted: Thu Nov 17, 2011 11:59 pm     Reply with quote

Dear Sir,
Can I use the functions in servos.c file in drivers folder to control servomotors with PWM ?
Best Regards.
nabil



Joined: 17 Nov 2011
Posts: 4

View user's profile Send private message

PostPosted: Tue Nov 22, 2011 7:18 am     Reply with quote

Dear Sir;
About ADC, please find below the used code:
Code:
#include <18F4550.h>
#device adc=10

#FUSES HS, WDT256, NOPROTECT, NOLVP

#use delay(clock=12000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


About gets and RDA interrupt, how can we change it ? Must I use getc() ?

Please help me
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