#include #include #include #include #include #include #include "TB386EX.h" #define TIMER_INT 0x72 /* 8259 registers */ #define IRSM OCW2MDOS /* Interrupt Controller Master */ #define IRSS OCW2SDOS /* Interrupt Controller Slave */ #define IMM OCW1MDOS /* Interrupt Mask Master */ #define IMS OCW1SDOS /* Interrupt Mask Slave */ #define EOI 0x20 /* end of interrupt command */ typedef unsigned char BYTE; BYTE master_org, slave_org; #define STEPPORT 0x201 /* Step Motor Pulse Output */ #define STEPPOWER 0x203 /* Step Motor Power Level */ BYTE MPhaseOne[] = { 0x11,0x44,0x22,0x88 }; /* 1상 구동 */ BYTE MPhaseTwo[] = { 0x55,0x66,0xAA,0x99 }; /* 2상 구동 */ BYTE MPhaseRotate[] = {0x11,0x15,0x54,0x56,0x42,0x4A,0x68,0x69,0x21,0x25,0xA4,0xA6,0x82,0x8A,0x98,0x99}; /* 회전 구동 */ volatile int HardDelayTimerCount; void Delay_10ms(int count) { HardDelayTimerCount = 0; for (;;) if (HardDelayTimerCount > count) break; } void interrupt NewIRQ10(void) /*IRQ10*/ { /* code for Exam-B Here */ HardDelayTimerCount++; outportb(IRSS, EOI); /* End-Of-Interrupt to Master 8259A */ outportb(IRSM, EOI); /* End-Of-Interrupt to Slave 8259A */ } void InitTimer1(unsigned short MaxCount) /* Counter Input = 1000KHz */ { disable(); outportb(TMRCONDOS, 0x74); /* Timer1 => MODE2 */ outportb(TMR1DOS, MaxCount & 0xFF); outportb(TMR1DOS, (MaxCount >> 8) & 0xFF); setvect(TIMER_INT, NewIRQ10); master_org = inportb(IMM); /* Save PIC master's mask */ outportb(IMM, master_org & 0xFB); /* Enable IRQ2 */ slave_org = inportb(IMS); /* Save PIC slave's mask */ outportb(IMS, slave_org & 0xFB); /* Enable IRQ10 */ enable(); } void CloseTimer1(void) { disable(); outportb(IMM, master_org); /* Restore IRQ2 */ outportb(IMS, slave_org); /* Restore IRQ10 */ enable(); } void InitTrace386Port(void) { outportb(P1CFG, 0x00); outportb(P1DIR, 0xEB); outportb(P2DIR, 0x7F); outportb(P3CFG, 0xBC); outportb(P3DIR, 0xFC); outportb(P3LTC, 0xFD); } void Exam1(void) { int i; printf("EXAM_A\nSingle Phase 100 step Forward Drive\n"); outportb(STEPPOWER, 0xF5); for (i = 0; i < 100; i++) { outportb(STEPPORT, MPhaseOne[i % 4]); Delay_10ms(2); } outportb(STEPPOWER, 0xFF); } void Exam_A1(void) { int i; printf("EXAM_A1\nSingle Phase 100 step Backward Drive by Phase 1\n"); while(!kbhit()); outportb(STEPPOWER, 0xF5); for (i = 99; i >= 0; i--) { outportb(STEPPORT, MPhaseOne[i % 4]); Delay_10ms(2); } outportb(STEPPOWER, 0xFF); } void Exam_A2(void) { int i; printf("EXAM_A\nSingle Phase 100 step Forward Drive by Phase 2\n"); outportb(STEPPOWER, 0xF5); for (i = 0; i < 100; i++) { outportb(STEPPORT, MPhaseTwo[i % 4]); Delay_10ms(2); } outportb(STEPPOWER, 0xFF); } void Exam_A3(void) { int i; printf("EXAM_A\nSingle Phase 100 step Forward Drive Phase 1-2\n"); outportb(STEPPOWER, 0xF5); for (i = 0; i < 100; i++) { outportb(STEPPORT, MPhaseOne[i % 4]); Delay_10ms(2); outportb(STEPPORT, MPhaseTwo[i % 4]); Delay_10ms(2); } outportb(STEPPOWER, 0xFF); } void Exam_B(void) { int count = 10000; unsigned int i = 0; int begin, end; printf("EXAM_B\n Forward Drive Speed by (+/-)\n\n"); outportb(STEPPOWER, 0xF5); printf("%f cm/sec\n", 0.08/((1000000/count)*0.02/10000)); while(1) { if(kbhit()) { switch (getch()) { case 'a': count-=50; printf("%d Hz\n",count); InitTimer1(count); break; case 'z': count+=50; printf("%d Hz\n",count); InitTimer1(count); break; case '+': count--; printf("%d Hz\n",count); InitTimer1(count); break; case '-': count++; printf("%d Hz\n",count); InitTimer1(count); break; case 'q': outportb(STEPPOWER, 0xFF); InitTimer1(10000); return; } printf("%f cm/sec\n", 0.08/((1000000/count)*0.02/10000)); } outportb(STEPPORT, MPhaseOne[i % 4]); /*283*/ Delay_10ms(2); i++; } } void Exam_C(void) { int i; Exam_A3(); printf("EXAM_A\nSingle Phase 100 step Forward Drive\n"); outportb(STEPPOWER, 0xF5); for (i = 0; i < 600; i++) { outportb(STEPPORT, MPhaseRotate[i % 16]); Delay_10ms(2); } outportb(STEPPOWER, 0xFF); Exam_A3(); } void main(void) { InitTrace386Port(); InitTimer1(10000); /* Exam1(); Exam_A1(); Exam_A2(); Exam_A3(); */ Exam_B(); Exam_C(); outportb(STEPPORT, 0x00); outportb(STEPPOWER, 0xFF); CloseTimer1(); }