#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 _CONFIG4(0x00FFFF ) _CONFIG3(0x00FFFF ) _CONFIG2(0x0098FF ) _CONFIG1(0x003F7F ) void main (void) { int i; typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD; i = 10; 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 = 0x72F5; /* xxxx 0010 1111 0101 - viz file porty.xls , d8le i pro ostatn9 tris RB15 chceme vzstupni - bude tam to PWM !!!!!! */ TRISC = 0xFFFF; /* tento port je nepouzitelny - 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 = 0xF4; /* 1111 0100 RF3 vystupni pro PWM */ TRISG = 0xFF7F; CNPU5 = 0x0001; CNPU4 = 0xC000; /* Pull-Up rezistory, ale fakt netusim jestli to pujde */ /* PWM chceme mit na pinu GPIO_10 RP16 pin 33 portF RF3 RPOR8 , dolnich 6 bitu viz porty.xls a pouziji pro to prvni Output compare - OC1 output function number je 18 - viz TABLE 11-4: SELECTABLE OUTPUT SOURCES RP16 je v registru RPOR8, tam je také RP17 - na tom nebude nic RPOR8 = 0000 0000 xx01 0010 */ // 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 */ RPOR8 = 0x0012 ; // 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 " ); /* T2CON 1xxx xxxx x000 0x0x poustime cicat TMR2 */ PR2 = 400; /* a tohle je perioda pro PWM */ T2CON = 0x8000; OC1CON1 = 0; OC1CON2 = 0; OC1RS = 350; /* konec duty cycle neco mezi OCR1 a PR2 */ OC1R = 10; /* zacatek duty cycle neco mezi 0 a PR2 hodnotu 0 to snese */ /* Select TMR2 as the synchronization source by writing 0x0c to the SYNCSEL<4:0> bits (OCxCON2<4:0>) and ‘0’ to the OCTRIG bit (OCxCON2<7>). - OCTRIG rika, ze to chceme synchronizovat, ne trigged OC1CON2 bbbb bbbb 0bb0 1100 pro Timer2 cosi s FAULT conditions , a nechci invertovat 0000 bbbb 0bb0 1100 - FAULT bity umozni hardwarově zrusit pulz PWM PWM Duty Cycle Least Significant bits a OC32 0000 0000 0bb0 1100 bitum 6 a 5 nerozumim 0000 0000 0000 1100 bit7 - OCTRIG - je to synchronized 6 TRIGSTAT 4 - 0 SYNCSEL - zdroj synchonizace - TMR2 */ OC1CON2 = 0x000C; // OC1CON2 = 0x0000; /* OC1CON1 Select a clock source by writing to the OCTSEL<2:0> bits (OCxCON<12:10>). xx00 00bb bbbb bbbb 000 = TMR2 clock Appropriate Fault inputs may be enabled by using the ENFLT<2:0> bits as described in Register 15-1. xx00 0000 0bbb bbbb bity 9 - 7 , FAULT disabled xx00 0000 0000 0bbb tohle je cosi s TRIGSTAT , bit 3 bity 4 - 6 jsou PWM Fault 2 (Comparator 1/2/3) Condition Status bit asi by se tady dalo poznat, co tomu je, ale FAULT mame disabled TRIGSTAT: Timer Trigger Status bit 1 = Timer source has been triggered and is running 0 = Timer source has not been triggered and is being held clear takye nastavit do 1 ?????? */ OC1CON1 = 0; /* zdroj hodin je TMR2 */ /* a uplne na konci navod rika Select the desired PWM mode with the OCM<2:0> bits (OCxCON1<2:0>). */ OC1CON1bits.OCM = 7; /* This selects the centre Aligned PWM mode*/ IEC0 = 0; /* povoluji preruseni od TMR2 a OC1 */ IEC0bits.T2IE = 1; IEC0bits.OC1IE = 1; while(1) { /* tohle je residuum z jineho proghramu, muze tu byt cokoli 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.RD4 = PORTEbits.RE4 ; PORTDbits.RD5 = _RE5 ; _RD6 = PORTEbits.RE6 ; _RD7 = _RE4 ; } /* od while */ } // zaviraci zavorka od main void __attribute__((interrupt)) _T2Interrupt(void) { IFS0bits.T2IF = 0; /* shazujeme pozadavkovy bit dejte si sem breakpoint a podivejte se, jak dlouho trva perioda */ } /* zaviraci od podprogramu _T2Interrupt retfie prida prekladac sam, je to dano atributem interrupt */ void __attribute__((interrupt)) _OC1Interrupt(void) { IFS0bits.OC1IF = 0; /* shazujeme pozadavkovy bit dejte si sem breakpoint a podivejte se, jak dlouho trva perioda */ } /* zaviraci od interuptu pro spravnou syntaxi _OC1Interrupt a dalsich se podivejte do *.gld file !!!!!!!!!!! povolovaci a pozadavkovy registr pro jiny modul Output Compare - OC2, OC3, ..... NEBUDE IFS0 , IEC0 , najdete si to v datasheetu !!!!!!!!! */