/* * File: spi.c * Author: kubalik * * Created on 25. ledna 2016, 16:43 */ #include "p33EV32GM002.h" // je to v C:\Program Files (x86)\Microchip\xc16\v1.24\support\dsPIC33E\h // od radky 8852 je definovani tech TRIS // dale si udelejte CntrlF a hledejet ve file *.h // linker script najdeme v // C:\Program Files (x86)\Microchip\xc16\v1.25\support\dsPIC33E\gld /* nasledujici makra nastavuji oscilator * hledame v header file * * Macros for setting device configuration registers * pin OSC1 jako I/O pin * vypinaji Watchdog - opet se podivejte do header file, co vsecno se da nastavit * */ _FOSCSEL(FNOSC_FRC) _FOSC(OSCIOFNC_ON & IOL1WAY_OFF) _FWDT(FWDTEN_OFF) void send_to_SPI(unsigned int value); /* * */ int main() { TRISA = 0x0; // zapisujeme do celeho registru najednou TRISB = 0x00; PORTB = 0; PORTA = 0; ANSELB = 0; ANSELA = 0; /* TIMER T2 * T2CON 1X1- ---- -010 0-0- * | | ||| | | * | | ||| | internal clock - FRC oscil F je 7.37 / 2 * | | ||| T32 - mame 16bitoc\ve citace * | | ||| * | | |TCKPS 10 - delime 64 u preddelicky * | | TGATE je vypnuto * | TSIDLE pracujeme i v idle stavu - to je ted dost jedno * TON citac zapnut * * chceme periodu 0.5 sec - 2 Hz * do citace leze 7.37 / 2 = 3.685MHz = 3685000 Hz * na vystupu chceme 2 Hz, takye delime celkem 3685000 / 2 = 1842500 krat * tento delici pomer se posklada z delicky a vlastniho citace * delicka deli 64, na citac tedy zbyva 1842500 / 64 = 28346,15384 * do registru PR vlozime 28346 * */ PR2 = 28346; T2CON = 0xA020; SPI1STAT = 0x0000; // modul zatim nechavame vzpnuty SPI1CON1 = 0x0520; // 0000 0101 0010 0000 SPI1CON2 = 0 ; SPI1STATbits.SPIROV = 0; // 3. Clear the SPIROV bit (SPIxSTAT<6>). SPI1STATbits.SPIEN = 1; // 4. Enable SPI operation by setting the SPIEN bit (SPIxSTAT<15>). /* povoluji preruseni od citace */ IEC0bits.T2IE = 1; IEC0bits.SPI1IE=1; //povoleni preruseni od SPI1 /* globalni povoleni preruseni, tohle se musi povolit, * jinak nebude zadne preruseni krome TRAP */ INTCON2bits.GIE = 1; while (1) { asm(" btg PORTA, #0 "); asm(" btg PORTA, #1 "); asm(" btg PORTA, #2 "); } return 0; } void __attribute__((interrupt, auto_psv)) _T2Interrupt(void) { IFS0bits.T2IF = 0; send_to_SPI(0x1234); } void __attribute__((interrupt, auto_psv)) _SPI1Interrupt(void) { IFS0bits.SPI1IF = 0; /* a tady dal vsechno to, co se ma udelat po odvysilani znaku po SPI */ } void send_to_SPI(unsigned int value){ unsigned int a,cteni; a=value; cteni=SPI1BUF; //prectem at muzem vysiliat SPI1BUF=a; // 5. Write the data to be transmitted to the SPIxBUF register }