#include #include /* must include this for printf to work */ #include #include /* must include this for printf to work */ #include /* must include for atoi */ #define CP0 0x1010 #define CP1 0x2020 #define DATA_EEMEM_PROTECT_DISABLE 0x0100 #define XT_OSC 0x0001 #define DISABLE_DEBUG 0x0800 /* CP0,CP1 code protect off*/ /* other bits zero which means WDT disabled Low Voltage prm disabled, brownout disabled power up timer enabled */ __CONFIG((CP1 | CP0) | DATA_EEMEM_PROTECT_DISABLE | XT_OSC | DISABLE_DEBUG); /* 'getch' uses interrupt driven input to read the values from the serial port. This program reads decimal number, computers the integer square root, and prints it out. Will be used to illustrate buffering in interrupt driven input Add overrun test, framing error test, baud rate choice, and input buffering. */ /* solution to interrupt lab */ /* use PB5, PB4 to read dip switches */ #define bitset(var,bitno) ((var) |= (1 << (bitno))) #define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) #define bittst(var,bitno) (var & (1 << (bitno))) unsigned char received_char; unsigned char got_char_flag; /* return 8 bit char from Recieve port */ /* interrupt driven version */ unsigned char getch () { unsigned char c; /* while (!RCIF) */ /* while (!bittst(PIR1,5));*/ /* check RCIF bit */ while (!got_char_flag); c = received_char; got_char_flag = 0; return(c); } /* send 8 bit char to Recieve port */ void putch (c) unsigned char c; { /* wait until transmit reg empty */ /* while (!TXIF) */ while (!bittst(PIR1,4)); /* check RCIF bit */ TXREG = c; } /* interrupt service routine */ void interrupt pic_isr(void) { /* see if this interrupt was generated by a receive character */ if (bittst(PIR1,5)) { /* check RCIF bit */ received_char = RCREG; /* reading this register clears interrupt bit */ got_char_flag = 1; } } void pcrlf () { putch(0x0a); putch(0x0d); } char tmpbuf[16]; getnum() { char c; char i; i = 0; do { tmpbuf[i] = 0; c = getch(); if (!(isdigit(c)) && (i != 0)) break; /* this will skip leading non-digit characters */ if (isdigit(c)) { tmpbuf[i] = c; i++; } } while (1); } unsigned long wreg,root,temp,ivalue; /* iterative integer sqroot algorithm*/ /* for 16 bit values. */ sqroot() { int i,j; long x; wreg = 0; root = 0; temp = 0; for (i = 0 ; i < 16; i++) { for (j = 0; j < 2; j++){ x = ivalue & 0x80000000; wreg = wreg << 1; ivalue = ivalue << 1; if (x) { wreg = wreg | 0x1; } } temp = root << 1; root = root << 1; root |= 0x1; temp = temp << 1; temp |= 0x1; if (temp > wreg) { root = root ^ 0x1; } else { wreg = wreg - temp; } } } main(void) { unsigned char c,i; unsigned int k; /* set baud rate */ /* setup Async communication */ bitclr(TXSTA, 6); /* 8-bit transmit */ bitset(TXSTA, 5); /* transmit enable*/ bitclr(TXSTA, 4); /* async mode */ bitset(TXSTA, 2); /* high speed mode */ //SPBRG = 25; /* 9600 in high baud rate mode, crystal = 4.00 Mhz */ // high baud rate mode SPBRG = (Fosc/(baud_rate*16)) - 1 SPBRG = 95; /* 9600 in high baud rate mode, crystal = 14.7456 Mhz */ bitset(TRISC, 7); /* serial port enable */ bitset(TRISC, 6); /* serial port enable */ bitset(RCSTA, 7); /* serial port enable */ bitclr(RCSTA, 6); /* 8-bit reception */ bitset(RCSTA, 4); /* enable recieve */ /* enable interrupts */ bitset(PIE1, 5); /* enable receive interrupt, RCIE */ bitset(INTCON,6); /* enable peripheral interrupts, PEIE */ bitset(INTCON,7); /* enable global interrupts, GIE */ printf("Hit any key to enter input loop..."); pcrlf(); getch(); for(;;) { getnum(); ivalue = atol(tmpbuf); sqroot(); printf("Sq Root is "); k = root; printf("%d",k);pcrlf(); } }