#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); } /* reads A/D value and uses this as PWM value */ /* assumes LEFT JUSTIFICATION */ update_pwm(){ unsigned char rval1; rval1 = ADRESH; CCPR1L = rval1; rval1 = ADRESL; if (bittst(rval1,7)) bitset(CCP1CON, 5); else bitclr(CCP1CON, 5); if (bittst(rval1,6)) bitset(CCP1CON, 4); else bitclr(CCP1CON, 4); /* start new conversion */ bitset(ADCON0, 2); /* start conversion */ } unsigned char do_update_pwm; void interrupt timer2_isr(void) { update_pwm(); bitclr(PIR1,1); // TMR2IF = 0; clear timer interrupt flag } main(void) { /* 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 */ 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 */ SPBRG = 95; /* 9600 in high baud rate mode, crystal = 14.7456 Mhz */ 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 A/D inputs of PORT A to be all digital inputs */ ADCON1 = 0x0E; /* Port A analog input, left justification of result */ TRISA = 0xFF; /* all bits input */ ADCON0 = 0x80; /* sampling freq = Fsoc/32, channel 0 */ bitset(ADCON0,0); /* turn on ADC*/ printf("ADC is configured!!!"); pcrlf(); /* configure timer 2*/ /* post scale of 16 */ bitset(T2CON, 6); bitset(T2CON, 5); bitset(T2CON, 4); bitset(T2CON, 3); #if 0 /* pre scale of 4 */ bitclr(T2CON, 1); bitset(T2CON, 0); #endif #if 1 /* pre scale of 16 */ bitset(T2CON, 1); bitset(T2CON, 0); #endif /* start timer 2 */ bitset(T2CON, 2); /* set up PWM */ PR2 = 255; /* set timer2 PR register, always set for 225 for this choice */ 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); // enable interrupts bitclr(PIR1,1); // TMR2IF = 0; clear timer interrupt flag bitset(PIE1, 1) ; // enable timer2 interrupt TMR1IE = 1; bitset(INTCON,6); /* enable peripheral interrupts, PEIE */ bitset(INTCON,7); /* enable global interrupts, GIE */ for(;;) { /* let interrupt do all of the work */ } }