📄 0417.c
字号:
#include<avr/io.h>
#include<avr/pgmspace.h>
#include <compat/ina90.h>
#include<avr/signal.h>
uint8_t dirstate,xfnum;
uint8_t buf[4];
prog_char A[80]={255,255,254,253,252,250,248,245,242,239,
236,232,227,222,217,212,206,200,194,187,
180,173,166,158,150,142,133,125,116,107,
98, 88, 79, 70, 60, 50, 40,30, 20, 10,
0, 10, 20, 30,40, 50, 60,70, 79, 88,
98,107,116,125,133,142,150,158,166,173,
180,187,194,200,206,212,217,222,227,232,
236,239,242,245,248,250,252,253,254,255
};
prog_char B[160]= {8, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, //40
2, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,//80
4, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,//120
1, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9,//160
};
uint8_t stage_drop,space_drop;
uint8_t phasestep,phaseout,currenta,currentb,space,table;
volatile uint8_t stage,stage1,cpnum;
void delay(uint8_t k) //;16m -0.5s
{
uint8_t i,j,m,n;
for(i=0;i<k;i++)
{
for(j=0;j<20;j++)
{
for(m=0;m<200;m++)
{
for(n=0;n<200;n++)
;
}
}
}
}
//电流初始化
void initialcurrent(void)
{
currenta=pgm_read_byte(&A[0]);
currentb=pgm_read_byte(&A[40]);
phaseout=pgm_read_byte(&B[0]);
phaseout<<=4;
PORTA|=phaseout;
PORTC=currenta;
asm volatile("sbi 0x1B,2"::);//daca
asm volatile("cbi 0x1B,1"::);//wr
asm volatile("sbi 0x1B,1"::);//wr
PORTC=currentb;
asm volatile("cbi 0x1B,2"::);//daca
asm volatile("cbi 0x1B,1"::);//wr
asm volatile("sbi 0x1B,1"::);//wr
}
//0 0 0 //5 对于清华丰10/5细分,将拨码3,2拨到地,用拨码1切换
//0 0 1 //10
//0 1 0 //8 对于万博丰10/8细分,将拨码3接地,拨码2接1,用拨码1切换
//0 1 1 //10
//1 1 1 //2
//1 1 0 //20
void loadbm(void)
{
xfnum=PIND&0xf8; //pd2,pd1,pd0 三位拨码
switch(xfnum)
{
case 0: space=4;table=0;break; //5
case 1: space=4;table=0;break; //10
case 2: space=5;table=0;break; //8
case 3: space=4;table=0;break; //10
case 6: space=2;table=0;break;//20
case 7: space=20,table=0;break;// 2
case 8: space=1;break;//40
default: space=4;table=0;break;//默认10细分
}
}
/*void loaddropdata(void)
{
uint8_t i;
while(!eeprom_is_ready());
eeprom_read_block(buf,(uint8_t *)0x10,4);
for(i=0;i<4;i++)
{
if(buf[i]>0x20)
buf[i]=0;
}
stage_drop=buf[0];
space_drop=buf[1];
dirstate=buf[2];
stage=buf[3];
}
*/
int main(void)
{
PORTA=0X02;//PA1-wr,PA2-daca
DDRA=0XFF;
PORTC=0X00;
DDRC=0Xff; //
//delay(10);
PORTD=0X00;
DDRD=0XE0; //PD6 -OFFCURRENT.PD5-FREE
currenta=0;
currentb=0;
stage=0;
stage1=0;
phasestep=0;
cpnum=0;
table=0;
loadbm();
while(bit_is_set(PORTE,0)); //若过热,则停止
initialcurrent(); //向tlc7528发出电流台阶信号.
GICR|=0XC0; //INT1(CP)INT0(VOL_LESS)INT2(OVERHOT) 中断使能
MCUCR=0X0A;
//开总中断
TIMSK=0X80; //T1 INTRRUPT
TCCR1B=0X00;
_NOP();
_NOP();
_SEI();
while(1);
}
SIGNAL( SIG_INTERRUPT1 )//cp
{
if(bit_is_clear(PIND,3)) //pc4 (cp)
{
cpnum++;
asm volatile("cbi 0x12,6"::);//取消自动半流
if(bit_is_clear(PIND,4)){ //dir=0,default
stage+=space;
if(stage==80) stage=0;
phasestep+=space;
if(phasestep==160) phasestep=0;
}
else if(bit_is_set(PIND,4)){//dir=1;
if(stage==0) stage=80-space;
else stage-=space;
if(phasestep==0) phasestep=160-space;
else phasestep-=space;
}
if(stage<40) stage1=stage+40;
else stage1=stage-40;
currenta=pgm_read_byte(&A[stage]);
currentb=pgm_read_byte(&A[stage1]);
phaseout=pgm_read_byte(&B[phasestep]);
phaseout<<=4;
PORTA|=phaseout;
PORTC|=currenta;
asm volatile("sbi 0x08,0"::);//daca 0x08=portc
asm volatile("cbi 0x08,1"::);//wr
asm volatile("sbi 0x08,1"::);//wr
PORTC|=currentb;
asm volatile("cbi 0x08,0"::);//daca
asm volatile("cbi 0x08,1"::);//wr
asm volatile("sbi 0x08,1"::);//wr
TCNT1=25536;
TCCR1B=0X01;
// TIMSK1=0X01;
}
}
SIGNAL( SIG_INTERRUPT0)
{
_CLI();
PORTA=0X02; //相位=0000,wr=1;
asm volatile("sbi 0x12,6"::);//OFFCURRENT (PORTD.6)
}
SIGNAL(SIG_OVERFLOW1)
{
TCCR1B=0X00;;
asm volatile("sbi 0x12,6"::);//OFFCURRENT PORTD,6
}
//priority:fo-低触发最高,undervoltage-低触发次高 ,overvol低触发再次之,overhot高触发最低
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -