// PIC18 in C - Versione 0.1 - Luglio 2014 // Copyright (c) 2014, Vincenzo Villa // Creative Commons | Attribuzione-Condividi allo stesso modo 3.0 Unported. // Creative Commons | Attribution-Share Alike 3.0 Unported // https://www.vincenzov.net/tutorial/PIC18/timer0.htm // Reference: PIC18F14K50 data sheet (note: page as DS41350C printed edition) // [1] REGISTER 2-1: OSCCON: OSCILLATOR CONTROL REGISTER - Page 16 // [2] REGISTER 9-12: TRISC: PORTC TRI-STATE REGISTER - Page 90 // [3] REGISTER 9-11: PORTC: PORTC REGISTER - Page 90 // [4] REGISTER 7-10: RCON: RESET CONTROL REGISTER - Page 74 // [5] REGISTER 7-2: INTCON2: INTERRUPT CONTROL 2 REGISTER - Page 66 // [6] REGISTER 7-1: INTCON: INTERRUPT CONTROL REGISTER - Page 65 // [7] REGISTER 10-1: T0CON: TIMER0 CONTROL REGISTER - Page 97 // [8] TABLE 10-1: REGISTERS ASSOCIATED WITH TIMER0 // [9] REGISTER 9-13: LATC: PORTC DATA LATCH REGISTER #define _XTAL_FREQ 1000000 // Default PIC18F14K50 clock [1] #define TIMER0_VALUE 3036 // See text - 0,5 Hz blink #include "configurationsbits.h" void interrupt __low_priority my_isr_l(void) { if (INTCONbits.TMR0IF == 1) // Interrupt from Timer0? [6] { TMR0H = TIMER0_VALUE >> 8; // Write 8 MSB to Timer0 [8] - BEFORE! TMR0L = TIMER0_VALUE & 0xFF; // Write 8 LSB to Timer0 [8] LATCbits.LC1 = ~LATCbits.LC1; // Change LEDs status [9] INTCONbits.TMR0IF = 0; // Clear interrupt status [6] } } void main(void) { TRISC = 0x00; // Set PORTC as output [2] PORTC = 0; // Turn off all LED [5] RCONbits.IPEN = 1; // Enable priority levels on interrupts [4] T0CONbits.T08BIT = 0; // Timer0 is configured as a 16-bit timer/counter [7] T0CONbits.T0CS = 0; // Internal instruction cycle clock (_XTAL_FREQ / 4 = 250 kHz) [7] T0CONbits.PSA = 0; // Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output [7] T0CONbits.T0PS = 0b001; // 1:4 prescale value [7] TMR0H = TIMER0_VALUE >> 8; // Write 8 MSB to Timer0 [8] - BEFORE! TMR0L = TIMER0_VALUE & 0xFF; // Write 8 LSB to Timer0 [8] INTCON2bits.TMR0IP = 0; // Set low priority interrupt [5] INTCONbits.TMR0IE = 1; // Enables the TMR0 overflow interrupt [6] INTCONbits.GIEL = 1; // Enables all low priority interrupts [6] INTCONbits.GIEH = 1; // Enables all interrupts [6] T0CONbits.TMR0ON = 1; // Enable Timer0 [7] while (1) { // 5 Hz LED blink, forever LATCbits.LC0 = ~LATCbits.LC0; __delay_ms(100); } }