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

📄 调试程序1._c

📁 这段程序是步进电机的细分驱动程序
💻 _C
📖 第 1 页 / 共 4 页
字号:
//****************************************************************************
//功能描述:引导程序 
//文件名称:AutoBootLoad.c
//更新时间:2007年03月02日
//微控制器:ATmega128
//外部时钟:12MHz
//编译版本:ICCAVR Version 6.25A Built May 15 2002 8:20:03
//特别说明:本程序使用于自动进样器改进版控制电路中,完成引导在线自动更新程序用;
//****************************************************************************

#include <iom128v.h>
#include <STDIO.H>
#include <macros.h>
#include <eeprom.h>
#include "ZDJY.h"

//void MainSend(void)

void port_init(void)               //端口初始化
{
 	 PORTA = 0xFF;
 	 DDRA  = 0xFF;
 	 PORTB = 0xFF;
 	 DDRB  = 0xFF;
 	 PORTC = 0xFF;
 	 DDRC  = 0xFF;
 	 PORTD = 0xFD;
 	 DDRD  = 0x00;
 	 PORTE = 0xFF;
 	 DDRE  = 0xFF;
     PORTF = 0xFB;
 	 DDRF  = 0xFF;
 	 PORTG = 0x1F;
 	 DDRG  = 0x1F;
}


void init_devices(void)                         //寄存器处始化        
{
 	 //stop errant interrupts until set up
 	 CLI(); //disable all interrupts
 	 XDIV  = 0x00; //xtal divider
 	 XMCRA = 0x00; //external memory
 	 port_init();

 	 MCUCR = 0x00;
 	 EICRA = 0x00; //extended ext ints
 	 EICRB = 0x00; //extended ext ints
 	 EIMSK = 0x00;
 	 TIMSK = 0x00; //timer interrupt sources
 	 ETIMSK = 0x00; //extended timer interrupt sources
	// PORTC = 0x00;
     MCUCR|= 0x80;
     //SFIOR = 0X00;
     XMCRA = 0x00; 
 	 SEI(); //re-enable interrupts
 	 //all peripherals are now initialised
}


unsigned char InitMotor(unsigned char Port)       //步进电机初始化
{
	unsigned char STRB_LOW,CLOK_LOW,DATA_LOW;
	unsigned char STRB_HIG,CLOK_HIG,DATA_HIG;
		
	if((Port>=0x01)&&(Port<=0x04))
	{		
		switch(Port)
		{
		    case 0x01:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x10;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x01;
				DATA_LOW = 0x00;
				DATA_HIG = 0x10;
			    break;
			case 0x02:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x20;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x02;
				DATA_LOW = 0x00;
				DATA_HIG = 0x20;
			    break;
			case 0x03:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x40;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x04;
				DATA_LOW = 0x00;
				DATA_HIG = 0x40;
			    break;
			case 0x04:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x80;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x08;
				DATA_LOW = 0x00;
				DATA_HIG = 0x80;
			    break;
		}
	 
		PORTB=CLOK_LOW;
		PORTB=CLOK_LOW;
		PORTE=STRB_LOW;
		PORTE=STRB_LOW;
	 
	    PORTB=DATA_HIG;  //D18		0:处于低功耗状态,输出被禁止,1:正常工作状态			
		PORTB=DATA_HIG;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_HIG;
		PORTB=DATA_HIG|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D17		11:测试状态,00:正常工作
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	     
	    PORTB=DATA_LOW; //D16
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	    
	    PORTB=DATA_LOW; //D15		00:主动模式,01:被动模式,10:禁止模式,11:下桥臂模式
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	     
	    PORTB=DATA_LOW; //D14    
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D13		00:内部4MHZ晶振,01:外部时钟,10:外部时钟1/2,11:外部时钟1/4		
		PORTB=DATA_LOW;	
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D12
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	     
	    PORTB=DATA_LOW; //D11		D11、D10、D9、D8
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	  
		
	    PORTB=DATA_HIG; //D10
		PORTB=DATA_HIG;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_HIG;
		PORTB=DATA_HIG|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D9
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D8
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D7      D7、D6、D5、D4
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	   
	    PORTB=DATA_LOW; //D6
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;	
	    
	    PORTB=DATA_HIG; //D5 
		PORTB=DATA_HIG;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_HIG;
		PORTB=DATA_HIG|CLOK_HIG;
	 
	    PORTB=DATA_LOW; //D4
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	
	    PORTB=DATA_LOW; //D3
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	
	    PORTB=DATA_HIG; //D2 		00:死区时间为4/fosc,01:死区时间为6/fosc ,10:死区时间为8/fosc,11:死区时间为12/fosc
	    PORTB=DATA_HIG;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_HIG;
		PORTB=DATA_HIG|CLOK_HIG;
	
	    PORTB=DATA_LOW; //D1
		PORTB=DATA_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_LOW;
		PORTB=DATA_LOW|CLOK_HIG;
		PORTB=DATA_LOW|CLOK_HIG;
	
	    PORTB=DATA_HIG; //D0		数据模式
		PORTB=DATA_HIG;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_LOW;
		PORTB=DATA_HIG|CLOK_HIG;
		PORTB=DATA_HIG|CLOK_HIG; 
		    
	    PORTE=STRB_HIG;	 
	    PORTE=STRB_HIG;
		
		return 0x01;
	}
	else{
		return 0x00;
	}
}
//步进电机转动函数
unsigned char OutputMotor(unsigned char Port,unsigned char Bridge1DAC,unsigned char Bridge2DAC)
{
	unsigned char STRB_LOW,CLOK_LOW,DATA_LOW;
	unsigned char STRB_HIG,CLOK_HIG,DATA_HIG;
	
	if((Port>=0x01)&&(Port<=0x04))     //四个电机端口设置
	{		
		switch(Port)
		{
		    case 0x01:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x10;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x01;
				DATA_LOW = 0x00;
				DATA_HIG = 0x10;
			    break;
			case 0x02:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x20;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x02;
				DATA_LOW = 0x00;
				DATA_HIG = 0x20;
			    break;
			case 0x03:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x40;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x04;
				DATA_LOW = 0x00;
				DATA_HIG = 0x40;
			    break;
			case 0x04:
			    STRB_LOW = 0x00;
				STRB_HIG = 0x80;
				CLOK_LOW = 0x00;
				CLOK_HIG = 0x08;
				DATA_LOW = 0x00;
				DATA_HIG = 0x80;
			    break;
		}
	 
		PORTB=CLOK_LOW;
		PORTE=STRB_LOW;

	    if((Port==1)||(Port==4))         //升降臂,进样泵电机电流0。5A
	   {
		PORTB=DATA_HIG;      //D18  	电流范围选择方式 0:VDAC/8Rs  1:VDAC/4Rs
		PORTB=DATA_HIG|CLOK_HIG; 
	   }
	   else                              //进样盘,旋转臂电机电流0。25A
	   {
		PORTB=DATA_LOW;      //D18  	电流范围选择方式 0:VDAC/8Rs  1:VDAC/4Rs
		PORTB=DATA_LOW|CLOK_HIG; 
	   }
	    PORTB=DATA_LOW;     //D17 	参考电压方式 0:内部2V参考电压 1:外部参考电压
		PORTB=DATA_LOW|CLOK_HIG; 
	
	    PORTB=DATA_LOW;   	//D16  	H桥2衰减模式 0:混合衰减模式 1:慢衰减模式//
		PORTB=DATA_LOW|CLOK_HIG;	 
	
	    PORTB=DATA_LOW;   	//D15 	H桥1衰减模式 0:混合衰减模式 1:慢衰减模式//
		PORTB=DATA_LOW|CLOK_HIG;	 	
		
 	    if(Bridge2DAC&0x80) //D14	绕组2电流方向 0:OUT2B->OUT2A	 0:OUT2A->OUT2B 	
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }	 	
	
 	    if(Bridge2DAC&0x40) //D13	绕组1电流方向 0:OUT1B->OUT1A	 0:OUT1A->OUT1B
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }	 	
		
 	    if(Bridge2DAC&0x20)           //D12   绕组2电流数据最高位   (六位 0-64)
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }  	
		
 	    if(Bridge2DAC&0x10)           //D11   绕组2电流数据第五位      
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }  	
		
 	    if(Bridge2DAC&0x08)             //D10   绕组2电流数据第四位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    } 	
		
 	    if(Bridge2DAC&0x04)               //D9   绕组2电流数据第三位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }	
		
 	    if(Bridge2DAC&0x02)                 //D8   绕组2电流数据第二位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }	
		
 	    if(Bridge2DAC&0x01)                  //D7   绕组2电流数据最低位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }	
	 	
 	    if(Bridge1DAC&0x20)                  //D6   绕组1电流数据最高位(0-64)                
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    } 	
		
 	    if(Bridge1DAC&0x10)                 //D5   绕组1电流数据第5位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }
		
 	    if(Bridge1DAC&0x08)                   //D4   绕组1电流数据第4位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    } 
		
 	    if(Bridge1DAC&0x04)                   //D3   绕组1电流数据第3位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    } 
		
 	    if(Bridge1DAC&0x02)                   //D2   绕组1电流数据第2位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    } 	
	
	    if(Bridge1DAC&0x01)                   //D1   绕组1电流数据最低位 
	    {
	       PORTB=DATA_HIG;
	       PORTB=DATA_HIG|CLOK_HIG;
	    }
	    else{
	       PORTB=DATA_LOW;
	       PORTB=DATA_LOW|CLOK_HIG;
	    }	 	

	    PORTB=DATA_LOW;                       //D0	数据模式
		PORTB=DATA_LOW|CLOK_HIG; 	 		
		
	    PORTE=STRB_HIG;	 
	    PORTE=STRB_HIG;
		
		return 0x01;
	}
	else{
		return 0x00;
	}
	
}

//输出数据
void outportb(uint Addr, uchar Data)
{
   if(Addr==D12_DATA)
   {
       USB_DATA = Data;   
   }
   else if(Addr==D12_COMMAND)
   {
       USB_COMMAND = Data; 
   }
}

//输入数据
uchar inportb(uint Addr)
{
   unsigned char Data;
   
   if(Addr==D12_DATA)
   {
      Data = USB_DATA;   
   }
   else if(Addr==D12_COMMAND)
   {
       Data = USB_COMMAND;  
   }
   
   return Data;
}

//设置地址使能
void D12_SetAddressEnable(uchar bAddress, uchar bEnable)
{
	EIMSK=0x00;
	outportb(D12_COMMAND, 0xD0);//输出指令
	if(bEnable)
		bAddress |= 0x80;
	outportb(D12_DATA, bAddress);//设置地址
	EIMSK=0x01;
}

//设置端点使能
void D12_SetEndpointEnable(uchar bEnable)
{	
	EIMSK=0x00;
	outportb(D12_COMMAND, 0xD8);//输出指令
	if(bEnable)
		outportb(D12_DATA, 1);//设置端点允许
	else
		outportb(D12_DATA, 0);//设置端点禁止
	EIMSK=0x01;
}

//模式设置
void D12_SetMode(uchar bConfig, uchar bClkDiv)
{
	outportb(D12_COMMAND, 0xF3);//设置模式
	outportb(D12_DATA, bConfig);
	outportb(D12_DATA, bClkDiv);
}

//DMA工作方式设置
void D12_SetDMA(uchar bMode)
{
 	outportb(D12_COMMAND, 0xFB);//设置DMA工作方式
	outportb(D12_DATA, bMode);
}

//读取中断寄存器
ushort D12_ReadInterruptRegister(void)
{
	uchar b1;
	uint j;
	
	outportb(D12_COMMAND, 0xF4);//读取中断寄存器
	b1 = inportb(D12_DATA);
	j = inportb(D12_DATA);
	j <<= 8;
	j += b1;
	return j;
}

//端点选择
uchar D12_SelectEndpoint(uchar bEndp)
{
	uchar c;
	
	EIMSK=0x00;
 	outportb(D12_COMMAND, bEndp);//端点选择
	c = inportb(D12_DATA);
 	EIMSK=0x01;
  	return c;
}

//读取最后传输状态
uchar D12_ReadLastTransactionStatus(uchar bEndp)
{
	outportb(D12_COMMAND, 0x40 + bEndp);//返回最后传输状态
	return inportb(D12_DATA);
}

//设置端点状态
void D12_SetEndpointStatus(uchar bEndp, uchar bStalled)
{
	EIMSK=0x00;

⌨️ 快捷键说明

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