bosko lekovic
/
IO_board
IO plocana FRDM K64
ZeroCrossing/ZeroCrossing.cpp
- Committer:
- bosko001
- Date:
- 2021-04-30
- Revision:
- 16:a3085300cac3
- Parent:
- 11:f46528c56b8f
File content as of revision 16:a3085300cac3:
#include "ZeroCrossing.h" #include "mbed.h" #include "Pinovi.h" // extern DigitalOut ledB; // void ledOFF(void ){ ledB=1;}; void ledON(void) { ledB=0;} InterruptIn zc( ZC_PIN ); #define Dout(n) dout##n(PIN_OUT_##n, 1) DigitalOut Dout(6); DigitalOut Dout(5); DigitalOut Dout(4); DigitalOut Dout(3); DigitalOut Dout(2); DigitalOut Dout(1); #define Din(n) din##n(PIN_IN_##n, PullUp) DigitalIn Din(6); DigitalIn Din(5); DigitalIn Din(4); DigitalIn Din(3); DigitalIn Din(2); DigitalIn Din(1); /************************************************************************************************************************/ #define IB(b) b?0:1 //invert bita #define IB1(b) ~b void S_bitPortIn::portIn_refresh( ) { d0 = din1; d1 = din2; d2 = din3; d3 = din4; d4 = din5; d5 = din6; d6 = d7 = 0;} void S_bitPortOut::portOut_refresh( ) { dout1 = IB(d0); dout2 = IB(d1); dout3 = IB(d2); dout4 = IB(d3); dout5 = IB(d4); dout6 = IB(d5); } /************************************************************************************************************************/ #define ZCtimeMeasurement( mtime ) t.stop(); unsigned int frct = t.elapsed_time().count(); if( frct > frc ) mtime = frct - frc; frc = frct; t.start(); // aktivacija postpone funkcije, mora da postoji pospone vreme, da bi se timer aktivirao #define ATimer( atimer, atimerfun, atime) \ if( atime != 0 ) \ atimer.attach_us([this](){ atimerfun();}, atime ); /* iniciranje vremena izvrsenja postponovane funkcije. Ako je bilo vreme 0, stavla je timeONOFF/2 - po defaultu, u suprotnom stavice se vreme postone_toutONOFFtime, koje su int atributi klase, i inicijalno su 0 */ #define POSTPONtime_initiate( ONOFF) \ { \ if( postpone_tout##ONOFF##time == 0 ) postpone_tout##ONOFF( time##ONOFF/2 ); \ else postpone_tout##ONOFF( postpone_tout##ONOFF##time ); \ } C_zeroCrossing::C_zeroCrossing( C_data *pc_data) { this->pc_data = pc_data; int *p; p = (int*)0x4004B0C8; // digital filter width register PTC *p = *p | (10); // filter clocks number max 32 p = (int*)0x4004B0C4; // digital filter clock register PTC *p = *p | (0<<12); // 0 - bus clock 1 - lpo clock p = (int*)0x4004B0C0; // digital filter enable register of PTC *p = *p | (1<<12); // filter enabled on pin PTC12 // pasive filter jedino radi p = (int*)0x4004B030; // adresa control registra od PTC12 *p = *p | 0x10; // pasive filter enabled /* handleri uzlazne i silazne ivice interrupt-a zero crossinga */ zc.rise([this](){ ZCtimeMeasurement( timeOFF) ontime_toutONfun(); POSTPONtime_initiate(ON) inc_zcCounter();}); zc.fall([this](){ ZCtimeMeasurement( timeON) ontime_toutOFFfun(); POSTPONtime_initiate(OFF) inc_zcCounter(); }); // set_ontimeONfun( [](){ledOFF();} ); // set_ontimeOFFfun( [](){ledON();} ); // set_postponeONfun( ([]() { ledON(); }) ); // set_postponeOFFfun( []() { ledOFF(); } ); } void C_zeroCrossing::ontime_toutONfun( void) { if( p_ontime_toutONfun != nullptr) p_ontime_toutONfun(); else {/*ledOFF();*/} } void C_zeroCrossing::ontime_toutOFFfun(void) { if( p_ontime_toutOFFfun != nullptr) p_ontime_toutOFFfun(); else {/*ledON();*/} } // mora da postoji postone funkcija i postpone vreme da bi se funkcija izvrslia void C_zeroCrossing::postpone_toutONfun( void) { if( (p_postpone_toutONfun !=nullptr) ) p_postpone_toutONfun(); /*else*//*{ ATimer( toutON, ledOFF, 10000 );}*/} void C_zeroCrossing::postpone_toutOFFfun( void) { if( (p_postpone_toutOFFfun !=nullptr) )p_postpone_toutOFFfun(); /*else*//*{ ATimer( toutOFF, ledON, 100000 );}*/} void C_zeroCrossing::postpone_toutON( unsigned int tim ) { ATimer(toutON, postpone_toutONfun, tim ) } void C_zeroCrossing::postpone_toutOFF( unsigned int tim ) { ATimer(toutOFF, postpone_toutOFFfun, tim ) }