#include #include #include #include #include /* must include for atoi */ #define DATA_EEMEM_PROTECT_DISABLE 0x0100 #define XT_OSC 0x0001 #define DISABLE_DEBUG 0x0800 #define CP0 0x1010 #define CP1 0x2020 /* 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); #define bitset(var,bitno) ((var) |= (1 << (bitno))) #define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) #define bittst(var,bitno) (var & (1 << (bitno))) /* generates a square wave using timer 2 and the CCP module */ /* return 8 bit char from Recieve port */ char getch () { unsigned char c; /* while (!RCIF) */ while (!bittst(PIR1,5)); /* check RCIF bit */ c = RCREG; return(c); } /* send 8 bit char to Recieve port */ void putch (c) char c; { /* wait until transmit reg empty */ /* while (!TXIF) */ while (!bittst(PIR1,4)); /* check RCIF bit */ TXREG = c; } void pcrlf () { putch(0x0a); putch(0x0d); } char tmpbuf[16]; getnum() { char c; char i; i = 0; do { tmpbuf[i] = 0; c = getch(); putch(c); if (!(isdigit(c)) && (i != 0)) break; /* this will skip leading non-digit characters */ if (isdigit(c)) { tmpbuf[i] = c; i++; } } while (1); } main(void) { char inchar; unsigned int i; /* 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 */ #if 1 SPBRG = 95; /* 9600 in high baud rate mode, crystal = 14.7456 Mhz */ #endif bitset(TRISC, 7); /* serial port enable */ bitset(TRISC, 6); /* serial port enable */ bitset(RCSTA, 7); /* serial port enable */ bitclr(RCSTA, 6); /* 8-bit reception */ /* set baud rate */ bitset(RCSTA, 4); /* enable recieve */ /* enable I2C */ SSPCON = 0x28; //Master mode //SSPADD = 8; // close to 100 Khz rate on i2c bus for 3.6864 Mhz //SSPADD = 1; // over 400Khz for 3.6864 Mhz SSPADD = 8; // about 400Khz for 14.7456 Mhz, verified to work //bitset(SSPSTAT,7); //disable slew rate control for 100 Khz bitset(SSPCON,5); //SSPEN = 1; bitset(SSPCON,4); //CKP = 1; bitset(TRISC,3); bitset(TRISC,4); // SDA, SCL pins are inputs /* configure timer 2*/ /* post scale of 1 */ bitclr(T2CON, 6); bitclr(T2CON, 5); bitclr(T2CON, 4); bitclr(T2CON, 3); /* pre scale of 4 */ bitclr(T2CON, 1); bitset(T2CON, 0); /* start timer 2 */ bitset(T2CON, 2); /* set up PWM */ PR2 = 255; /* set timer2 PR register */ CCPR1L = (255 >> 1); /* 50% duty cycle */ bitclr(CCP1CON, 5); bitclr(CCP1CON, 4); /* set CCP1 output */ bitclr(TRISC,2); /* PWM Mode */ bitset(CCP1CON, 3); bitset(CCP1CON, 2); bitclr(CCP1CON, 1); bitclr(CCP1CON, 0); for(;;) { printf ("Enter PR2 value: "); getnum(); i = atoi(tmpbuf); pcrlf(); printf ("New PR2 value is %d ",i); pcrlf(); PR2 = i ; CCPR1L = i >> 1; printf ("Enter prescale (1,4,16): "); pcrlf(); getnum(); i = atoi(tmpbuf); if (i==1) { /* pre scale of 4 */ bitclr(T2CON, 1); bitclr(T2CON, 0); } if (i==4) { /* pre scale of 4 */ bitclr(T2CON, 1); bitset(T2CON, 0); } if (i==16) { /* pre scale of 16 */ bitset(T2CON, 1); bitclr(T2CON, 0); } } }