/*--------------------------------------------------------------------------- * IR 센서 실험 *---------------------------------------------------------------------------*/ #include #include #include #include #include #include #include "tb386ex.h" #define IRDRIVE 0x202 /* IR 출력포트 정의, 8비트 TR 출력 (500mA)*/ #define AD10158PORT 0x208 /* ADC 포트 */ #define BAR_LED 0x203 /* Bar LED On Board*/ #define SDELAY 25 #define STEPPORT 0x201 /* Step Motor Pulse Output */ #define STEPPOWER 0x203 /* Step Motor Power Level */ typedef unsigned char BYTE; BYTE MPhaseRight[] = { 0x20,0x80,0x10,0x40 }; /* 1상 구동 */ BYTE MPhaseLeft[] = { 0x02,0x08,0x01,0x04 }; /* 1상 구동 */ /* --------------------------------------------------------------------------- *---------------------------------------------------------------------------*/ void InitTrace386Port(void) { outportb(P1CFG, 0x00); outportb(P1DIR, 0xEB); outportb(P2DIR, 0x7F); outportb(P3CFG, 0x3E); outportb(P3DIR, 0xBF); outportb(P3LTC, 0xBF); } /* --------------------------------------------------------------------------- Timer Support Start *---------------------------------------------------------------------------*/ #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 */ #define TIMER_INT 0x72 #define STEPPORT 0x201 /* Step Motor Pulse Output */ #define STEPPOWER 0x203 /* Step Motor Power Level */ BYTE MPhaseOne[] = { 0x22,0x88,0x11,0x44 }; /* 1상 구동 */ volatile int HardDelayTimerCount; unsigned char master_org, slave_org; void interrupt NewIRQ10(void) /*IRQ10*/ { 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 Delay_10ms(int count) /* delay 함수 */ { HardDelayTimerCount = 0; for (;;) if (HardDelayTimerCount > count) break; } /*--------------------------------------------------------------------------*/ void DelayIR(void) { int i; for(i = 0; i < SDELAY; i++) ; /* 포토 TR/다이오드가 안정화 될때까지 기다림 */ } void DelayADC(void) { int i; for(i = 0; i < 2; i++) ; /* ADC가 안정화 될때까지 기다림 */ } BYTE ReadSensor(int ir) { int advalue; outportb(IRDRIVE, 1 << ir); DelayIR(); outportb(AD10158PORT, 0x60 + ir); DelayADC(); inportb(AD10158PORT); advalue = inportb(AD10158PORT); return advalue; } void Exam(void) /* IR센서 시험 루틴 */ { BYTE value; int i; printf("Print Sensing Value:\n"); for (;;) { for (i = 0; i < 6; i++) { value = ReadSensor(i); printf("%3d ", value); } printf("\n"); Delay_10ms(10); if (kbhit() && (getch() == 'q')) break; } } void Exam1() { BYTE value; int i; int led = 0xFF; printf("Print Sensing Value:\n"); for (;;) { for (i = 0; i < 6; i++) { value = ReadSensor(i); printf("%3d ", value); if(value > 50) { if(i < 3) led -= pow(2,i); else led -= pow(2,i+2); } } outportb(BAR_LED, led); printf("\n"); Delay_10ms(10); led = 0xFF; if (kbhit() && (getch() == 'q')) break; } } #define LEFT 1 #define RIGHT 2 int left_tick; int right_tick; void Rolling(int count, int left_right) { int i; for(i = count ; i > 49 ; i-=50) { if(left_right == LEFT) outportb(STEPPORT, MPhaseLeft[left_tick++ % 4]); else if(left_right == RIGHT) outportb(STEPPORT, MPhaseRight[right_tick++ % 4]); Delay_10ms(1); } } void Exam2() { BYTE value; int i, left, right; CloseTimer1(); InitTimer1(1800); printf("Print Sensing Value:\n"); outportb(STEPPOWER, 0xF5); for (;;) { left = ReadSensor(0); right = ReadSensor(5); Rolling(left, LEFT); Rolling(right, RIGHT); if (kbhit() && (getch() == 'q')) break; } outportb(STEPPOWER, 0xFF); } /*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*/ void Exams(void) /* IR센서 시험 루틴 */ { Exam(); Exam1(); Exam2(); } /*--------------------------------------------------------------------------*/ void main(void) { InitTimer1(10000); InitTrace386Port(); Exams(); CloseTimer1(); }