/* * File: main_PIC16F1827_Timer1.c * Author: elektronikawsrode * * */ // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = ON // MCLR Pin Function Select (MCLR/VPP pin function is MCLR) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset) #pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), high trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #include #define _XTAL_FREQ 500000 // zawsze potrzebne dla makra __delay_ms() #define LED_RED PORTAbits.RA0 #define LED_GREEN PORTAbits.RA1 unsigned char wyzwalacz_red, wyzwalacz_green; // Obsługa przerwań void __interrupt() przerwanie(void) { // SprawdĽ czy to przerwanie TIMER1 65536 0 65536 0 if (PIR1bits.TMR1IF) { // Tutaj umie¶ć kod obsługi przerwania TIMER1 wyzwalacz_red = 1; // Wyczy¶ć flagę przerwania PIR1bits.TMR1IF = 0; } // SprawdĽ czy to przerwanie INT if(INTCONbits.INTF){ wyzwalacz_green =1; INTCONbits.INTF = 0; } } void main(void) { TRISAbits.TRISA0 = 0; // RA0 jako wyjście bo dioda TRISAbits.TRISA1 = 0; // RA1 jako wyjście bo dioda TRISBbits.TRISB0 = 1; // RB0 jako wejście OPTION_REGbits.nWPUEN = 0; // potrzebne aby wł±czyć PULL-UP (podciągnięcie do +) na pinach // Konfiguracja oscylatora OSCCONbits.IRCF // IRCF<3:0>: Internal Oscillator Frequency Select bits // 000x =31 kHz LF // 0010 =31.25 kHz MF // 0100 =62.5 kHz MF // 0101 =125 kHz MF // 0110 =250 kHz MF // 0111 =500 kHz MF (domyslne po RESET) // 1011 =1 MHz HF // 1100 =2 MHz HF // 1101 =4 MHz HF // 1110 =8 MHz or 32 MHz HF // 1111 =16 MHz HF OSCCONbits.IRCF = 0b0111; // Konfiguracja TIMER1 T1CONbits.TMR1CS = 0b00; // Ustawienie źródła sygnału zegarowego na wewnętrzny // Ustawienia preskalera T1CONbits.T1CKPS // 0b00 - 1:1 // 0b01 - 1:2 // 0b10 - 1:4 // 0b11 - 1:8 T1CONbits.T1CKPS = 0b11; // Ustawienie preskalera na 1 // Wł±czenie przerwań TIMER1 i INT PIR1bits.TMR1IF = 0; // Wyczyść flagę przerwania TIMER1 INTCONbits.INTF = 0; // Wyczyść flagę przerwania INT OPTION_REGbits.INTEDG = 0; // ustawienie w jaki sposób przerwanie INT będzie rozpoznawane - przez zbocze opadające PIE1bits.TMR1IE = 1; // Włącz przerwanie TIMER1 INTCONbits.PEIE = 1; // Włącz przerwania urządzeń peryferyjnych INTCONbits.GIE = 1; // Włącz globalne przerwania INTCONbits.INTE = 1; // Włączenie przerwania INT na jedynie dostępnym pinie RB4 T1CONbits.TMR1ON = 1; // Włącz TIMER1 LED_RED = 0; LED_GREEN = 0; // Pętla nieskończona while (1) { if(wyzwalacz_red == 1){ LED_RED = 1; __delay_ms(500); wyzwalacz_red = 0; } else LED_RED = 0; if(wyzwalacz_green == 1){ LED_GREEN = 1; __delay_ms(500); wyzwalacz_green = 0; } else LED_GREEN = 0; __delay_ms(100); } }