[chbot] The next steps for my bot and control board.

Michael Pearce chchrobotics@lists.linuxnut.co.nz
Sat, 30 Sep 2006 00:17:30 +1200


--Boundary-00=_a7QHFuSNcYe7ZLA
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


Sorry - Corrected Program code and Hex attached.

I had setup the oscillator and soft delay incorrectly so was 
running at 32KHz x 16 rather than 7.5Mhz x 16  (Divide 
result by 4 to get instruction time)

Mike

-- 
KIWACAN 
Electronics Design
Concept to Production

Mobile:  +64-21-249-5674
Phone:   +64-3-347-3311
Fax:     +64-3-347-2123
Website: http://www.kiwacan.co.nz


--Boundary-00=_a7QHFuSNcYe7ZLA
Content-Type: text/x-csrc;
  charset="iso-8859-1";
  name="rcpulse.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="rcpulse.c"

/**********************************************
*              rcpulse.c
*
* Simple interrupt driven RC Servo pulse generator
*
* Author: Michael Pearce <mike@kiwacan.co.nz>
*
* Started: 29 September 2006
*
* Copyright 2006 Michael Pearce All Rights reserved 
*
* Free to use in Non Commercial private projects.
* For Commercial licencing contact the author.
***********************************************
*              Version Info
***********************************************
* V1.0 - 29 September 2006
* First Draft
**********************************************/
#include "rcpulse.h"

int RC_Pulse_Done;

/**************************************
*           RCPulse_Init
*
* Setup Port pin, Timers and interrupt
*
**************************************/
void RCPulse_Init(void)
{
 T1CON=0x0000;   /* Internal OSC, Prescale=1:1 */
 RCLat=0;        /* Pin low to start with */
 RCTris=0;       /* Pin to Output */

 IPC0bits.T1IP=4;  /* Priority of 4 */
 IFS0bits.T1IF=0;   /* Clear Flag */
 IEC0bits.T1IE=1;   /* Enable Interrupt */

 RC_Pulse_Done=1;
}

/**************************************
*           RCPulse
*
* Start a RC Pulse
*
* Returns 0 if a pulse is currently active
* Returns 1 if sucessfuly started a pulse
**************************************/
int RCPulse(unsigned int Pulse)
{
 unsigned int Load;

 /* Check if already outputing a pulse */
 if(RC_Pulse_Done==0)return(0);

 /* Check Value input Limit */
 if(Pulse > RCMax) Pulse=RCMax;

 /* Calculate Timer compare value */ 
 Load=(RCBase * RCMax) + (RCBase * Pulse);
 
 TMR1=0;          /* Clear the Timer */
 PR1=Load;        /* Load the compare value */
 RCLat=1;         /* Start the Pulse */
 T1CONbits.TON=1; /* Start the Timer */

 RC_Pulse_Done=0;  /* Indicate Output is active! */

 return(1);
}

/*************************************
*           RCDone
*
* Indicates Pulse State
*
* Returns 1 for Done
* Returns 0 for pulse active
*************************************/
int RCDone(void)
{
 return(RC_Pulse_Done);
}

/*************************************
*           _T1Interrupt
*
* Interrupt to end the pulse
*************************************/
void _ISRFAST _T1Interrupt(void)
{
 RCLat=0;           /* Turn Pin Off   */
 T1CONbits.TON=0;   /* Turn Timer Off */
 IFS0bits.T1IF=0;   /* Clear Interrupt flag */
 RC_Pulse_Done=1;   /* Indicate pulse is complete */
}




--Boundary-00=_a7QHFuSNcYe7ZLA
Content-Type: text/x-chdr;
  charset="iso-8859-1";
  name="rcpulse.h"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="rcpulse.h"

#ifndef _RCPULSE_H
#define _RCPULSE_H
/**********************************************
*              rcpulse.h
*
* Author: Michael Pearce <mike@kiwacan.co.nz>
*
* Started: 29 September 2006
*
* Copyright 2006 Michael Pearce All Rights reserved 
*
* Free to use in Non Commercial private projects.
* For Commercial licencing contact the author.
***********************************************
*              Version Info
***********************************************
* V1.0 - 29 September 2006
* First Draft
**********************************************/
#include <p30fxxxx.h>

#define RCLat    _LATB0
#define RCTris   _TRISB0


/**************************************
* 8 Bit Values for 30MIP Clocking 
* Value = 0   = 0.9945ms
* Value = 255 = 1.989ms
*
* RCBase and RCMax can be changed to 
* increase or decrease the control 
* resolution.
* 
* Calculation:
* RCMax = Max Resolution value  required
*
* RCBase = 1ms/RCMax * (1/30,000,000)
*
* Note: RCMax * RCBase * 2 must be <= 65535
*************************************/
#define RCBase   117   // Number of clocks in 1/256 of a ms @ 30MIP
#define RCMax    255   // Bigest number allowed

extern void RCPulse_Init(void);
extern int RCPulse(unsigned int Pulse);
extern int RCDone(void);



#endif


--Boundary-00=_a7QHFuSNcYe7ZLA
Content-Type: text/x-hex;
  charset="iso-8859-1";
  name="RCPulse.hex"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="RCPulse.hex"

:020000040000fa
:080000000001040000000000f3
:020000040000fa
:100200002f80200080bf2000000188000000000037
:10021000050007000c0007001c020200000000009f
:100220000040da000000fe004440a9000000200069
:100230000000e0000300320000002000a001880060
:100240004440a80000000600a02920000100200072
:100250001600370062004000e080480091018800ed
:100260009001ba0062004000e080480091018800df
:100270009002ba0062004000e08048000002eb00fb
:100280006028e10005003a008301e900070033001f
:10029000038009000059eb00040037006128e100e9
:1002a000010032000082eb00050007009101880088
:1002b0001001ba000200e000e6ff3a00000005006d
:1002c000910188008002780062004000e0804800d0
:1002d0003559ba008301e900080032002559ba00f7
:1002e0008301e900050032000400e000f4ff320061
:1002f00015d9ba008301e900f1ff3a0000000600b9
:100300000000fa000000eb0020088800ca02a900e3
:10031000c602a9005109200091407800f0c8b3003e
:1003200000c0600001c4b3000140700095e0b70058
:100330008460a9008c60a8001000200000408800a4
:100340000080fa00000006000600fa00000f7800a6
:100350000008e20003003a000000eb0020079800cc
:1003600015003700f00f20009e0f1000020036002d
:10037000f00f2000000f78009e007800500720004a
:100380000008b800b248270002004000100798009b
:100390000000eb00000888001e0090001008880094
:1003a000ca02a80005e1a8000000eb000040880098
:1003b00012002000220798002e0090000080fa0012
:1003c000000006000000fa00004080000080fa00f3
:1003d0000000060000a0fe000000fa00ca02a9000a
:1003e00005e1a9008460a9001000200000408800f9
:1003f0000080fa000080fe00004006000400fa00c1
:10040000000f78001e00e000090034008038210051
:10041000100798001e0090000000e90010079800e7
:100420000000e000fbff3a001e0fe900f5ff370077
:100430000080fa00000006000200fa000080eb00d5
:1004400040158800aeff07000000eb00000f7800a9
:10045000f00f20009e0f100009003e001e007800e3
:10046000b9ff0700d7ff07000000e000fdff3200e2
:1004700040012000e1ff07001e0fe800f4ff3700f5
:1004800040062000ddff0700f00f2000000f78007d
:100490001e00e0000a0032001e007800aaff0700dc
:1004a000c8ff07000000e000fdff3200400120000f
:1004b000d2ff07001e007800650f5000f4ff3700e0
:1004c00040062000cdff07000000eb00000f780081
:1004d000f00720009e0f100013003e0001082000ce
:1004e0001e80400098ff0700b6ff07000000e000f4
:1004f000fdff320020032000c0ff0700000820009d
:100500001e00500090ff0700aeff07000000e00053
:10051000fdff320020032000b8ff07001e00780016
:10052000680f4000eaff370040062000b3ff0700d5
:04053000c5ff3700cc
:020000040000fa
:0200000401f009
:04000000e3ff00001a
:020000040000fa
:0200000401f009
:04000400ff7f00007a
:020000040000fa
:0200000401f009
:040008007fff000076
:020000040000fa
:0200000401f009
:04001400ffff0000ea
:020000040000fa
:10000800a2020000a2020000a2020000a202000058
:10001800a2020000a2020000a2020000a202000048
:10002800a2020000a2020000a2020000ea010000f1
:10003800a2020000a2020000a2020000a202000028
:10004800a2020000a2020000a2020000a202000018
:10005800a2020000a2020000a2020000a202000008
:10006800a2020000a2020000a2020000a2020000f8
:10007800a2020000a2020000a2020000a2020000e8
:10008800a2020000a2020000a2020000a2020000d8
:10009800a2020000a2020000a2020000a2020000c8
:1000a800a2020000a2020000a2020000a2020000b8
:1000b800a2020000a2020000a2020000a2020000a8
:1000c800a2020000a2020000a2020000a202000098
:1000d800a2020000a2020000a2020000a202000088
:1000e800a2020000a2020000a2020000a202000078
:0800f800a2020000a2020000b8
:020000040000fa
:10010800a2020000a2020000a2020000a202000057
:10011800a2020000a2020000a2020000a202000047
:10012800a2020000a2020000a2020000ea010000f0
:10013800a2020000a2020000a2020000a202000027
:10014800a2020000a2020000a2020000a202000017
:10015800a2020000a2020000a2020000a202000007
:10016800a2020000a2020000a2020000a2020000f7
:10017800a2020000a2020000a2020000a2020000e7
:10018800a2020000a2020000a2020000a2020000d7
:10019800a2020000a2020000a2020000a2020000c7
:1001a800a2020000a2020000a2020000a2020000b7
:1001b800a2020000a2020000a2020000a2020000a7
:1001c800a2020000a2020000a2020000a202000097
:1001d800a2020000a2020000a2020000a202000087
:1001e800a2020000a2020000a2020000a202000077
:0801f800a2020000a2020000b7
:020000040000fa
:1005340000080000020000000000000000000000ad
:020000040000fa
:040544000000fe00b5
:00000001FF

--Boundary-00=_a7QHFuSNcYe7ZLA
Content-Type: text/x-csrc;
  charset="iso-8859-1";
  name="rctest.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="rctest.c"

/***************************
* rctest.c
*
* Test code for RCPulse code
****************************/
#include <p30fxxxx.h>
#include "rcpulse.h"

_FOSC(CSW_FSCM_OFF & FRC_PLL16);    /* Internal Osc PLLx16 = 30MIP */
_FWDT(WDT_OFF);                     /* Watchdog Off */
_FBORPOR(PBOR_OFF & MCLR_EN);       /* Brownout Disabled - MCLR Enabled */
_FGS(CODE_PROT_OFF);                /* Code Protect OFF */

void DelayMs(int dly)
{
 unsigned int x;

 while(dly >0)
 {
  x=5000;  
  while(--x)continue;  
  dly--;
 }
}

int main(void)
{
 unsigned int pos;
  
 ADPCFG=0xFFFF; /* All to Digital pins! */
 
 RCPulse_Init();
 
 while(1)
 {
  for(pos=0;pos<256;pos++)
  {
   RCPulse(pos);
   while(RCDone()==0);
   DelayMs(20);   /* 20mS delay min between pulses */
  }

  DelayMs(100);
  

  for(pos=255;pos>0;pos-=5)
  {
   RCPulse(pos);
   while(RCDone()==0);
   DelayMs(20);   /* 20mS delay min between pulses */
  }

  DelayMs(100);

  /* Bounce between extreams and eventually end up in the middle*/
  for(pos=0;pos<128;pos+=8)
  {
   RCPulse(pos+128);
   while(RCDone()==0);
   DelayMs(50);  

   RCPulse(128-pos);
   while(RCDone()==0);
   DelayMs(50);  
  }

  DelayMs(100);
 }
  
 return(0);	
}

--Boundary-00=_a7QHFuSNcYe7ZLA--