; vyuka podprogramu - PPS a PWM ; #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 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 TMR4 ; TAKZE HLEDAME CHYBU start: banksel INTCON clrf INTCON ; nadbytecne, ale budiz banksel ADCON0 movlw 0x6c ; 0110 1100 11011 = Reserved. No channel connected. movwf ADCON0 ; vypinam prevodnik ; to je take mozna nadbztecne, ; ale je to v asm02 a funguje to banksel OSCCON movlw 0x6a ; 0110 1010 - 1101 pro delicku - 4MHz movwf OSCCON ; movlw 2E ; 1F je maximalni frekvence ; 2e je -18 , tedy o 1.6 procenta pomaleji movlw 0 ; stredni frekvence movwf OSCTUNE banksel TRISA movlw 0xff movwf TRISA movwf TRISB movwf TRISC bcf TRISB,5 ; tady chceme mit vystup PWM ; TRIS MUSI byt nastaven spravne, neni to jedno , viz kap. 17.1 ; pro PWM MUSI byt TRIS nastaven jako output banksel ANSELA clrf ANSELA clrf ANSELB clrf ANSELC ; TMR4 bude na PWM , dale za tim postscaller deli 16 ; 3. Load the PR4 register with the PWM period value. banksel TMR4 movlw .189 movwf PR4 ; ; 5. Configure and start Timer4: banksel T4CON movlw 0x1f ; -001 1111 ; prescaller 64 , citac zapnut ; postscaller 4 - !!!! TEN NEMA NA PWM VLIV ; postscaller jenom prodluzuje dobu pro zavolani prerusen ; na jedeno preruseni od TMR4 to udela 4 periody PWM movwf T4CON BANKSEL PPSLOCK ; unlock sekvence movlw 0x55 movwf PPSLOCK movlw 0xAA movwf PPSLOCK bcf PPSLOCK,PPSLOCKED ; Set PPSLOCKED bit to disable writes banksel RB5PPS movlw 0x0e movwf RB5PPS ; vystup PWM3 na pinu RB5 banksel T0CKIPPS movlw 0x13 movwf T0CKIPPS ; vstup citace TMR0 na pinu 7 - RC3 BANKSEL PPSLOCK ; lock sekvence movlw 0x55 movwf PPSLOCK movlw 0xAA movwf PPSLOCK bsf PPSLOCK,PPSLOCKED ; Set PPSLOCKED bit to disable writes ; tady je nastaveni PWM banksel CCPTMRS ; vyber citace pro modul PWM movlw 0xdf ; 11 01 11 11 1101 1111 01 - PWM3 based on TMR4 jinak od TMR2 movwf CCPTMRS ; 11 -reserved - ale neni jasne, co to je, ale funguje to s tim banksel PWM3CON clrf PWM3CON ; 4. Load the PWMxDCH register and bits <7:6> of ;the PWMxDCL register with the PWM duty cycle value. banksel PWM3DCH ; movlw 0xc0 ; movwf PWM3DCL ; 11 na nejvyssich bitech registru clrf PWM3DCL movlw .49 movwf PWM3DCH banksel PWM3CON movlw 0x80 movwf PWM3CON banksel OPTION_REG movlw B'10111000' ; 1011 1xxx - strana 244, OPTION_REG movwf OPTION_REG ; vnejsi zdroj hodin pro TMR0, delicka deli 1 , citne na vzestupnou hranu banksel TMR0 clrf TMR0 clrf PIR1 clrf PIR2 clrf PIR3 banksel PIE1 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 pozadavkovz bit nop nop nop retfie ODTMR4: banksel PIR2 bcf PIR2, TMR4IF ; banku mame nastavenou uz z preruseni nop nop nop ; sem si dejte breakpoint a divejte se do Logic analyzeru retfie end