; vyuka podprogramu - vpreruseni - priorita preruseni ; #include p16f1708.inc code __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _IESO_OFF & _FCMEN_OFF & _CLKOUTEN_OFF ; & _CLKOUTEN_OFF timhle se da vypnout vnitrni oscilator na pinu RA4 - pin 3 __CONFIG _CONFIG2, _WRT_OFF & _LVP_OFF & _PPS1WAY_ON & _ZCDDIS_ON & _PLLEN_OFF & _STVREN_ON & _LPBOR_OFF & _BORV_HI & _LPBOR_OFF org 0 goto start ; interrupt org 4 nop ; sem si dejte breakpoint nop ; a dale pokracujte pomoci F7 btfsc INTCON,T0IF goto ODTMR0 banksel PIR1 btfsc PIR1, TMR2IF goto ODTMR2 btfsc PIR2, TMR4IF goto ODTMR4 nop nop goto $ ; tady uz NENI RETFIE, protoze to je na konci kazdeho ; jednotliveho obsluzneho programu pro citac ; !!!!! pokud program zabloudi do tohoto mista, je neco HODNE SPATNE ; znamena to, ze je povoleno preruseni od nejakeho zdroje, ; se kterym nepocitame, tedy je povoleno jeste neco dalsiho nez ; TMR0 TMR2 TMR4 ; TAKZE HLEDAME CHYBU start: banksel OPTION_REG movlw B'00001000' ; xx0x 1xxx - strana 244, OPTION_REG movwf OPTION_REG banksel TMR0 clrf TMR0 clrf PIR1 clrf PIR2 clrf PIR3 clrf TMR2 ; je ve stejne bance jako TMR0 ; X000 0101 prescaller 4 movlw 05 movwf T2CON movlw .74 movwf PR2 ; bude volat preruseni po 300 instrukcnich cyklech banksel TMR4 movlw 05 movwf T4CON movlw .99 movwf PR4 ; bude volat preruseni po 400 instrukcnich cyklech banksel PIE1 bsf PIE1, TMR2IE ; povoluji preruseni od citace TMR2 bsf PIE2, TMR4IE ; povoluji preruseni od citace TMR4 banksel 0 bsf INTCON, TMR0IE ; povoluji preruseni od TMR0 bsf INTCON, PEIE ; povoluji preruseni od periferii, tedy od TMR2 a TMR4 bsf INTCON, GIE ; generalni povoleni preruseni je az uplne nakonec vsech konfiguraci cyklime: nop nop nop nop nop nop nop nop goto cyklime ODTMR0: bcf INTCON,T0IF ; nuluji pozadavkovy bit nop nop nop retfie ODTMR2: bcf PIR1, TMR2IF ; banku mame nastavenou uz z preruseni nop nop nop retfie ODTMR4: bcf PIR2, TMR4IF ; banku mame nastavenou uz z preruseni nop nop nop retfie end