const unsigned char MSG0[41] = "ECE 761 Lab: Tach.C "; const unsigned char MSG1[41] = "rev 06/05/19 JSG "; const unsigned char MSG2[41] = "Sampling Rate = 10ms "; const unsigned char MSG3[41] = "Speed (rad/sec) "; // Global Variables unsigned char TIC; int Q, zQ; unsigned int COUNTER; unsigned int DELAY; unsigned int P1; unsigned char nP; int T0, T1; unsigned int P0; int DIR; // Subroutine Declarations #include //#include "function.h" void Wait_ms(unsigned int X) { unsigned int i, j; for(i=0; i 10) V = 10; if(V < -10) V = -10; X = V * 213; DATA = X + 2048; if (DATA > 4095) DATA = 4095; if (DATA < 0) DATA = 0; RC1 = 0; for (i=0; i<16; i++) { if (DATA & 0x8000) RC3 = 1; else RC3 = 0; RC2 = 1; DATA = DATA << 1; RC2 = 0; } RC1 = 1; } void SCI_Float(float X) { unsigned int A[5], i; int DATA; if (X < 0) { X = -X; while(!TRMT); TXREG = '-'; } else { while(!TRMT); TXREG = ' '; } DATA = X * 100; for (i=0; i<5; i++) { A[i] = DATA % 10; DATA = DATA / 10; } while(!TRMT); TXREG = A[4] + '0'; while(!TRMT); TXREG = A[3] + '0'; while(!TRMT); TXREG = A[2] + '0'; while(!TRMT); TXREG = '.'; while(!TRMT); TXREG = A[1] + '0'; while(!TRMT); TXREG = A[0] + '0'; while(!TRMT); TXREG = ' '; } void SCI_CRLF(void) { while(!TRMT); TXREG = 13; while(!TRMT); TXREG = 10; } // Main Routine void main(void) { unsigned int i, j, npt; int R, DATA; unsigned int TIME; float REF; float SPEED; float ANGLE; float U; float E0, E1; TRISA = 0; TRISB = 0x80; TRISC = 0; TRISD = 0; TRISE = 0; ADCON1 = 0x0F; // D2A_Init(); TRISA3 = 0; // CS TRISA4 = 0; // CLK TRISA5 = 0; // DATA // Initialize Serial Port to 9600 baud TRISC = TRISC | 0xC0; TXIE = 0; RCIE = 1; BRGH = 0; BRG16 = 1; SYNC = 0; SPBRG = 255; TXSTA = 0x22; RCSTA = 0x90; PEIE = 1; // set up Timer1 TMR1CS = 0; T1CON = 0xB1; TMR1ON = 1; TMR1IE = 1; TMR1IP = 1; PEIE = 1; // set up Timer2 for 1ms T2CON = 0x4D; PR2 = 249; // 40MHz TMR2ON = 1; TMR2IE = 1; TMR2IP = 1; PEIE = 1; // Turn on INT0 interrupt INT0IE = 1; TRISB0 = 1; TRISB1 = 1; INTEDG0 = 1; // Turn on INT1 interrupt INT1IE = 1; TRISB0 = 1; TRISB1 = 1; INTEDG1 = 1; T1 = 0; TIME = 0; Wait_ms(500); // Send welcome message SCI_CRLF(); SCI_CRLF(); SCI_CRLF(); for (i=0; i<40; i++) { while(!TRMT); TXREG = MSG0[i]; } SCI_CRLF(); for (i=0; i<40; i++) { while(!TRMT); TXREG = MSG1[i]; } SCI_CRLF(); for (i=0; i<40; i++) { while(!TRMT); TXREG = MSG2[i]; } SCI_CRLF(); for (i=0; i<40; i++) { while(!TRMT); TXREG = MSG3[i]; } SCI_CRLF(); Wait_ms(1000); // turn on all interrupts GIE = 1; U = 5; D2A(U); TIME = 0; while(1) { while(DELAY); DELAY = 10; // sampling rate in ms TIME += 1; if(TIME > 500) { TIME = 0; U = -U; } D2A(U); SPEED = DIR*(31415.6 / P1); SCI_Float(SPEED); SCI_CRLF(); } }