/* * File: citace.c * Author: kubalik * * Created on 11. 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) int i; /* i je globalni promenne, potrebujeme, aby si pamatovala svou hodnotu i v dobe, kdy se nevzkonava obsluha úreruseni */ /* * */ int main() { i = 0; /* sem si dejte breakpoint ! */ 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; /* povoluji preruseni */ IEC0bits.T2IE = 1; /* 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; } // takhle vypada definice interruptu void __attribute__((interrupt, auto_psv)) _T2Interrupt(void) { IFS0bits.T2IF = 0; /* shazujeme pozadavkovy bit */ asm(" bclr IFS0, #7 "); // nuluji bit pro preteceni citace i = !i; if (i) PORTB = 0xffff; else PORTB = 0; } /* zaviraci od podprogramu _T2Interrupt retfie prida prekladac sam, je to dano atributem interrupt */ void __attribute__((interrupt, shadow, auto_psv)) _blabol(void) { int i; i = 5; } /* preruseni _blabol nebude nikde v Interrupt Vector Table, protoze *.gld script tento nazev nezna * prekladac to klidne prelozi !!!!! * napise jenom nesmele warning: * warning: Invalid interrupt vector names for device '33EV32GM002' are: _blabol * * */ void __attribute__((interrupt, shadow, auto_psv)) _T3Interrupt(void) { IFS0bits.T3IF = 0; /* interrupt flag */ PORTAbits.RA3 = !PORTAbits.RA3; /* Blikame s LED2 1x za 5sec */ } /* preruseni muze mit mnoho dalsich atributu - shadow - auto_psv ........... ktere rikaji prekladaci, co a jak ma udelat v obsluznem programu - blize viz text * !!!!! preruseni _T3Interrupt nemame povoleno, tak samozrejme se nikdy nevola * na IVT se podivejte do View - Program Memory od adresz 000 do preruseni si dejte breakpoint a divejte se, co to dela */