📄 driver86.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[21]={255,254,250,242,232,219,203,186,168,148,128,108,88,70,53,24,14,6,2,0};
prog_char bb[9]={0x08,0x0A,0x02,0x06,0x04,0x05,0x01,0x09,0xff};
uint16_t stage_drop,space_drop;
uint8_t phasea,phaseb,space,table;
volatile uint16_t stage,stage1;
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)
{
phasea=pgm_read_byte(&A[0]);
phaseb=pgm_read_byte(&A[19]);
PORTC=phasea;
asm volatile("sbi 0x18,2"::);//daca
asm volatile("cbi 0x18,1"::);//wr
asm volatile("sbi 0x18,1"::);//wr
PORTC=phaseb;
asm volatile("cbi 0x18,2"::);//daca
asm volatile("cbi 0x18,1"::);//wr
asm volatile("sbi 0x18,1"::);//wr
}
void loadbm(void)
{
xfnum=PIND;
xfnum&=0x0f;
switch(xfnum)
{
case 0x00: space=150;table=0;break;
case 0x01: space=120;table=0;break;
case 0x02: space=100;table=0;break;
case 0x03: space=10; table=0;break;
default: space=0; table=0;break;
}
}
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=0X20;//PA1-wr,PA2-daca
DDRA=0XFF;
PORTC=0X02;
DDRC=0Xff; //
//delay(10);
PORTD=0X00;
DDRD=0XE0; //PD6 -OFFCURRENT.PD5-FREE
table=0;
loadbm();
while(bit_is_set(PORTE,0)); //若过热,则停止
initialcurrent(); //向tlc7528发出电流台阶信号.
GICR|=0XE0; //INT1(CP)INT0(VOL_LESS)INT2(OVERHOT) 中断使能
_SEI(); //开总中断
_NOP();
_NOP();
}
SIGNAL( SIG_INTERRUPT1 )//cp
{
if(bit_is_set(PINC,4)) //pc4 (cp)
{
asm volatile("cbi 0x08,3"::);//取消自动半流
if(bit_is_clear(PINC,5)){ //dir=0,default
stage+=space;
if(stage==1200) stage=0;
}
else if(bit_is_set(PINC,5)){//dir=1;
if(stage==0) stage=1200-space;
else stage-=space;
}
if(stage>=800) stage1=stage-800;
else stage1=stage+400;
// }
phasea=pgm_read_byte(&A[stage]);
phaseb=pgm_read_byte(&A[stage1]);
PORTD=phasea;
asm volatile("sbi 0x08,0"::);//daca 0x08=portc
asm volatile("cbi 0x08,1"::);//wr
asm volatile("sbi 0x08,1"::);//wr
PORTD=phaseb;
asm volatile("cbi 0x08,0"::);//daca
asm volatile("cbi 0x08,1"::);//wr
asm volatile("sbi 0x08,1"::);//wr
TCNT1=25536;
TCCR1B=0X04;
// TIMSK1=0X01;
}
}
SIGNAL( SIG_INTERRUPT0)
{
_CLI();
asm volatile("cbi 0x05,5"::);//SD ,HIGN VALID,0x05 PORTTB
asm volatile("sbi 0x05,3"::);//offcurrent
asm volatile("cbi 0x08,2"::);//notready
}
SIGNAL( SIG_INTERRUPT2)
{
asm volatile("cbi 0x05,5"::);//SD ,HIGN VALID,0x05 PORTTB
asm volatile("sbi 0x05,3"::);//offcurrent
asm volatile("cbi 0x08,2"::);//notready
}
SIGNAL(SIG_OVERFLOW1)
{
TCNT1=25536;
asm volatile("sbi 0x12,6"::);//OFFCURRENT PORTD,6
}
//priority:fo-低触发最高,undervoltage-低触发次高 ,overvol低触发再次之,overhot高触发最低
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -