|
//ICC-AVR application builder : 2011-12-22 11:22:21
// Target : M64
// Crystal: 7.3728Mhz
#include <iom64v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define STEPPING_CP BIT(PB0)
#define tc0_ov_enable() (TIMSK |= BIT(TOIE0))
#define tc0_ov_stop() (TIMSK &= ~BIT(TOIE0))
#define tc1_ov_enable() (TIMSK |= BIT(TOIE1))
#define tc1_ov_stop() (TIMSK &= ~BIT(TOIE1))
#define OutEnable BIT(0)
#define speedup BIT(1)
#define finished BIT(2)
#define temps 0x80;
#define A0 (PINA&0X01)
#define A1 (PINA&0X02)
#define A2 (PINA&0X04)
#define A3 (PINA&0X08)
#define A4 (PINA&0X10)
#define A5 (PINA&0X20)
uchar status,
step_add,
step_ground,
ma_da_bit=0,
ma_da_out_ok=0;
uint speedup_steps,
speedup_steps_B,
RollSteps;
const unsigned int WaitTable[]={
0xEA7E, 0xEBD3, 0xECE6, 0xEDF5, 0xEEE8, 0xEFC2, 0xF088, 0xF13C, 0xF1E0, 0xF277, // 10
0xF301, 0xF381, 0xF3F8, 0xF466, 0xF4CC, 0xF535, 0xF58E, 0xF5E1, 0xF630, 0xF679, // 20
0xF6BF, 0xF701, 0xF73F, 0xF77F, 0xF7B7, 0xF7EC, 0xF81F, 0xF84F, 0xF87C, 0xF8A8, // 30
0xF8D6, 0xF8FD, 0xF924, 0xF948, 0xF96B, 0xF98D, 0xF9AD, 0xF9CC, 0xF9ED, 0xFA0A, // 40
0xFA26, 0xFA40, 0xFA5A, 0xFA73, 0xFA8B, 0xFAA3, 0xFAB9, 0xFACF, 0xFAE4, 0xFAF9, // 50
0xFB0C, 0xFB20, 0xFB32, 0xFB45, 0xFB56, 0xFB67, 0xFB78, 0xFB88, 0xFB98, 0xFBA7, // 60
0xFBB6, 0xFBC5, 0xFBD3, 0xFBE1, 0xFBEE, 0xFBFA, 0xFC07, 0xFC13, 0xFC1F, 0xFC2B, // 70
0xFC37, 0xFC41, 0xFC4C, 0xFC57, 0xFC62, 0xFC6B, 0xFC76, 0xFC80, 0xFC89, 0xFC92, // 80
0xFC9B, 0xFCA5, 0xFCAD, 0xFCB6, 0xFCBE, 0xFCC6, 0xFCCE, 0xFCD6, 0xFCDE, 0xFCE5, // 90
0xFCEC, 0xFCF4, 0xFCFB, 0xFD02, 0xFD09, 0xFD10, 0xFD16, 0xFD1C, 0xFD23, 0xFD29, // 100
0xFD2F, 0xFD35, 0xFD3B, 0xFD41, 0xFD46, 0xFD4C, 0xFD52, 0xFD57, 0xFD5C, 0xFD62, // 110
0xFD67, 0xFD6C, 0xFD71, 0xFD76, 0xFD7B, 0xFD7F, 0xFD84, 0xFD88, 0xFD8D, 0xFD92, // 120
0xFD96, 0xFD9A, 0xFD9F, 0xFDA3, 0xFDA7, 0xFDAB, 0xFDAF, 0xFDB3, 0xFDB7, 0xFDBB, // 130
0xFDBE, 0xFDC2, 0xFDC6, 0xFDCA, 0xFDCD, 0xFDD1, 0xFDD4, 0xFDD8, 0xFDDB, 0xFDDF, // 140
0xFDE2, 0xFDE5, 0xFDE8, 0xFDEB, 0xFDEF, 0xFDF2, 0xFDF5, 0xFDF8, 0xFDFB, 0xFDFE, // 150
0xFE01, 0xFE04, 0xFE06, 0xFE09, 0xFE0C, 0xFE0F, 0xFE11, 0xFE14, 0xFE17, 0xFE19, // 160
0xFE1C, 0xFE1E, 0xFE21, 0xFE23, 0xFE26, 0xFE28, 0xFE2B, 0xFE2D, 0xFE2F, 0xFE32, // 170
0xFE34, 0xFE36, 0xFE39, 0xFE3B, 0xFE3D, 0xFE3F, 0xFE41, 0xFE43, 0xFE46, 0xFE48, // 180
0xFE4A, 0xFE4C, 0xFE4E, 0xFE50, 0xFE52, 0xFE54, 0xFE56, 0xFE58, 0xFE5A, 0xFE5B, // 190
0xFE5D, 0xFE5F, 0xFE61, 0xFE63, 0xFE65, 0xFE66, 0xFE68, 0xFE6A, 0xFE6B, 0xFE6D, // 200
0xFE6F, 0xFE71, 0xFE72, 0xFE74, 0xFE75, 0xFE77, 0xFE79, 0xFE7A, 0xFE7C, 0xFE7D, // 210
0xFE7F, 0xFE80, 0xFE82, 0xFE83, 0xFE85, 0xFE86, 0xFE88, 0xFE89, 0xFE8B, 0xFE8C, // 220
0xFE8E, 0xFE8F, 0xFE90, 0xFE92, 0xFE93, 0xFE94, 0xFE96, 0xFE97, 0xFE98, 0xFE9A, // 230
0xFE9B, 0xFE9C, 0xFE9E, 0xFE9F, 0xFEA0, 0xFEA1, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, // 240
0xFEA7, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEB0, 0xFEB1, 0xFEB2, // 250
0xFEB3
};
void delay_1us(void) //1us延时函数
{
asm("nop");
}
void delay_nus(unsigned int n) //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}
void delay_1ms(void) //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}
void delay_nms(unsigned int n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0xFF;
DDRB = 0xFF;
PORTC = 0xFF; //m103 output only
DDRC = 0x1F;
PORTD = 0xFF;
DDRD = 0xFA;
PORTE = 0xFF;
DDRE = 0xF3;
PORTF = 0xFF;
DDRF = 0x00;
PORTG = 0x1F;
DDRG = 0x1B;
}
void shortdelay(unsigned char tt)
{
asm(" _L2:subi R16,1");
asm(" brne _L2");
asm(" ret");
}
//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1mSec
// actual value: 0.999mSec (0.1%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFC; //setup
TCNT1L = 0x67;
OCR1AH = 0x03;
OCR1AL = 0x99;
OCR1BH = 0x03;
OCR1BL = 0x99;
OCR1CH = 0x03;
OCR1CL = 0x99;
ICR1H = 0x03;
ICR1L = 0x99;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
PORTB &= ~STEPPING_CP;
TCNT1 = WaitTable[step_add];
shortdelay(20);
PORTB |= STEPPING_CP;
//PORTB ^= STEPPING_CP;
if(status & speedup )// 如果是在降速或者均速
{
if(speedup_steps == 0 ) //均速段
{
RollSteps -- ; // 均速段长度减1
if ( RollSteps == 0 )
{ //如果减完转,降速
speedup_steps = speedup_steps_B; //降速段长度(台阶数)
step_ground = 11; //开始一个新的台阶
}
}
else //开始减速
{
if(--step_ground == 0 ) //台阶内步数变量
{
step_add--;
if( --speedup_steps == 0 ) //当前速度计算所得变量
{
tc1_ov_stop();
TCCR1B = 0b00000000;
ma_da_out_ok=1;
}
else
step_ground = 11; //开始一个新的台阶
}
}
}
else
{
if( --step_ground == 0 )//台阶内步数变量
{
step_add++; //加速
if (--speedup_steps == 0 )//当前速度计算所得变量
{
status |= speedup;//BIT(1)加减速完成
//RollSteps --; //填充脉冲数变量
}
else step_ground = 11; //开始一个新的台阶
}
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
// timer1_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x04; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void stepctlout(uint mai_chong,uchar xi_fen)
{
if(ma_da_bit==0&&ma_da_out_ok==1)
{ ma_da_out_ok=0;
ma_da_bit=1;
RollSteps=mai_chong*xi_fen;
step_ground=11; //每级台阶宽度
speedup_steps=RollSteps/33 ; //梯形速度曲线
if(speedup_steps>0x50)speedup_steps=0x50;//最高速度限制
speedup_steps_B = speedup_steps; //升降速台阶数备份
RollSteps-= speedup_steps*22; //留下恒速部分步数
status &= ~speedup; //加速开始
step_add =30;
TCCR1B = 0b00000010;
TCNT1 = WaitTable[step_add];
tc1_ov_enable();
}
}
void main(void)
{
init_devices();
ma_da_out_ok=1;
while(1)
{
//stepctlout(2000,1);//驱动输出
if(ma_da_out_ok==1&&(A0==0))
{
ma_da_bit=0;
stepctlout(200,1);//驱动输出
}
if(ma_da_out_ok==1&&(A1==0))
{
ma_da_bit=0;
stepctlout(400 ,1);//驱动输出
}
if(ma_da_out_ok==1&&(A2==0))
{
ma_da_bit=0;
stepctlout(600 ,1);//驱动输出
}
if(ma_da_out_ok==1&&(A3==0))
{
ma_da_bit=0;
stepctlout(800 ,1);//驱动输出
}
if(ma_da_out_ok==1&&(A4==0))
{
ma_da_bit=0;
stepctlout(1000,1);//驱动输出
}
if(ma_da_out_ok==1&&(A5==0))
{
ma_da_bit=0;
stepctlout(2000,1);//驱动输出
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|