// PIC18 in C - Versione 0.5 - Giugno 2015 // Copyright (c) 2015, Vincenzo Villa // Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported. // Creative Commons | Attribution-Share Alike 3.0 Unported // https://www.vincenzov.net/progetti/PICdemo // Reference - PIC18F2xK20 data sheet // PIC18F25K20 Configuration Bit Settings #include // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1H #pragma config FOSC = INTIO67 // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) #pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled) // CONFIG2L #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = SBORDIS // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled)) #pragma config BORV = 18 // Brown Out Reset Voltage bits (VBOR set to 1.8 V nominal) // CONFIG2H #pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT is controlled by SWDTEN bit of the WDTCON register) #pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768) // CONFIG3H #pragma config CCP2MX = PORTC // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1) #pragma config PBADEN = ON // PORTB A/D Enable bit (PORTB<4:0> pins are configured as analog input channels on Reset) #pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation) #pragma config HFOFST = ON // HFINTOSC Fast Start-up (HFINTOSC starts clocking the CPU without waiting for the oscillator to stablize.) #pragma config MCLRE = ON // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled) // CONFIG4L #pragma config STVREN = ON // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset) #pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled) #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode)) // CONFIG5L #pragma config CP0 = OFF // Code Protection Block 0 (Block 0 (000800-001FFFh) not code-protected) #pragma config CP1 = OFF // Code Protection Block 1 (Block 1 (002000-003FFFh) not code-protected) #pragma config CP2 = OFF // Code Protection Block 2 (Block 2 (004000-005FFFh) not code-protected) #pragma config CP3 = OFF // Code Protection Block 3 (Block 3 (006000-007FFFh) not code-protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected) // CONFIG6L #pragma config WRT0 = OFF // Write Protection Block 0 (Block 0 (000800-001FFFh) not write-protected) #pragma config WRT1 = OFF // Write Protection Block 1 (Block 1 (002000-003FFFh) not write-protected) #pragma config WRT2 = OFF // Write Protection Block 2 (Block 2 (004000-005FFFh) not write-protected) #pragma config WRT3 = OFF // Write Protection Block 3 (Block 3 (006000-007FFFh) not write-protected) // CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0007FFh) not write-protected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection Block 0 (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection Block 1 (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection Block 2 (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection Block 3 (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0007FFh) not protected from table reads executed in other blocks) #define LED LATC //#define SWITCH PORTB //#define LOOPS 3 //#define SECONDS 5 #define _XTAL_FREQ 1000000 // Default clock frequancy void configurePorts(void); void testLed(void); void testLed2(void); void testAdc(int ch); void display(unsigned voltage); void main(void) { configurePorts(); // Configure I/O PORTs while (1) { if (PORTBbits.RB0) // First switch on testLed2(); // Blinking LEDs if (PORTBbits.RB1) // Second switch on testLed(); // Sliding LED / supercar if (PORTBbits.RB2) // Third switch on testAdc(1); // Show trimmer1 voltage if (PORTBbits.RB3) // Fourth switch on testAdc(0); // Show trimmer0 voltage } } void configurePorts(void) { // ******* PORT C as output ******* TRISC = 0b00000000; // Set RC0 -> RC7 as output // ******* PORT B (0 -> 3) as input with pull-up ******* TRISB = TRISB | 0x0F; // Set RB0 -> RB3 as input INTCON2bits.nRBPU = 0; // PORTB pull-up global enabled WPUB = WPUB | 0x0F; // RB0 -> RB3 pull-up individually enabled ANSELHbits.ANS8 = 0; //Digital input buffer of RB2 is enabled ANSELHbits.ANS9 = 0; //Digital input buffer of RB3 is enabled ANSELHbits.ANS10 = 0; //Digital input buffer of RB1 is enabled ANSELHbits.ANS12 = 0; //Digital input buffer of RB0 is enabled // ******* PORT A (0 -> 1) as analog input ******* // Nothing to do... default status // Configure ADC ADCON2bits.ADFM = 0; // Left justified ADCON2bits.ADCS = 0b000; // A/D Conversion Clock = FOSC/2 (TAD = 2 us @ 1 MHz) ADCON1bits.VCFG = 0b00; // Set VDD and VSS as voltage reference ADCON0bits.ADON = 1; // ADC is enabled } void testLed(void) { for (LED = 0b00000001; LED != 0; LED <<= 1) __delay_ms(100); // Shift left, eight times for (LED = 0b10000000; LED != 0; LED >>= 1) __delay_ms(100); // Shift right, eight times } void testLed2(void) { for (int i = 0; i < 5; i++) { LED = 0xFF; // All LEDs ON __delay_ms(200); LED = 0; // All LEDs OFF __delay_ms(200); } } void testAdc(int ch) { unsigned char voltage8bits; if (ch == 0) ADCON0bits.CHS = 0b0000; // Analog Channel Select AN0 if (ch == 1) ADCON0bits.CHS = 0b0001; // Analog Channel Select AN1 for (int i = 0; i < 200; i++) { ADCON0bits.GO = 1; // Start conversion while (ADCON0bits.nDONE); // Wait End Of Conversion voltage8bits = ADRESH; // Read voltage (8 bit only!) display(voltage8bits); // Send analog data to bargraph display __delay_ms(10); } } void display(unsigned voltage) { voltage = voltage >> 5; // Divide by 32 (voltage 0 -> 7) LED = 1 << voltage; // Shift "00000001" to left voltage times }