⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fouraxis.c

📁 四轴控制电机驱动的源程序,在编译环境中已通过
💻 C
📖 第 1 页 / 共 5 页
字号:
//Target : M128,  Crystal: 8.0000Mh
#include <iom128v.h>
#include <macros.h>
#include "fouraxis.h"
#include "motion.h"
#include "Lcd.h"
#include "eeprom.h"
#include "communication.h"

unsigned char rec_tab0[30];
unsigned char rec_tab1[20];
unsigned char save_buff[4]={0x0d,0x0d,0x0d,0x0d};
unsigned char read_buff[25],temp_buff[6];

unsigned char counter,pointer11,pointer12,pointer0,key_flag1,shift_flag,
              key_interrupt_flag,f1_function,f2_function,f3_function,
			  screen_flag,input_dig_num,dummy,input_initial,
			  position_num,position_flag,repeat_flag,original_flag,slow_flag;	
unsigned char xyz_axis_flag,teaching_flag;

unsigned short k; 

//define mappings
void mapping_init(void)
{
 asm(
  ".area memory(abs)\n"
  ".org 0x3000\n"
  " _LCD:: .blkb 4\n"
  ".org 0x4000\n"
  " _DSPCHIP:: .blkb 32\n"
  ".org 0x8000\n"
  " _ESTORAGE:: .blkb 32767\n"
  ".text\n"
 );
}
									   																														  
void port_init(void)
{
   PORTA = 0xFF;																									  
   DDRA  = 0xFF;     //output
   PORTB = 0xFF;
   DDRB  = 0xFF;     //output
   PORTC = 0xFF; 		
   DDRC  = 0xFF;     //output
   PORTD = 0x00;  		
   DDRD  = 0x00;     //input without pull up
   PORTE = 0x0F;
   DDRE  = 0x0F;     //the most four  Significant bits without pull up
   PORTF = 0xFF;
   DDRF  = 0x0F;
   PORTG = 0x1F;
   DDRG  = 0x1F;      //output
}

//TIMER0 initialization - prescale:1024
// WGM: Normal
void timer0_init(void)
{
    TCCR0 = 0x00; 		  //stop
  	ASSR  = 0x00; 		  
  	TCNT0 = 0xFE; 		  //set count
  	OCR0  = 0xFA;
}

void init_devices(void)
{
    CLI(); 		  			 //disable all interrupts
 	XDIV  = 0x00; 			 //xtal divider
    mapping_init();
 	port_init();
    uart0_init();
 	uart1_init();
 	timer0_init();
 
 	MCUCR = 0xC0;
 	XMCRA = 0x0A; 			 //external memory
	
 	EICRA = 0x00; 			 //extended ext ints
 	EICRB = 0x00; 			 //extended ext ints
 	EIMSK = 0x00;
	
 	TIMSK = 0x01; 			 //timer interrupt sources
 	ETIMSK = 0x00; 			 //extended timer interrupt sources
 	SEI(); 	 				 //re-enable interrupts
}

//timer0 interrup programm
void timer0_ovf_isr(void)
{
    TCNT0 = 0x00; 		  	//reload counter value
    counter++;
 	if(counter==0xff)
  	{
	    counter=0; 
      	LED_CLEAR();        //close led         
      	TCCR0=0X00;
    }       	   		
}
     
/*-------------------- delay subroutine ------------------*/
void Delay(unsigned int k)
{
    unsigned int i,j;

    for(i=0;i<k;i++)
	    for(j=0;j<300;j++)   //300*8*0.125us=300us=0.3ms
	   	    {;}
}

//dspchip input and output example	
void inputandoutput_example(void)
{
    unsigned char temp;
	
	temp=0x55;
	
	while(DSPYIOPB ==0x55)
	 {
	   Delay(1000);
	   while((PIND&IFB)==0);
	   temp=~temp;
	   DSPXOTPB =temp;
	 }
}

void inputandoutput_example_new(void)
{
    unsigned char temp;
	
	temp=0x55;
	
	while(DSPZIOPB ==0x55)
	 {
	   Delay(1000);
	   while((PIND&IFB)==0);
	   temp=~temp;
	   DSPXOTPB =temp;
	 }
}

void external_EEPROM_write(unsigned char block_number,unsigned short EEPROM_adrr,
                           unsigned char data[25])
{  
    unsigned char j;
	unsigned short i;
    	
    if(block_number==0)         //block 0
 	  PE2_CLEAR();  
	else if(block_number==1)    //block 1
	  PE2_SET();
	  
	for(i=0+EEPROM_adrr,j=3;i<20+EEPROM_adrr;i++,j++)
	 {  
	    ESTORAGE[i]=data[j];
		Delay(50);
		if(data[j]=='\0')
		break;
	 }
}

void external_EEPROM_read(unsigned char block_number,unsigned short EEPROM_adrr,
                          unsigned char data[25])
{
    unsigned char j;
    unsigned short i;
	
    if(block_number==0)         //block 0
 	  PE2_CLEAR();  
	else if(block_number==1)    //block 1
	  PE2_SET();
	
	for(i=EEPROM_adrr,j=3;i<20+EEPROM_adrr;i++,j++)
	 {
	   if(i==EEPROM_adrr+18)
	    {
		  if((ESTORAGE[i]!=0x0D)||(ESTORAGE[i+1]!='\0'))
		   {
		     data[3]='0';
		     data[4]=0x0D;
		     data[5]='\0';
		     break;
		   }
		}
	   data[j]=ESTORAGE[i];
	   if(ESTORAGE[i]=='\0')
	    { 
	      if(ESTORAGE[i-1]==0x0D)
		  break;
	      else
	       {
             data[3]='0';
		     data[4]=0x0D;
		     data[5]='\0';
		     break;
		  } 	  
	    }
	  }
}

void screen11(unsigned char dischar)
{
  if(input_initial==0)
	{
     transmit1_cmd("200X  axis:            \r");
     input_initial=1;
    }
  dummy=8+input_dig_num;
  if(dummy>=8&&dummy<20)
    {
      temp_buff[0]='2';
      temp_buff[1]=dummy/10+0x30;
      temp_buff[2]=dummy%10+0x30;
      temp_buff[3]=dischar;
      temp_buff[4]=0x0D;
      temp_buff[5]='\0';
      transmit1_cmd(temp_buff);
      if(dummy==19)								
      transmit1_cmd("219on\r");
    }
  read_buff[input_dig_num+3]=dischar;
  if(input_dig_num==11)  
    { 
	  repeat_flag=1;
	}
  else if(input_dig_num!=11)
    {
      input_dig_num++;
	}
}

void screen12(unsigned char dischar)
{
  if(input_initial==0)
   {
     transmit1_cmd("300Y1 axis:            \r");
     input_initial=1;
   }
   dummy=8+input_dig_num;
   if(dummy>=8&&dummy<20)
    {
      temp_buff[0]='3';
      temp_buff[1]=dummy/10+0x30;
      temp_buff[2]=dummy%10+0x30;
      temp_buff[3]=dischar;
      temp_buff[4]=0x0D;
      temp_buff[5]='\0';
      transmit1_cmd(temp_buff);
      if(dummy==19)								
      transmit1_cmd("319on\r");
    }
    read_buff[input_dig_num+3]=dischar;

    if(input_dig_num==11)  
      { 
	    repeat_flag=1;
	  }
    else if(input_dig_num!=11)
      {
        input_dig_num++;
	  }
}

void screen13(unsigned char dischar)
{
    if(input_initial==0)
     {
       transmit1_cmd("400Y2 axis:            \r");
       input_initial=1;
     }
    dummy=8+input_dig_num;
    if(dummy>=8&&dummy<20)
     {
      temp_buff[0]='4';
      temp_buff[1]=dummy/10+0x30;
      temp_buff[2]=dummy%10+0x30;
      temp_buff[3]=dischar;
      temp_buff[4]=0x0D;
      temp_buff[5]='\0';
      transmit1_cmd(temp_buff);
      if(dummy==19)								
      transmit1_cmd("419on\r");
     }
    read_buff[input_dig_num+3]=dischar;

    if(input_dig_num==11)  
      { 
	    repeat_flag=1;
	  }
    else if(input_dig_num!=11)
      {
        input_dig_num++;
	  }
}

void screen21(unsigned char dischar)
{
    if(input_initial==0)
     {
       transmit1_cmd("300POSITION NO:        \r");
	   input_initial=1;
     }
    dummy=12+input_dig_num;
    if(dummy>=12&&dummy<14)
     {
      temp_buff[0]='3';
      temp_buff[1]=dummy/10+0x30;
      temp_buff[2]=dummy%10+0x30;
      temp_buff[3]=dischar;
      temp_buff[4]=0x0D;
      temp_buff[5]='\0';
      transmit1_cmd(temp_buff);
      if(dummy==13)								
      transmit1_cmd("313on\r");
     }
    read_buff[input_dig_num+3]=dischar;

    if(input_dig_num==1)  
      { 
	    repeat_flag=1;
	  }
    else if(input_dig_num!=1)
      {
        input_dig_num++;
	  }
}

void screen22(unsigned char dischar)
{
  if(position_flag==1)
   {
    if(input_initial==0)
     {
       transmit1_cmd("400DATA:               \r");
       input_initial=1;
     }
    dummy=5+input_dig_num;
    if(dummy>=5&&dummy<20)
     {
      temp_buff[0]='4';
      temp_buff[1]=dummy/10+0x30;
      temp_buff[2]=dummy%10+0x30;
      temp_buff[3]=dischar;
      temp_buff[4]=0x0D;
      temp_buff[5]='\0';
      transmit1_cmd(temp_buff);
      if(dummy==19)								
      transmit1_cmd("419on\r");
     }
    read_buff[input_dig_num+3]=dischar;

    if(input_dig_num==14)  
      { 
	    repeat_flag=1;
	  }
    else if(input_dig_num!=14)
      {
        input_dig_num++;
	  }
	xyz_axis_flag=0;  
   }	  
}

void save_parameter_data(void)
{
    unsigned char i;
   
    if(input_initial==1)
    {
      if(screen_flag==0x11)
	   {
         if((input_dig_num==11)&&(repeat_flag==1))
            input_dig_num++;
         read_buff[input_dig_num+3]=0x0D;
         read_buff[input_dig_num+4]='\0';
         external_EEPROM_write(0,max_speed_x,read_buff);
         transmit1_cmd("208on\r");
	   }
	  else if(screen_flag==0x12)
	   {
         if((input_dig_num==11)&&(repeat_flag==1))
            input_dig_num++;
         read_buff[input_dig_num+3]=0x0D;
         read_buff[input_dig_num+4]='\0';
         external_EEPROM_write(0,max_speed_y1,read_buff);
         transmit1_cmd("308on\r");
	   }
	  else if(screen_flag==0x13)
	   {
         if((input_dig_num==11)&&(repeat_flag==1))
            input_dig_num++;
         read_buff[input_dig_num+3]=0x0D;
         read_buff[input_dig_num+4]='\0';
         external_EEPROM_write(0,max_speed_y2,read_buff);
         transmit1_cmd("408on\r");
	   }  
    else if((screen_flag==0x21)||(screen_flag==0x31)||(screen_flag==0x41))	
      {
         if((input_dig_num==1)&&(repeat_flag==1)) 
            input_dig_num++;
         read_buff[input_dig_num+3]=0x0D;
         read_buff[input_dig_num+4]='\0';
       
	     position_num=0;
         for(i=3;read_buff[i]!=0x0D;i++)
           {							
             position_num=position_num*10+(read_buff[i]-0x30);
           }
         transmit1_cmd("312on\r");
         position_flag=1;
      }
    else if(screen_flag==0x22)	
     {
        if(position_flag==1)
          {
		    if(xyz_axis_flag==0)
			 {
               if((input_dig_num==14)&&(repeat_flag==1)) 
                  input_dig_num++;
               read_buff[input_dig_num+3]=0x0D;
               read_buff[input_dig_num+4]='\0';
			   teaching_flag=0;
			 }
            k=x_position_0+position_num*20;
            external_EEPROM_write(0,k,read_buff);
            transmit1_cmd("405on\r");
         }
     }
    else if(screen_flag==0x32)	
      {
        if(position_flag==1)
          {
		    if(xyz_axis_flag==0)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -