Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

Chip talk

Status
Not open for further replies.

dreamproject

New Member
Hi all,

Could anyone review the code i have written ?. This is written in PIC C to control a lm629 motioncontol IC. I have also included a schematic of my circuit . Could any one review the circuit for errors . Please find the following links that i've used to help me in my design . Thanks a ton for your time and effort.

1. **broken link removed**
2. **broken link removed**
3. **broken link removed**
4. **broken link removed**
5. PIC 16 F 877 data sheet

Here is the code :
Code:
// ****  Kindly maximize the screen , (c) D.Ajay kumar , March , 2005  ****
//
// This Program is written in PIC C to interface a PIC16F877 to a LM629 , The program is expected to execute the following  

// operation ," Independent of the current resting position of the motor shaft , the shaft will complete thirty revolutions
// in the reverse direction . Total time for the move is fifteen seconds. Total time for accn and deceleration is five secs"
// **         ---- This system uses a 2500 cpr encoder ----            ** 
// Total counts for this position 2500 cpr x 4 counts/cycle = 10000 counts / rev.
// 10000 x 30 rev = 300000 counts
// 300000/5 = 60000 counts during acceleration and deceleration
// 60000/2 = 30000 counts during acceleration
// Sample perion of system = 2048 x (1/6x10e6) =  341 x 10e-6 seconds/sample.   ---- note : 6 MHz clock ----
// The number of samples during accn. (and deceleration) = 2.5 secs / (341x10e-6) = 7332 samples during accn/ decleration.
// s=ut + 1/2 at^2
// a=2s/t^2  = (2 x 30000 counts) / (7332 samples)^2 = 0.00111 counts / sample^2
// Total counts travelled at max velocity is 4/5th of total counts travelled 
// (4x 300000)/5 = 240000 counts.
// Number of samples at maximum velocity  10 seconds / (341 x 10e-6) = 29325  samples.
// Using counts/sample velocity is found  :  240000/29325 = 8.184 counts / sample.
// Scale acceleration values: 0.00111 x 65536 = 72.744 counts /sample^2
// Scale velocity values : 8.184 x 65536 = 536346.624 counts/sample.
// Round values to the nearest integer:
// Acceleration = 73 = 00 00 00 49 hex counts/sample ^2 ----------------------------------------------(1)
// Velocity = 536347 = 00 08 2F 1B hex counts/sample    ----------------------------------------------(2)
// Position =-300000 = FF FB 6C 20 hex counts           ----------------------------------------------(3)


#include "C:\pic\Examples\motorfin.h"
#byte TRISB=0x86     // Initialize PORTB
#byte TRISD=0x88     // Initialize PORT D
#byte PORTB=0x06     // Set up PORT B
#byte portd=0x08     // Set up PORT D
#bit rst=0x08.7      // Define RESET pin to PORT B7
#bit ps=0x08.6       // Define Port Select to PORT B6
#bit wr=0x08.5       // Define Write to PORT B5
#bit rd=0x08.4       // Define Read to PORT B4
#bit RB0=0x06.0      // Define RB0 (busy-bit pin)
void init_mod(void); 
void filter_mod(void);
void busy_bit(void);
void status_check(void);
void out_c(short);
void out_d(short);
int sw;
void main() 
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);

while(1)
   {
   TRISD=0x00;      // Set PORT D as INPUT
   init_mod();      // Call Initialize function
   filter_mod();    // Call Filter function
   out_c(0x1f);     // Call out_command module and load the trajectory parameters input buffers
   busy_bit();      // Call busy bit check module
   out_d(0x00);     // Call out data module and output HB of trajectory control word
   out_d(0x2b);     // All three parameters (pos,vel,acc) will be loaded and all are relative
   busy_bit();      // Call busy bit check module
   out_d(0x00);     // Accn. data HIGH word HB, refer note ......(1)
   out_d(0x00);     // Accn. data HIGH word LB
   busy_bit();      // Call busy bit check module
   out_d(0x00);     // Accn data LOW word HB
   out_d(0x49);     // Accn data LOW word LB
   busy_bit();      // Call busy bit check module
   out_d(0x00);     // Vel. HIGH word HB, refer note ............(2)
   out_d(0x08);     // Vel. HIGH word LB
   busy_bit();      // Call busy bit check module
   out_d(0x2f);     // Vel. LOW word HB
   out_d(0x1b);     // vel. LOW word LB
   busy_bit();      // Call busy bit check module
   out_d(0xff);     // Pos. HIGH word HB, refer note ............(3)
   out_d(0xfb);     // Pos. HIGH word LB
   busy_bit();      // Call busy bit check module
   out_d(0x6c);     // Pos. LOW word HB
   out_d(0x20);     // Pos. LOW word LB
   busy_bit();      // Call busy bit check module
   out_c(0x01);     // STT issued to execute trajectory

   }
}

                    // ** BUSY BIT CHECK MODULE ** // 
busy_bit()
{
//                **   CS pin is permanently grounded (Low)   **                

TRISB=0xff;         // Set PORT B as OUTPUT
portd = 0xFF;       // Output '11111111' on PORT D
ps=0;               // Set PS=0
rd=0;               // Set RD=0
while(RB0);         // Wait till Busy_bit pin is set (RB0)
ps=1;               // Set PS=1
rd=1;               // Set RD=1
portd = 0xFF;       // Output '00000000' on PORT D
}
                    
                    // ** INITIALIZATION MODULE ** //

init_mod()
{
portd = 0xFF;

begin:              // Label
rst=0b0;            // Set Reset Low
delay_ms(1);        // Call Delay 1 ms.
rst=0b1;            // Set Reset High
delay_ms(3);        // Call Delay 3 ms.
status_check();     // Call Status Check function 
                    // Check if Status Word is hex 'c4' or '84' 
if(!(sw==0xc4 || sw==0x84)) goto begin;        
    else	    	
       {
       out_c(0x1d); // Tells which Interrupts to reset as indicated by zero's in the next data word
       busy_bit();  // Call busy bit check module
       out_d(0x00); // Don't Care data.
       out_d(0x00); // All interrupts will be reset
       busy_bit();  // Call busy bit check module
       status_check(); // Call Status Check function
                    // Check if status word is hex 'c0' or '80'
if(!(sw==0xc0||sw==0x80))               
           goto begin;
       busy_bit();  // Call busy bit check module
       }
portd = 0xFF;       // Output '11111111' on PORT D
}


                    // ** FILTER PROGRAMMING MODULE ** //

void filter_mod(void)
{
out_c(0x1e);        // LFIL command - initiates loading filter co-efficients.
busy_bit();         // Call busy bit check module
out_d(0x00);        // Filter control word , indicates which values Kp,Ki,Kd,Il will be loaded
out_d(0x0e);        // selects that kp,ki,kd values will be loaded
busy_bit();         // Call busy bit check module
out_d(0x00);        // kp values 8 bit HB
out_d(0x0a);        // LB
busy_bit();         // Call busy bit check module
out_d(0x00);        // ki values 8 bit HB
out_d(0x00);        // LB
busy_bit();         // Call busy bit check module
out_d(0x00);        // kd values 8 bit HB
out_d(0x00);        // LB
busy_bit();         // Call busy bit check module
out_c(0x04);        // Transfer new filter co-efficients to Working register
busy_bit();         // Call busy bit check module
}

                    // ** DATA OUT FUNCTION ** //

out_d(int dat)
{
TRISB=0xff;         // Set PORT B as outputs
portd = 0xFF;       // Output '11111111' on PORT D
ps=1;               // Set PS high
rd=1;               // Set RD high
wr=0;               // Set WR low
PORTB=dat;          // Output 'dat' on PORT B
wr=1;               // Set WR high for sending next byte
portd = 0xFF;       // Output '11111111' on PORT D
}

                    // ** COMMAND OUT FUNCTION **//
out_c(int com)
{
TRISB=0xff;         // Set PORT B as outputs
portd = 0xFF;       // Output '11111111' on PORT D
ps=0;               // Set PS low
wr=0;               // Set WR low
rd=1;               // Set RD high 
PORTB=com;          // Output 'com' on PORT B
wr=1;               // Set WR high for sending next byte
portd = 0xFF;       // Output '11111111' on PORT D
}

                    // ** STATUS CHECK FUNCTION ** //
status_check()
{
TRISB=0xff;         // Set PORT B as outputs
portd = 0xFF;       // Set PORT D as outputs 
ps=0;               // Set PS low
rd=0;               // Set RD low
wr=1;               // Set WR high
delay_ms(1);        // Call Delay for 1 ms
sw=PORTB;           // Store PORTB value in 'sw'
rd=1;               // Set RD high
portd = 0xFF;       // Output '11111111' on PORT D
}


**broken link removed**

Thanks for looking , Regards
 
What exactly are we looking at/for? Have you built the circuit and tested it yet? What were the results? Have you simulated the C code? What were the results?

Tell us what's happening here and then we can begin narrowing down what the problem might be...


and the link to your circuit isn't working for me. is it a picture? try attaching it to a post.
 
Yes, this isn't a 'free design service', try designing your program! - break it down into individual parts and test and debug each part on it's own - basic software design principles!.
 
sorry

Hi all,

I am sorry if I offended you guys . But ,the problem here is that I have sucessfully run the program in MPLAB"s simulator .The program seems to be fine there but it does not seem to work in the circuit . I just wanted to know , if the timing , handshakes were okay . I understand that this could be tedious for someone who hasn't worked with the LM629 but it would be easy for someone who has done this before . I took the liberty of making some assumptions while designing the ciruit . I just wanted to know if they were right .

Thanks and sorry again
 

Attachments

  • finalpin.gif
    finalpin.gif
    23.7 KB · Views: 1,577
Someone Electro said:
is it a 1 april joke?

I see two identical schematics

he was having trouble posting it and i think it just now started working, so yea, they are the same.
 
Hola, alguien a podido trabajar con el LM629??

Translation... Hello, has anyone have worked with the LM629??

MOD EDIT English only please....
 
Last edited by a moderator:
Status
Not open for further replies.

New Articles From Microcontroller Tips

Back
Top