; SPI - master mod ; piny SDO - pin 7 procesoru - output - RC3 ; SDI - pin 8 procesoru - input - RC6 ; SCK - pin 9 procesoru - output - RC7 ; ; dale pouzit citac TMR4 , tim generuji preruseni po 1 ms . ; na SPI budeme dokolecka vysilat cisla od 0 do 255, porad dokola ; delka vysilani ynaku po SPI je asi 1/3 y periody TMR4 ; zaroven 10 pin procesoru slouzi jako SS pro eventualni slave ; pin 10 - RB7 LIST P=PIC16F1708 ; typ procesoru, PRED include #include p16F1708.inc ; nacucne uvedeny file ; podivejte se, co je v nem ; najdeme ho v C:\Program Files (x86)\Microchip\MPLABX\v3.15\mpasmx 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 pocitatko: equ 0x20 org 0x0000 ; processor reset vector GOTO START ; go to beginning of program org 4 banksel PIR1 ; vsechny PIR ve stejne bance - strana 25 datasheetu btfsc PIR2,TMR4IF goto odcitace btfsc PIR1,SSP1IF goto odSPI goto $ ; sem to nikdy nesmi dolezt - fatalni chyba odcitace: bcf PIR2,TMR4IF banksel PORTB bcf PORTB,7 ; na zacatku vysilani nulujeme SS banksel pocitatko movf pocitatko,0 incf pocitatko banksel SSP1BUF movwf SSP1BUF retfie odSPI: bcf PIR1,SSP1IF banksel SSP1BUF movf SSP1BUF,0 ; a tady dal neco provest s prectenymi daty ; DATA PRESIST, I KDYZ JE K NICEMU NEPOTREBUJI banksel PORTB bsf PORTB,7 ; na konci vysilani SS do 1 retfie ; TODO ADD INTERRUPTS HERE IF USED START ; oscilator 0 1101 x 1x nechci PLL, 4MHz oscil., x, vnitrni oscilator ; 0110 1x1x 0x6a banksel INTCON clrf INTCON banksel ADCON0 movlw 0x6c ; 0110 1100 11011 = Reserved. No channel connected. movwf ADCON0 ; vypinam prevodnik banksel OSCCON movlw 0x6a ; 0110 1010 - 1101 pro delicku - 4MHz movwf OSCCON movlw 0 ; stredni frekvence movwf OSCTUNE banksel ANSELA clrf ANSELA clrf ANSELC clrf ANSELB banksel TRISA movlw 0xff movwf TRISA movwf TRISB movwf TRISC bcf TRISB,7 ; vystupni, CS pro ev. pripojeny slave ; v klidu 1, po dobu vysilani znaku po SPI 0 bcf TRISC,3 ; SDO bcf TRISC,7 ; SCK banksel PORTA ; klidove hodnoty pro SPI bsf PORTB,7 ; CS - v klidu v 1 bcf PORTC,3 ; SDO bcf PORTC,7 ; SCK BANKSEL PPSLOCK ; unlock sekvence movlw 0x55 movwf PPSLOCK movlw 0xAA movwf PPSLOCK bcf PPSLOCK,PPSLOCKED ; Set PPSLOCKED bit to disable writes banksel RC3PPS ; str 29 , pro output vse ve stejne bance movlw 0x12 ; 10010 = Rxy source is SDO movwf RC3PPS ; pin 7 SDO movlw 0x10 ; 10000 = Rxy source is SCK movwf RC7PPS ; pin 9 SCK vystup banksel SSPCLKPPS ; vis str. 29 - vstupy ve stejne bance movlw 0x17 ; Poznamka na strane 275 (ctete a chapejte !!!! ) movwf SSPCLKPPS ; vstup SCK movlw 0x16 ; SDI movwf SSPDATPPS BANKSEL PPSLOCK ; lock sekvence movlw 0x55 movwf PPSLOCK movlw 0xAA movwf PPSLOCK bsf PPSLOCK,PPSLOCKED ; Set PPSLOCKED bit to disable writes banksel T4CON ; 1 msec na preruseni, takze delim 1000 movlw .249 ; 4 v prescalleru, 250 v RP4 movwf PR4 ; 1 v PR4 znamena, ze delime 2 !!!!!!! Proto o 1 mene movlw 0x05 ; x000 0101 movwf T4CON banksel SSP1CON1 ; SSP1STAT 01xx xxxx movlw 0x40 movwf SSP1STAT ; SSP1CON1 0000 1010 movlw 0x0a movwf SSP1CON1 clrf SSP1CON3 movlw .42 ; doba vysilani znaku bude asi 1/3 periody citace TMR4 movwf SSP1ADD ; sami si vypoctete tohle cislo movf SSP1BUF , 0 ; precteme eventualni data movf SSP1BUF , 0 bcf SSP1CON1,SSPOV ; a clear-neme overflow bit nop nop bsf SSP1CON1 , SSPEN ; a tady to cele finalne zapiname banksel PIE2 bsf PIE2,TMR4IE bsf PIE1, SSP1IE ; registry PIE1 a IE2 jsou ve stejne bance banksel pocitatko clrf pocitatko bsf INTCON, PEIE bsf INTCON,GIE sem: nop nop nop goto sem END