📄 调试程序1._c
字号:
//****************************************************************************
//功能描述:引导程序
//文件名称: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 + -