#include "p24FJ128GA306.h" // uvozovky znamenaji aktualni adresar, <> adresar tam nekde - proste ten jeho // my ted stdio ani string k nicemu nepotrebujeme, takze tady neni // zatim tady nejsou zadne fuses, takze vsechno je default // zejmena : FRC oscilator, Watchdog enabled - !!!!! Musi se vypnout v UP /* 0.6 sec trva 1 preruseni .. 17MHz je Tcy 34MHz je Fosc PLL je 4x 34 / 4 = 8.5MHz, to odpovida tomu krystalu !!!! */ _CONFIG4(0x00FFFF ) _CONFIG3(0x00FFFF ) // _CONFIG2(0x0098FF ) int FRC osc // _CONFIG2(0x0099FF ) /fungovalo * int FRC osc with postscaller and PLL */ _CONFIG2(0x009bfe ) /* funguje primary osc HS with PLL 8 x 4 = 32MHz */ _CONFIG1(0x003F7F ) typedef struct { unsigned B0:1; unsigned B1:1; unsigned B2:1; unsigned B3:1; unsigned B4:1; unsigned B5:1; unsigned B6:1; unsigned B7:1; unsigned B8:1; unsigned B9:1; unsigned B10:1; unsigned B11:1; unsigned B12:1; unsigned B13:1; unsigned B14:1; unsigned B15:1; } BITY; BITY ridreg1; #define FLGTMR5 ridreg1.B0; // BIT1 je STAV_RS pro display !!!!!! NEOBZASOVAT A NEHYBAT S TIM unsigned int pocitms = 0 ; unsigned char led1; void main (void) { int i; typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; i = 10; /* chceme blikat s diodou LED1 v intervalu 1sec použijem TMR1 4000000 / 1 = 4000000 , tímto číselm musíme dělit. Zkusíme dát děličku na 256 4000000 / 256 = 15625, tohle číslo dáme do PR1 */ // PR2 = 15625; PR2 = 40000; TMR2 = 0; T2CON = 0x8030 ; /* 1x0x xxxx x011 xx0x */ inicializace() ; /* volano z p24FJ128_init.h */ /* povoluji preruseni */ IEC0bits.T2IE = 1; inidisp(); pisdata('N'); pisdata('a'); pisdata('z'); pisdata('d'); pisdata('a'); pisdata('r'); pisdata(' '); pisdata('T'); pisdata('o'); pisdata('m'); pisdata('a'); pisdata('s'); pisdata('i'); while(1) { /* tady budeme kopirovat stav tlacitek na LED syntaxe pro jeden bit portu: PORTBbits.RB5 a podobne najdeme to v header file, zhruba od radku 8065 lze pouyit synaxi PORTBbits.RB5 i _RB5 - podivejte se na to do p24FJ128GA306.h LEd jsou na porteg RD4, RD5, RD6, RD7 tlacitka na pinech RE4 RE5 RE6 */ PORTDbits.RD5 = 1 ; cekejms(1000); OC7RS = 100; /* 1/16 vykonu */ cekmikros(10000); PORTDbits.RD5 = 0 ; cekejms(1000); OC7RS = 12000; /* 3/4 , maximum je 16000 */ _RD6 = PORTEbits.RE6 ; cekejms(0); _RD7 = _RE4 ; } /* od while */ } // zaviraci zavorka od main void __attribute__((interrupt)) _T2Interrupt(void) { IFS0bits.T2IF = 0; /* shazujeme pozadavkovy bit */ if( led1 ) led1 = 0; else led1 = 1; if( led1) PORTDbits.RD4 = 1 ; else PORTDbits.RD4 = 0 ; /* Blikame s LED1 1x ya 1 sec */ } void pockej ( void ) { unsigned int i; int j; for(j=0;j<21;j++) { for(i=0; i<36272; i++) { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } } } /* od main */ void inicializace(void ) { // 32MHz / 2 = 16MHz // TMR5 ma vyrabet 1 ms preruseni 16000 x musime delit PR5 = 16000; TMR5 = 0; T5CON = 0x8000 ; /* 1x0x xxxx x000 xx0x delime 1 */ ridreg1.B0 = 0; ridreg1.B1 = 0; ridreg1.B2 = 0; ridreg1.B3 = 0; ridreg1.B4 = 0; ridreg1.B5 = 0; ridreg1.B6 = 0; ridreg1.B7 = 0; ridreg1.B8 = 0; ridreg1.B9 = 0; ridreg1.B10 = 0; ridreg1.B11 = 0; ridreg1.B12 = 0; ridreg1.B13 = 0; ridreg1.B14 = 0; ridreg1.B15 = 0; ODCB = 0; ODCC = 0; ODCD = 0; ODCE = 0; ODCF = 0; ODCG = 0; /* ona je tam defaultne 0, takze je to trochu nadbytecne porty NEBUDOU se otevrenym kolektorem */ PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; PORTF = 0; PORTG = 0; /* az dame nektery pin vystupni, aby bylo jasne, jaka hodnota tam bude */ ANSB = 0x0004; /* 0000 0000 0000 0100 */ /* vstup pro prevodnik je analogovy */ TRISB = 0xF2F5; /* xxxx 0010 1111 0101 - viz file porty.xls , d8le i pro ostatn9 tris */ TRISC = 0xFFFF; /* tento port je nepouyitelny - krystaly */ TRISD = 0xFF0F; /* 1111 xxxx 0000 111x piny 15 - 12 tam nejsou, ale do registru neco zapsat musime a bity 3 -1 jsou zatim s otaznikem, ale nastavenim jako vstup nic nezkayime */ TRISE = 0xF0; /* odvodte si zami */ TRISF = 0xFC; TRISG = 0xFF7F; CNPU5 = 0x0001; CNPU4 = 0xC000; /* Pull-Up rezistory, ale fakt netusim jestli to pujde */ /* JAS LEd displeje - podsviceni LCD_JAS RP19/RG8 budeme ho regulovat pomocí OC7 cislo OC7 pro PPS je 24 dec to je 18 hex RP19 je v registru RPOR9, horní bity 0x18XX */ // Unlock Registers asm volatile ( " MOV #OSCCON, w1 \n" "MOV #0x46, w2 \n" "MOV #0x57, w3 \n" "MOV.b w2, [w1] \n" "MOV.b w3, [w1] \n" "BCLR OSCCON, #6 " ) ; /* vlastni nastaveni Peripheral pin select */ RPOR9 = 0x1800 ; // Lock Registers asm volatile ( " MOV #OSCCON, w1 \n" "MOV #0x46, w2 \n" "MOV #0x57, w3 \n" "MOV.b w2, [w1] \n" "MOV.b w3, [w1] \n" "BSET OSCCON, #6 " ); OC7CON1 = 0; OC7CON2 = 0; OC7RS = 2; /* konec duty cycle neco mezi OCR1 a PR5 = 16000 */ OC7R = 1; /* zacatek duty cycle neco mezi 0 a PR5 hodnotu 0 to snese */ /* 01111 = Timer5 4 - 0 SYNCSEL - zdroj synchonizace */ OC7CON2 = 0x000F; /* bit 12-10 OCTSEL<2:0>: Output Compare x Timer Select bits zdroj hodin je TMR5 */ /* 011 = Timer5 0000 1100 0000 0000 */ OC7CON1 = 0x0c00; OC7CON1bits.OCM = 7; /* This selects the centre Aligned PWM mode*/ /* povoluji preruseni */ IEC1bits.T5IE = 1; } /* of inicializace */ /* ********************************************** ceka po dobu (kolik +1) milisekund tedy cekejms(0) ceka 1 ms ??? mozna problem, pokud by se vyskytnul interrupt s dobou provadeni delsi nez 1 ms */ void cekejms( unsigned int kolik ) { TMR5 = 0; pocitms = kolik; ridreg1.B0 = 1; while( ridreg1.B0 ) asm("NOP" ); } // ****************************************************** void __attribute__((interrupt(save(WREG0,WREG1)))) _T5Interrupt(void) { IFS1bits.T5IF = 0; /* shazujeme pozadavkovy bit */ if(ridreg1.B0 && pocitms ) pocitms-- ; else ridreg1.B0 = 0; } // ************************************************