; zakladni nastaveni pro programy bez preruseni .include "p33EV32GM002.inc" ; file je v adresari C:\Program Files (x86)\Microchip\xc16\v1.33\support\dsPIC33E\inc ; nebo v nejakem podobnem ; NASTAVENI FUSES ; include file od radku 4800 config __FOSCSEL, FNOSC_FRC & IESO_OFF ; po RESETu je zapnut FRC oscilátor ; kmitocet FRC se nicim nedeli config __FOSC, OSCIOFNC_ON ; pin OSC2 je normalni I/O pin - port config __FWDT, FWDTEN_OFF ; watchdog vypnut config __FDMT DMTEN_DISABLE ; deadman timer vypnut .bss ktery: .space 2 zacstack: .space 20 konstack: .text ; sekce pro psani programu ; na zacatku zdrojaku jsme defaultne v sekci .text .global __reset .org 0 ; opet je to relativni oproti zacatku uyivatelske EEPROM __reset: ; tedz relativni oproti adrese 0x0200 clr PORTB clr TRISB clr ANSELB mov #zacstack, W15 ; yde jsme nastavili do STACK POINTERu zacatek STACKu mov #konstack, W0 mov W0, SPLIM ; tady jsme nastavili konec stacku. ; adresa, ktera je v bunce SPLIM, je maximalni mozna adresa pro W15 ; *********** zacina inicializace SPI mov SPI1BUF, W0 ; prazdne cteni prto zamazani Overflow erroro mov SPI1BUF, W0 clr SPI1STAT mov #0x0520 , W0 mov W0 , SPI1CON1 ; xxx0 0101 0010 0000 ; | |||| |||| |||| ; | |||| |||| ||00 primary prescaller :64 ; | |||| |||0 00 secondary prescaller :8 ; | |||| ||| hodiny jsou tedy 7.37 / 2 / 64 / 8 = 7197 Hz ; | |||| ||| pro 16 bit? je to 2.2 ms na vyslani jednoho cisla ; | |||| ||1 MSTEN Master mód ; | |||1 0 CKE==1 CKP==0 vybirame 3. variantu hodin na Fugure 3-2 ; | ||| ; | ||0 SMP jakkoli - stejne nic nebudeme prijimat ; | |1 MODE16 vysilam 16 bitu ; | 0 DISDO chceme vysilat data na SDO ; 0 DISSCK chceme generovat hodiny clr SPI1CON2 bset SPI1STAT , #SPIEN ; zapiname modul SPI mov #14394 , W0 ; na preruseni s periodou 1 sec mov W0 , PR2 mov #0x8030 , W0 ; 1x0x xxxx x011 0x0x delime 256 , hodiny Fosc/2 mov W0 ,T2CON bclr IFS0, #T2IF ; pro jistotu nuluji pozadavkove bity bclr IFS0, #SPI1IF bset IEC0, #T2IE ; povoluji preruseni od citace bset IEC0, #SPI1IE ; povoluji preruseni od SPI bset INTCON2, #GIE ; generalni povoleni preruseni cyklus: nop nop ; sem prijde to, co se v programu nop ; dela stale porad dokolecka nop goto cyklus __T2Interrupt: ; takhle se to MUSI jmenovat nop bclr IFS0, #T2IF ; nuluji pozadavkovy bit btg ktery , #0 ; licha nebo suda sekunda mov #0xffff , W0 ; v liche sekunde zapisuji 0xffff , v sude 0x00 btss ktery , #0 mov #0x00 , W0 call odvysilejpoSPI ; v reg. W0 je cislo, ktere budu vysilat nop retfie odvysilejpoSPI: mov SPI1BUF, W1 ; SPIBUF MUSIME precist mov W0, SPI1BUF ; start vysilani dat na SPI return __SPI1Interrupt: ; SPI odvysilal data bclr IFS0 , #SPI1IF btg PORTB , #15 ; neguji bit, abych poznal, zda se preruseni zavolalo retfie .end ; tady prestan prekladat ; !!!!!! end NENI !!!!!! konec programu