#include void forward(int ontime1, int offtime1); void reverse(int ontime1, int offtime1); void left(int ontime1, int offtime1); void rotateL(int ontime1, int offtime1); void right(int ontime1, int offtime1); void rotateR(int ontime1, int offtime1); int a, d, status; unsigned char index=1; #pragma interrupt void isrTimer1(void) { index = index << 1; if(index==0x40){ index=1; } } #define RELOAD 8 void InitTimer1(void) { DI(); T1CTL = (0x07 << 3) | 0x01; // Cont mode, prescale 2^7=128 T1H = 0x00; T1L = 0x01; // T1 start = 0x0001 T1RH = (RELOAD >> 8); T1RL = (RELOAD & 0xFF); SET_VECTOR(TIMER1,isrTimer1); IRQ0ENH |= 0x40; // enable timer1 interrupt T1I IRQ0ENL |= 0x40; IRQ0 &= ~0x40; // clear timer1 interrupt flag EI(); T1CTL |= 0x80; // Enable timer1 } #pragma interrupt void LINE(void) { DI(); // Disable Interrupt for(a=0;a<80;a++){ reverse(1000,200); } while(PAIN & 0x20){ reverse(600,600); } status |= 0x01; IRQ0 &= ~0x40; // clear timer1 interrupt flag EI(); // Enable Interrupt } void InitLINE(void) { DI(); PADD |= 0x20; // Initialize PA5 as Input IRQES |= 0x20; // Set EDGE SELECT Reg to Rising Edge SET_VECTOR(P5AD, LINE); // Set ISR IRQ1ENL |= 0x20; // Set Priority Reg to HIGH IRQ1ENH |= 0x20; // Set Priority Reg to HIGH IRQ1 &= ~0x20; // Clear any pending INT rqst from PD3 EI(); // Enable Interrupt } #define babad 100 void main() { int input; PADD=0xff; //Port A all input PBDD=0x00; //Port B all output PCDD=0xff; //Port C all input InitTimer1(); InitLINE(); /* PB truth table: hex value: 0000 = stop 0x00 0010 = left 0x02 1111 = reverse 0x0f 1110 = rotateL 0x0e 1000 = right 0x08 1011 = rotateR 0x0b 1010 = forward 0x0a Sensor truth table: hex value: 000 = reverse 0x00 001 = rotateR 0x01 010 = forward 0x02 011 = right 0x03 100 = rotateL 0x04 101 = 0x05 110 = left 0x06 111 = forward 0x07 */ while(1) { if((PAIN & 0x20) || ((status & 0x01) && !(PAIN & 0x08))){ reverse(600,600); } else{status &= ~0x01;} while(!(PAIN & 0x08) && !(status & 0x01)) { PBOUT=0x0a; // attack } if(index==0x01){ for(a=0;a