; program pro pouziti PLL ; pin 4 RB0 oznami prepnuti na 50 MHz a oznamuje stack error ; pin 5 RB1 blika 1 Hz podle TMR2 , po prepnuti kmitoctu blika rychleji ; pin 11 RB4 vystup vnitrni frekvence oscilatoru ; fuses jsou ve file fuses_oscil.c , tento file si add-nete .include "p33EV32GM002.inc" .bss ; sekce pro definici bunek - EQU .org 0 zacstack: ; prvnibunka 0x1000 - zacatek pameti RAM .space 40 ; 20 vlozenych volani podprogramu konstack: .space 8 pocitT2: .space 2 .text ; sekce pro psani programu ; na zacatku zdrojaku jsme defaultne v sekci .text .global __reset .org 0 ; opet je to relativni oproti zacatku uzivatelske EEPROM __reset: ; tedy relativni oproti adrese 0x0200 BCLR INTCON2, #GIE ; zakazuji přerušení clr ANSELA clr ANSELB clr PORTA clr PORTB mov #0xffff, W0 mov W0, TRISA mov W0, TRISB bclr TRISB,#0 ; pin na oznameni prepnuti oscilatoru bclr TRISB,#1 ; pin blikani citacem TMR2 bclr TRISB,#4 ; tady bude vystup vnitrniho oscilatoru mov #zacstack, W15 mov #konstack, W0 mov W0, SPLIM mov #10, W0 mov W0, pocitT2 mov #14394 , W0 mov W0, PR2 mov #0x8030 ,W0 ; 1000 0000 0011 0000 delime 256 mov W0, T2CON ; 7.37 MHz a bude to mit asi 1 Hz bclr IFS0, #T2IF bset IEC0, #T2IE bset INTCON2, #GIE cekame: cp0 pocitT2 ; testujeme na 0 bra NZ, cekame ; a dokud neni 0, skaceme ; pocitT2 dekrementuje v preruseni od TMR2 bclr INTCON2, #GIE ; kvuli unlock sekvencim ; OSCCONL (low byte) Unlock Sequence MOV #OSCCONL, w1 ; !!!! Tady zapisujeme CISLO do registru, adresu registru ; OSCCON do registru W1, tedy číslo 0x0742 MOV #0x46, w2 MOV #0x57, w3 MOV.B w2, [w1] ; Write 0x46 MOV.B w3, [w1] ; Write 0x57 ; povoleni zapisu do registru PPS BCLR OSCCON, #6; Clear IOLOCK bit – muzeme psát do registrů pro PPS ; tady se nastavi vsechy registry pro PPS RPOR1 dolni ; RB4 pin 11 vystup vnitrnioho oscilatoru mov #0x0031 ,W3 mov W3, RPOR1 ;OSCCONL (low byte) Unlock Sequence MOV #OSCCONL, w1 MOV #0x46, w2 MOV #0x57, w3 MOV.B w2, [w1] ; Write 0x46 MOV.B w3, [w1] ; Write 0x57 ; povoleni zapisu do registru PPS BSET OSCCON, #6; set IOLOCK bit – uz zase nemuzeme psat do registrů pro PPS mov #0x0000, W3 mov W3, REFOCON ; nezapomeneme nastavit delicku pro vystup hodin ( delime 1 ) bset REFOCON, #15 ; po nastaveni delickz zapiname delicku nastavenim bitu 15 ; tady dale nastavujeme frekvenci 50 MHz ; postup je konformni s prikladem v *.doc file ; CLKDIV xxxx xxxx xxxx xxxx ; ||| || | |||| ; ||| || PLLPRE 00001 = Input divided by 3 ; ||| || ; ||| PLLPOST 01 = Output divided by 4 ; ||| ; FRCDIV 000 = FRC divided by 1 ; celkem 0000 0000 0100 0001 0x0041 mov #0x0041, W1 mov W1, CLKDIV mov #79, W1 mov W1, PLLFBD ; delime cislem 81 , tim tedy nasobi PLL ;Place the New Oscillator Selection (NOSC=001) in W0 MOV #0x1, w0 ; 001 je PPL ;OSCCONH (high byte) Unlock Sequence MOV #OSCCONH, w1 MOV #0x78, w2 MOV #0x9A, w3 MOV.B w2, [w1] ; Write 0x78 MOV.B w3, [w1] ; Write 0x9A povolen yapis na jednu nasledujici instrukci ;Set New Oscillator Selection MOV.B w0, [w1] ; tady pisu do hornich bitu OSCCON 001 , to je PLL ;OSCCONL (low byte) Unlock Sequence MOV #OSCCONL, w1 MOV #0x46, w2 MOV #0x57, w3 MOV.B w2, [w1] ; Write 0x46 MOV.B w3, [w1] ; Write 0x57 ; Enable Clock Switch BSET OSCCON, #0; Request Clock Switching by Setting OSWEN bit ; tahle instrukce odstartovala prepnuti oscilatoru wait: btsc OSCCONL, #OSWEN bra wait ; a tady cyklim, dokud se to neprepne bset PORTB, #0 ; oznamuji prepnuti oscilatoru bset INTCON2, #GIE ; povoluji preruseni ; a bit RB1 zacne blikat rychleji cyklus: nop nop ; sem prijde to, co se v programu nop ; dela stale porad dokolecka nop ; tady mame prepnuto na 50 MHz goto cyklus ; ******************************************************* ; PRERUSENI __T2Interrupt: bclr IFS0, #T2IF btg PORTB, #1 ; blikame s RB1 dec pocitT2 retfie ; ***************************************** ; __StackError: .global __StackError chybastacku: bclr PORTB,#0 do #5, st03 do #400, st01 repeat #24550 nop ; 0.5 ms pauza st01: nop st03: btg PORTB,#0 do #4000, st04 ; 1 sec pauza repeat #24550 nop ; 0.5 ms pauza st04: nop goto chybastacku .end ; tady prestan prekladat ; !!!!!! end NENI !!!!!! konec programu