/* Includes */ #include "delays.h" /* Configuration */ //300000h CONFIG1L Default (--00 0000) //- - USBDIV CPUDIV1 CPUDIV0 PLLDIV2 PLLDIV1 PLLDIV0 #pragma config USBDIV = 2 // Clock source from 96MHz PLL/2 #pragma config CPUDIV = OSC1_PLL2 #pragma config PLLDIV = 5 // (20 MHz crystal on PICDEM FS USB board) //300001h CONFIG1H Default (00-- 0101) //IESO FCMEN - - FOSC3 FOSC2 FOSC1 FOSC0 #pragma config IESO = OFF #pragma config FCMEN = OFF #pragma config FOSC = HS //(HSPLL_HS) CPU clock = external 20 MHz //300002h CONFIG2L Default (--01 1111) //- - VREGEN BORV1 BORV0 BOREN1 BOREN0 PWRTEN #pragma config VREGEN = OFF // USB Voltage Regulator #pragma config BORV = 3 #pragma config BOR = ON #pragma config PWRT = OFF //300003h CONFIG2H Default (---1 1111) //- - - WDTPS3 WDTPS2 WDTPS1 WDTPS0 WDTEN #pragma config WDTPS = 32768 #pragma config WDT = OFF //300005h CONFIG3H Default (1--- -011) //MCLRE - - - - LPT1OSC PBADEN CCP2MX #pragma config MCLRE = ON #pragma config LPT1OSC = OFF #pragma config PBADEN = ON #pragma config CCP2MX = ON //300006h CONFIG4L Default (100- -1-1) //DEBUG XINST ICPRT(3) - - LVP - STVREN #pragma config XINST = OFF // Extended Instruction Set #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming #pragma config LVP = OFF #pragma config STVREN = ON //300008h CONFIG5L Default (---- 1111) //- - - - CP3(1) CP2 CP1 CP0 #pragma config CP3 = OFF #pragma config CP2 = OFF #pragma config CP1 = OFF #pragma config CP0 = OFF //300009h CONFIG5H Default (11-- ----) //CPD CPB - - - - - - #pragma config CPD = OFF #pragma config CPB = OFF //30000Ah CONFIG6L Default (---- 1111) //- - - - WRT3(1) WRT2 WRT1 WRT0 #pragma config WRT3 = OFF #pragma config WRT2 = OFF #pragma config WRT1 = OFF #pragma config WRT0 = OFF //30000Bh CONFIG6H Default (111- ----) //WRTD WRTB WRTC - - - - - #pragma config WRTD = OFF #pragma config WRTC = OFF #pragma config WRTB = OFF // Boot Block Write Protection //30000Ch CONFIG7L Default (---- 1111) //- - - - EBTR3(1) EBTR2 EBTR1 EBTR0 #pragma config EBTR3 = OFF #pragma config EBTR2 = OFF #pragma config EBTR1 = OFF #pragma config EBTR0 = OFF //30000Dh CONFIG7H Default (-1-- ----) //- EBTRB - - - - - - #pragma config EBTRB = OFF /* Initialisation */ #define LED PORTDbits.RD4 #define Cpul PORTDbits.RD5 #define ADCn(Chan) ((((Chan)&0x0F)<<2) | 0x01) #define ADCgo ADCON0bits.GO_DONE #define PROCESSOR_FREQ 20000000 #define Bauds(bval, bmul) (PROCESSOR_FREQ/((bval)*(bmul)) - 1)&0xFF #define BAUD57600 Bauds(57600, 4) unsigned char output_buffer[28]; /* Functions */ void SetPorts(void) { TRISAbits.TRISA0=1; //AN0 TRISAbits.TRISA1=1; //AN1 TRISAbits.TRISA2=1; //AN2 measure Vref TRISAbits.TRISA3=1; //AN3 TRISAbits.TRISA4=1; //NC TRISAbits.TRISA5=1; //AN4 TRISAbits.TRISA6=1; //NC // TRISA7 doesn't exist TRISBbits.TRISB0=1; //AN12 TRISBbits.TRISB1=1; //AN10 TRISBbits.TRISB2=1; //AN8 TRISBbits.TRISB3=1; //AN9 TRISBbits.TRISB4=1; //AN11 TRISBbits.TRISB5=1; //Reserved for programming TRISBbits.TRISB6=1; //Reserved for programming TRISBbits.TRISB7=1; //Reserved for programming TRISCbits.TRISC0=1; //NC TRISCbits.TRISC1=1; //NC TRISCbits.TRISC2=1; //NC // TRISC3 doesn't exist // TRISCbits.TRISC4=1; //USB pin // TRISCbits.TRISC5=1; //USB pin TRISCbits.TRISC6=1; //TXE TRISCbits.TRISC7=1; //RXF TRISDbits.TRISD0=1; //NC TRISDbits.TRISD1=1; //NC TRISDbits.TRISD2=1; //NC TRISDbits.TRISD3=1; //NC TRISDbits.TRISD4=0; //LED TRISDbits.TRISD5=0; //Cpul TRISDbits.TRISD6=1; //NC TRISDbits.TRISD7=1; //NC TRISEbits.TRISE0=1; //AN5 TRISEbits.TRISE1=1; //AN6 TRISEbits.TRISE2=1; //AN7 // TRISEbits.TRISE3=1; //reserved for programming // TRISE4...TRISE7 do not exist LED = 0; Cpul = 0; } void Config(void) { ADCON0 = 0x01; // enable ADC ADCON1 = 0x00; // internal Vref, all analogue ADCON2 = 0b10010110; // right justif, Tacq = 4Tad, Fosc/64 (Tad=1.33us) CMCON = 0b00000111; // disable comparator inputs CVRCON = 0x00; // disable Vref } void SetSerial(void) { TXSTA = 0x24; RCSTA = 0x80; BAUDCON = 0x08; SPBRGH = 0x00; SPBRG = BAUD57600; } void DoADC(char Chan) { ADCON0 = ADCn(Chan); ADCgo = 1; while(ADCgo==1); } void main(void) { unsigned char i; volatile unsigned char Count = 0; SetPorts(); Config(); SetSerial(); output_buffer[0] = 0xA0; // header output_buffer[27] = 0x40; // terminator while(1) { for (i=0; i<13; i++) { DoADC(i); output_buffer[2*i+1] = (ADRESL & 0xE0)>>3 | ADRESH; output_buffer[2*i+2] = ADRESL & 0x1F; } for (i=0; i<28; i++) { while((!TXSTAbits.TRMT) || !PIR1bits.TXIF); TXREG = output_buffer[i]; } Delay1KTCYx(50); // ~10ms Count++; if (Count==31) LED = 1; if (Count==63) { LED = 0; Count = 0; } } }