?? mainloop.c
字號:
#include <stdio.h>
#include <string.h>
#include <reg51.h> /* special function register decounterarations */
#include "mainloop.h"
#include "isr.h"
#include "protozlg.h"
#include "math.h"
#define GAOPIN_KAI 1
#define GAOPIN_GUAN 0
#define MOT_RUN 1
#define MOT_CLOSE 0
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit WR8253=P1^0;
sbit A8253=P1^1;
sbit RAMCS=P1^4;
sbit CS8253=P1^5;
sbit A15=P2^7;
sbit A0=P3^0;
sbit A1=P3^1;
sbit GATE=P1^2;
sbit PCS=P3^4;
sbit JCS=P3^5;
sbit WRITE=P3^6;
sbit READ=P3^7;
#define MAX_ORDER 5
void outportb(unsigned int Addr,unsigned char Data);
/*
//*************************************************************************
// Public static data
//*************************************************************************
*/
extern EPPFLAGS bEPPflags;
extern unsigned char idata GenEpBuf[];
extern unsigned char idata EpBuf[];
extern unsigned int data d12_addr;
extern unsigned int data D12_DATA;
extern unsigned int data D12_COMMAND;
sfr CKCON = 0x8F;//87C52x2用
sbit clksel = P2^0;
char idata gaopzt,dianjzt,old_p_status;
unsigned char idata cc;
unsigned char idata c,c1,c2,c3;
unsigned long idata counter;
unsigned char idata read_jing_flag,read_prog_flag,send_req_flag,read_max_loop_flag,read_nc_num_flag,io_wrong_flag;
unsigned char idata diand_flag,diand_axis,diandbz;
long diandjl;
unsigned char idata ch;
char idata mask_cc;
int i,j;
long idata l,ll;
double idata r,f1;
unsigned char idata lbuf[4];
unsigned char idata w_p,zf;
char idata xyt,uvt,work_status;
unsigned int cur_jing;
unsigned int old_cur_jing;
unsigned int loop_counter;
char loop_flag;
char anti_work_flag,timer_ok;
long loop_off;
unsigned char cur_order;
#define xytype(order) (2630+order) //xy類型
#define uvtype(order) (2640+order) //uv類型
#define xy(order) (2650+order) //XY記數
#define counterlen(order) (2660+order*4) //記數長度
#define ncorder(order) (2700+order*4) //程序序號
#define lpdata(order,off) (2780+(order*6+off)*4) //中心點坐標 起點坐標 末點坐標
#define lpdata1(order,off) (3020+(order*6+off)*4) //中心點坐標 起點坐標 末點坐標
#define cur_x (long)(*((long *)(&(XBYTE[2400])))) //當前xyuv坐標
#define cur_y (long)(*((long *)(&(XBYTE[2405]))))
#define cur_u (long)(*((long *)(&(XBYTE[2410]))))
#define cur_v (long)(*((long *)(&(XBYTE[2415]))))
#define cur_work_seg (long)(*((long *)(&(XBYTE[2420]))))
#define cur_seg (long)(*((long *)(&(XBYTE[2520])))) //當前段
#define cur_off (long)(*((long *)(&(XBYTE[2525])))) //當前段內記數
#define e_order XBYTE[3531] //末點指針
#define xy_uv XBYTE[3532] //xy記數或uv記數
//回零標志
#define home_flag XBYTE[2533]
//當前電機相序號
#define cur_x_step_order XBYTE[2534]
#define cur_y_step_order XBYTE[2535]
#define cur_u_step_order XBYTE[2536]
#define cur_v_step_order XBYTE[2537]
//異型參數工件高 上導輪到工件上表面高度
#define height (long)(*((long *)(&(XBYTE[2538]))))
#define up_height (long)(*((long *)(&(XBYTE[2542]))))
#define up_down_height (long)(*((long *)(&(XBYTE[2546]))))
#define cur_order1 XBYTE[2550]
#define max_loop_counter (unsigned int)(*((unsigned int*)(&(XBYTE[2425]))))
//進給速率
#define jinggsl XBYTE[2300]
//相序類型(5 3 2)
#define xiangxlx XBYTE[1200]
//正方向電平
#define zhengfxdp XBYTE[2553]
//脈沖寬度
#define maickd XBYTE[2554]
//高頻狀態
//電機狀態
#define stop_flag XBYTE[2450]
#define stop_byte XBYTE[2452]
//點動軸號
#define diandzh XBYTE[2557]
//點動方向
#define diandfx XBYTE[2558]
//短路標志
#define duanlbz XBYTE[2563]
//短路回退步數
#define duanlhtbs (long)(*((long *)(&(XBYTE[2568]))))
//同一位置短路回退最大次數
#define tongywzdlhtzdcs (long)(*((long *)(&(XBYTE[2572]))))
//單段加工標志
#define dandjgbz XBYTE[2576]
#define x (long)(*((long *)(&(XBYTE[2580]))))
#define y (long)(*((long *)(&(XBYTE[2584]))))
#define bx (long)(*((long *)(&(XBYTE[2588]))))
#define by (long)(*((long *)(&(XBYTE[2592]))))
#define ex (long)(*((long *)(&(XBYTE[2596]))))
#define ey (long)(*((long *)(&(XBYTE[2600]))))
#define cx (long)(*((long *)(&(XBYTE[2604]))))
#define l1 (long)(*((long *)(&(XBYTE[2608]))))
#define l2 (long)(*((long *)(&(XBYTE[2612]))))
#define l3 (long)(*((long *)(&(XBYTE[2616]))))
void cmd_proc(void);
void send_req_order(char order);
void send_a_step(void);
void send_cur_pos(char axis,char order);
init_j8255();
init_p8255();
write_p8255_a();
write_p8255_b();
write_p8255_c();
write_j8255_a();
write_j8255_b();
write_j8255_c();
out_8255_1_a();
out_8255_1_c(char cc);
unsigned char get_x_y_port_byte(char cc);
unsigned char get_u_v_port_byte(char cc);
open_gao_pin();
close_gao_pin();
open_mot();
close_mot();
open_mac();
close_mac();
x_z();
x_f();
y_z();
y_f();
u_z();
u_f();
v_z();
v_f();
rem_cs();
rev_cs();
send_loop_msg();
void timer_isr();
//D12中斷服務
usb_isr() interrupt 0
{
unsigned char c0,c1;
if (RAMCS == 0)
c0 = 0;
else
c0 = 1;
if (MCU_D12CS == 0)
c1 = 0;
else
c1 = 1;
RAMCS = 1;
MCU_D12CS = 0;
DISABLE;
fn_usb_isr();//調用D12中斷服務子程序
ENABLE;
if (c0 == 1)
RAMCS = 1;
if (c1 == 1)
MCU_D12CS = 1;
if (c0 == 0)
RAMCS = 0;
if (c1 == 0)
MCU_D12CS = 0;
}
void timer_isr(void) interrupt 2
{
timer_ok = 1;
}
void main(void)
{
char bz;
while (1){
MCU_LED0 = 1;
for (i=0;i<100;i++);
MCU_LED0 = 0;
for (i=0;i<100;i++);
}
CKCON = 1;
MCU_LED0 = 1;
GATE = 0;
MCU_D12CS = 0x1;
RAMCS = 1;
cur_jing = 200;
anti_work_flag = 0;
loop_flag = 0;
loop_counter = 0;
timer_ok = 0;
//init 8253
init_j8255();
init_p8255();
P2 = 0x3e;
PCS = 1;
JCS = 1;
CS8253 = 0;
A8253 = 1;
WR8253 = 1;
delay1();
WR8253 = 0;
delay1();
WR8253 = 1;
delay1();
P2 = 2;
A8253 = 0;
WR8253 = 1;
delay1();
WR8253 = 0;
delay1();
WR8253 = 1;
delay1();
P2 = 0;
A8253 = 0;
WR8253 = 1;
delay1();
WR8253 = 0;
delay1();
WR8253 = 1;
delay1();
GATE = 1;
CS8253 = 1;
// P0 = 0xFF;//初始化I/O口
// P1 = 0xFF;
// P2 = 0xFF;
// P3 = 0xFF;
CKCON = 0x00;
D12_DATA = 0xff02; //定義數據地址
D12_COMMAND = 0xff03; //定義命令地址
MCU_D12CS = 0x0;
// D12SUSPD = 0x0;
IT0 = 0;//初始化中斷
EX0 = 1;
PX0 = 0;
IT1 = 1;//初始化中斷
EX1 = 1;
PX1 = 1;
EA = 1;
MCU_D12CS = 0x1;
MCU_D12CS = 0x0;
bEPPflags.value = 0;
MCU_D12CS = 1;
RAMCS = 0;
counter = 0;
read_jing_flag = 0;
diand_flag = 0;
diand_axis = 0;
diandbz = 0;
diandjl = 0;
read_prog_flag = 0;
send_req_flag = 0;
read_max_loop_flag = 0;
read_nc_num_flag = 0;
io_wrong_flag = 0;
gaopzt = GAOPIN_GUAN;
dianjzt = MOT_CLOSE;
stop_flag = stop_byte = 0;
max_loop_counter = 700;
read_max_loop_flag = 0;
old_p_status = 0;
send_req_flag = 0;
work_status = 0;
open_mac();
close_gao_pin();
close_mot();
RAMCS = 1;
MCU_D12CS = 0;
MCU_D12CS = 1;
MCU_D12CS = 0;
reconnect_USB();//聯接USB總線
while( TRUE ){
if(bEPPflags.bits.configuration){
cmd_proc();//連接正常,調用命令處理
ENABLE;
MCU_D12CS = 1;
RAMCS = 0;
cur_order = cur_order1;
if (work_status == 1){
if (XBYTE[xytype(cur_order)] != 0){
DISABLE;
WRITE = 1;
P2 = 2;
RAMCS = 1;
PCS = 0;
A0 = 1;
A1 = 0;
READ = 1;
READ = 0;
READ = 1;
cc = P2;
PCS = 1;
A0 = 0;
A1 = 0;
RAMCS = 0;
ENABLE;
bz = 0;
if (gaopzt == GAOPIN_KAI){
if (anti_work_flag == 0){
if (((cc&2) == 2)&&(timer_ok == 1)){
MCU_LED0 = 0;
MCU_LED0 = 0;
MCU_LED0 = 0;
MCU_LED0 = 1;
bz = 1;
}
}
else{
if (timer_ok == 1)
bz = 1;
}
}
else{
if (timer_ok == 1)
bz = 1;
}
if (loop_counter == max_loop_counter){
loop_off = cur_off;
loop_flag = 1;
anti_work_flag = 1;
send_loop_msg();
old_cur_jing = cur_jing;
cur_jing = 200;
}
if (bz == 1){
old_p_status = cc&2;
timer_ok = 0;
loop_counter = 0;
send_a_step();
}
else{
if (gaopzt == GAOPIN_KAI)
loop_counter ++;
for (i=0;i<300;i++);
}
}
else{
for (i=0;i<300;i++);
}
}
else if (work_status == 2){
if (counter == 9+30*5){
if ((XBYTE[xytype(cur_order)] == 0)&&(cur_order == 0)){
send_req_order(0);
}
}
}
else{
for (i=0;i<400;i++);
}
RAMCS = 1;
MCU_D12CS = 0;
counter ++;
for (i=0;i<5*6;i++){
if (counter == 5+(i+1)*5){
send_cur_pos(i/6,i%6);
}
}
if (counter == 10+30*5){
counter = 0;
}
}
usbserve();//USB服務數據處理
} // Main Loop
}
void cmd_proc(void)
{
if(bEPPflags.bits.ep1_rxdone) {
DISABLE;//接收到主機發來的指令信息
bEPPflags.bits.ep1_rxdone = 0;
ENABLE;
MCU_D12CS = 1;
RAMCS = 0;
if (diand_flag == 2){
if (diandbz == 0){
diandjl += GenEpBuf[3];
XBYTE[xytype(1)] = 0;
XBYTE[xytype(2)] = 0;
XBYTE[xytype(3)] = 0;
XBYTE[xytype(4)] = 0;
XBYTE[xytype(0)] = 1;
XBYTE[uvtype(0)] = 0;
cur_order1 = 0;
cur_order = e_order = 0;
(long)(*((long *)(&(XBYTE[ncorder(0)])))) = 0;
(long)(*((long *)(&(XBYTE[lpdata(0,2)])))) = cur_x;
(long)(*((long *)(&(XBYTE[lpdata(0,3)])))) = cur_y;
(long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x;
(long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y;
if (diand_axis == 1){
(long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x+diandjl;
XBYTE[xy(0)] = 0;
}
else if (diand_axis == -1){
(long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x-diandjl;
XBYTE[xy(0)] = 0;
}
else if (diand_axis == 2){
(long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y+diandjl;
XBYTE[xy(0)] = 1;
}
else if (diand_axis == -2){
(long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y-diandjl;
XBYTE[xy(0)] = 1;
}
else if (diand_axis == 3){
(long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x+diandjl;
XBYTE[xy(0)] = 0;
}
else if (diand_axis == -3){
(long)(*((long *)(&(XBYTE[lpdata(0,4)])))) = cur_x-diandjl;
XBYTE[xy(0)] = 0;
}
else if (diand_axis == 4){
(long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y+diandjl;
XBYTE[xy(0)] = 1;
}
else if (diand_axis == -4){
(long)(*((long *)(&(XBYTE[lpdata(0,5)])))) = cur_y-diandjl;
XBYTE[xy(0)] = 1;
}
work_status = 1;
cur_off = 0;
diandbz = 1;
}
diand_flag = 0;
}
else if (diand_flag == 1){
if (diandbz == 0){
if ((GenEpBuf[3] & 0x80) == 0x80){
diandjl = (GenEpBuf[3]-0x80)*256;
diand_axis = -diand_axis;
}
else
diandjl = GenEpBuf[3]*256;
}
diand_flag = 2;
}
else if (read_nc_num_flag == 1){
read_nc_num_flag = 0;
if (GenEpBuf[3] != e_order){
cc = 0x8d;
RAMCS = 1;
MCU_D12CS = 0;
D12_WriteEndpoint(3, 1, &cc);
io_wrong_flag = 1;
}
else{
if (anti_work_flag == 1){
cur_order1 = e_order;
cur_order = e_order;
cur_off = (long)(*((long *)(&(XBYTE[counterlen(cur_order)]))));
work_status = 1;
}
else{
cur_order1 = 0;
cur_order = 0;
cur_off = 0;
}
}
}
else if (read_max_loop_flag == 2){
max_loop_counter += GenEpBuf[3];
read_max_loop_flag = 0;
}
else if (read_max_loop_flag == 1){
max_loop_counter = GenEpBuf[3]*256;
read_max_loop_flag = 2;
}
else if (read_jing_flag == 2){
cur_jing += GenEpBuf[3];
read_jing_flag = 0;
DISABLE;
RAMCS = 1;
GATE = 0;
delay1();
CS8253 = 0;
P2 = 0x3e;
A8253 = 1;
WR8253 = 1;
delay1();
WR8253 = 0;
delay1();
WR8253 = 1;
delay1();
P2 = cur_jing%256;
A8253 = 0;
WR8253 = 1;
delay1();
WR8253 = 0;
delay1();
WR8253 = 1;
delay1();
P2 = cur_jing/256;
A8253 = 0;
WR8253 = 1;
delay1();
WR8253 = 0;
delay1();
WR8253 = 1;
delay1();
GATE = 1;
delay1();
CS8253 = 1;
RAMCS = 0;
ENABLE;
}
else if (read_jing_flag == 1){
cur_jing = GenEpBuf[3]*256;
read_jing_flag ++;
}
else if (read_prog_flag > 0){
if (read_prog_flag != 12+2*4*6)
mask_cc ^= GenEpBuf[3];
if (read_prog_flag == 1){
if (XBYTE[xytype(e_order)] == 0)
w_p = e_order;
else
w_p = (e_order+1)%MAX_ORDER;
if (XBYTE[xytype(w_p)] != 0){
w_p = -1;
}
if (w_p != -1)
XBYTE[xytype(w_p)] = GenEpBuf[3];
read_prog_flag ++;
}
else if (read_prog_flag == 2){
if (w_p != -1)
XBYTE[uvtype(w_p)] = GenEpBuf[3];
read_prog_flag ++;
}
else if (read_prog_flag == 3){
if (w_p != -1)
XBYTE[xy(w_p)] = GenEpBuf[3];
read_prog_flag ++;
}
else if ((read_prog_flag > 3)&&(read_prog_flag <=7)){
if (w_p != -1)
XBYTE[counterlen(w_p)+read_prog_flag-4] = GenEpBuf[3];
read_prog_flag ++;
}
else if ((read_prog_flag > 7)&&(read_prog_flag <=11)){
if (w_p != -1)
XBYTE[ncorder(w_p)+read_prog_flag-8] = GenEpBuf[3];
read_prog_flag ++;
}
else if ((read_prog_flag > 11)&&(read_prog_flag <=11+4*6)){
cc = (read_prog_flag-12)/4;
if (w_p != -1)
XBYTE[lpdata(w_p,cc)+read_prog_flag-12-cc*4] = GenEpBuf[3];
read_prog_flag ++;
}
else if ((read_prog_flag > 11+4*6)&&(read_prog_flag <=11+2*4*6)){
cc = (read_prog_flag-12-4*6)/4;
if (w_p != -1)
XBYTE[lpdata1(w_p,cc)+read_prog_flag-12-4*6-cc*4] = GenEpBuf[3];
read_prog_flag ++;
}
else if (read_prog_flag == 12+2*4*6){
if (mask_cc == GenEpBuf[3]){
if (w_p != -1)
e_order = w_p;
}
read_prog_flag = 0;
}
else
read_prog_flag = 0;
}
else if (GenEpBuf[3] == 1){//自動開高頻繼續加工但判斷是否是啟動態
if (io_wrong_flag == 0){
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -